/* This extract info from _info.c and create json file and also optionally store to db */
#include "infotojson.h"
-/* This version adds one byte (for nul term) */
-static void *grab_file(void *ctx, const char *filename)
-{
- unsigned int max = 16384, size = 0;
- int ret, fd;
- char *buffer;
-
- if (streq(filename, "-"))
- fd = dup(STDIN_FILENO);
- else
- fd = open(filename, O_RDONLY, 0);
-
- if (fd < 0)
- return NULL;
-
- buffer = talloc_array(ctx, char, max+1);
- while ((ret = read(fd, buffer + size, max - size)) > 0) {
- size += ret;
- if (size == max)
- buffer = talloc_realloc(ctx, buffer, char, max*=2 + 1);
- }
- if (ret < 0) {
- talloc_free(buffer);
- buffer = NULL;
- } else
- buffer[size] = '\0';
- close(fd);
- return buffer;
-}
-
/*creating json structure for storing to file/db*/
-struct json * createjson(char **infofile, char *author)
+static struct json *createjson(char **infofile, const char *author, const char *directory)
{
struct json *jsonobj;
unsigned int modulename;
- if(infofile == NULL || author == NULL) {
+ if (infofile == NULL || author == NULL) {
printf("Error Author or Info file is NULL\n");
exit(1);
}
- jsonobj = (struct json *)palloc(sizeof(struct json));
-
- jsonobj->author = author;
+ jsonobj = talloc(NULL, struct json);
+ if (!jsonobj)
+ errx(1, "talloc error");
+
+ jsonobj->author = talloc_strdup(jsonobj, author);
+ /* First line should be module name and short description */
modulename = strchr(infofile[0], '-') - infofile[0];
- jsonobj->module = (char *)palloc(sizeof(char) * (modulename - 1));
- strncpy(jsonobj->module, infofile[0], modulename - 1);
- jsonobj->module[modulename - 1] = '\0';
-
+
+ jsonobj->module = talloc_strndup(jsonobj, infofile[0], modulename - 1);
+ if (!jsonobj->module)
+ errx(1, "talloc error");
+
jsonobj->title = infofile[0];
jsonobj->desc = &infofile[1];
-
+ jsonobj->depends = get_deps(jsonobj, directory);
return jsonobj;
}
/*extracting title and description from _info.c files*/
-char **extractinfo(char **file)
+static char **extractinfo(char **file)
{
- char **infofile = NULL;
- unsigned int count = 0, j = 0, size = 0;
+ char **infofile;
+ unsigned int count = 0, j = 0, num_lines = 0;
bool printing = false;
- while(file[size++]);
- infofile = (char **) palloc(size * sizeof(char *));
+ while (file[num_lines++]);
+ infofile = talloc_array(NULL, char *, num_lines);
- for (j = 0; j < size - 1; j++) {
+ for (j = 0; j < num_lines - 1; j++) {
if (streq(file[j], "/**")) {
printing = true;
}
else if (strstarts(file[j], " *"))
infofile[count++] = file[j] + 2;
else {
- printf("Error in comments structure\n%d",j);
+ err(1,"Error in comments structure\n%d",j);
exit(1);
}
}
}
/*storing json structure to json file*/
-int storejsontofile(struct json *jsonobj, char *file)
+static int storejsontofile(const struct json *jsonobj, const char *file)
{
FILE *fp;
unsigned int j = 0;
fp = fopen(file, "wt");
-
fprintf(fp,"\"Module\":\"%s\",\n",jsonobj->module);
fprintf(fp,"\"Title\":\"%s\",\n",jsonobj->title);
fprintf(fp,"\"Author\":\"%s\",\n",jsonobj->author);
+
+ fprintf(fp,"\"Dependencies\":[\n");
+ for (j = 0; jsonobj->depends[j]; j++)
+ fprintf(fp,"{\n\"depends\":\"%s\"\n},\n",jsonobj->depends[j]);
+ fprintf(fp,"]\n");
+
+
fprintf(fp,"\"Description\":[\n");
- while(jsonobj->desc[j++])
- fprintf(fp,"{\n\"str\":\"%s\"\n},\n",jsonobj->desc[j - 1]);
+ for (j = 0; jsonobj->desc[j]; j++)
+ fprintf(fp,"{\n\"str\":\"%s\"\n},\n",jsonobj->desc[j]);
fprintf(fp,"]\n");
fclose(fp);
return 1;
-
}
/*storing json structure to db*/
-int storejsontodb(struct json *jsonobj, char *db)
+static int storejsontodb(const struct json *jsonobj, const char *db)
{
- char *cmd, *query;
+ char *cmd, *query, *desc, *depends;
sqlite3 *handle;
- char *errstr;
struct db_query *q;
handle = db_open(db);
-
- query = aprintf("SELECT module from search where module=\"%s\";", jsonobj->module);
+ query = talloc_asprintf(NULL, "SELECT module, author from search where module=\"%s\";", jsonobj->module);
q = db_query(handle, query);
- if (!q->num_rows)
- cmd = aprintf("INSERT INTO search VALUES(\"%s\",\"%s\",\"%s\",'%s\');",
- jsonobj->module, jsonobj->author, jsonobj->title, strjoin(NULL,jsonobj->desc,"\n"));
- else
- cmd = aprintf("UPDATE search set author=\"%s\", title=\"%s\", desc='%s\' where module=\"%s\";",
- jsonobj->author, jsonobj->title, strjoin(NULL,jsonobj->desc,"\n"), jsonobj->module);
+ desc = strjoin(NULL, jsonobj->desc,"\n");
+ strreplace(desc, '\'', ' ');
+
+ depends = strjoin(NULL, jsonobj->depends,"\n");
+ if (q->num_rows && streq(jsonobj->author, q->rows[0][1]))
+ cmd = talloc_asprintf(NULL, "UPDATE search set author=\"%s\", title=\"%s\", desc=\'%s\' depends=\'%s\' where module=\"%s\";",
+ jsonobj->author, jsonobj->title, desc, depends, jsonobj->module);
+ else if (!q->num_rows)
+ cmd = talloc_asprintf(NULL, "INSERT INTO search VALUES(\"%s\",\"%s\",\"%s\", \'%s\', \'%s\', 0);",
+ jsonobj->module, jsonobj->author, jsonobj->title, depends, desc);
+ else
+ cmd = talloc_asprintf(NULL, "INSERT INTO search VALUES(\"%s-%s\",\"%s\",\"%s\", \'%s\', \'%s\', 0);",
+ jsonobj->module, jsonobj->author, jsonobj->author, jsonobj->title, depends, desc);
+
db_command(handle, cmd);
db_close(handle);
+ talloc_free(depends);
+ talloc_free(query);
+ talloc_free(desc);
+ talloc_free(cmd);
return 1;
}
char *file;
char **lines;
char **infofile;
+ struct json *jsonobj;
- struct json *jsonobj = NULL;
-
- if(argc < 4) {
- printf("usage: infotojson infofile jsonfile author sqlitedb\n");
- return 1;
- }
+ talloc_enable_leak_report();
+ if (argc < 5)
+ errx(1, "usage: infotojson dir_of_module info_filename target_json_file author [sqlitedb]\n"
+ "Convert _info.c file to json file and optionally store to database");
- file = grab_file(NULL, argv[1]);
+ file = grab_file(NULL, argv[2], NULL);
if (!file)
- err(1, "Reading file %s", argv[1]);
+ err(1, "Reading file %s", argv[2]);
lines = strsplit(NULL, file, "\n", NULL);
infofile = extractinfo(lines);
//create json obj
- jsonobj = createjson(infofile, argv[3]);
+ jsonobj = createjson(infofile, argv[4], argv[1]);
//store to file
- storejsontofile(jsonobj, argv[2]);
+ storejsontofile(jsonobj, argv[3]);
- if(argv[4] != NULL)
- storejsontodb(jsonobj, argv[4]);
+ if (argv[5] != NULL)
+ storejsontodb(jsonobj, argv[5]);
talloc_free(file);
+ talloc_free(jsonobj);
+ talloc_free(lines);
+ talloc_free(infofile);
return 0;
}