X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2F_infotojson%2Finfotojson.c;h=f1493cba337cd5222c77c7fb882217e31e709e41;hp=dd90dc2afaec3510c6ee1cfcd7fd3037b3f7b57c;hb=338b91f5d9f391a29f43568872e4406438ff2af8;hpb=f51dd128c16fd6c654bdfbdcb19204bf9a867fe5 diff --git a/tools/_infotojson/infotojson.c b/tools/_infotojson/infotojson.c index dd90dc2a..f1493cba 100644 --- a/tools/_infotojson/infotojson.c +++ b/tools/_infotojson/infotojson.c @@ -1,120 +1,47 @@ /* This extract info from _info.c and create json file and also optionally store to db */ #include "infotojson.h" -/* Is A == B ? */ -#define streq(a,b) (strcmp((a),(b)) == 0) - -/* Does A start with B ? */ -#define strstarts(a,b) (strncmp((a),(b),strlen(b)) == 0) - -/* 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; -} - -/* This is a dumb one which copies. We could mangle instead. */ -static char **split(const char *text) -{ - char **lines = NULL; - unsigned int max = 64, num = 0; - - lines = talloc_array(text, char *, max+1); - - while (*text != '\0') { - unsigned int len = strcspn(text, "\n"); - lines[num] = talloc_array(lines, char, len + 1); - memcpy(lines[num], text, len); - lines[num][len] = '\0'; - text += len + 1; - if (++num == max) - lines = talloc_realloc(text, lines, char *, max*=2 + 1); - } - lines[num] = NULL; - return lines; -} - -/*combin desc into an array to write to db*/ -static char *combinedesc(char **desc) -{ - unsigned int i = 0, size = 0;; - char *combine; - - for(i = 0; desc[i]; i++) - size += strlen(desc[i]); - - combine = (char *)palloc((size + i)* sizeof(char)); - strcpy(combine, desc[0]); - - for(i = 1; desc[i]; i++) { - strcat(combine, "\n"); - strcat(combine, desc[i]); - } - strreplace(combine,'\'',' '); - return combine; -} - /*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; } @@ -126,7 +53,7 @@ char **extractinfo(char **file) 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); } } @@ -136,45 +63,57 @@ char **extractinfo(char **file) } /*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 from search where module=\"%s\";", jsonobj->module); q = db_query(handle, query); + + desc = strjoin(NULL, jsonobj->desc,"\n"); + strreplace(desc, '\'', ' '); + + depends = strjoin(NULL, jsonobj->depends,"\n"); if (!q->num_rows) - cmd = aprintf("INSERT INTO search VALUES(\"%s\",\"%s\",\"%s\",'%s\');", - jsonobj->module, jsonobj->author, jsonobj->title, combinedesc(jsonobj->desc)); + cmd = talloc_asprintf(NULL, "INSERT INTO search VALUES(\"%s\",\"%s\",\"%s\", \'%s\', \'%s\', 0);", + jsonobj->module, jsonobj->author, jsonobj->title, depends, desc); else - cmd = aprintf("UPDATE search set author=\"%s\", title=\"%s\", desc='%s\' where module=\"%s\";", - jsonobj->author, jsonobj->title, combinedesc(jsonobj->desc), jsonobj->module); - + 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); + db_command(handle, cmd); db_close(handle); + talloc_free(depends); + talloc_free(query); + talloc_free(desc); + talloc_free(cmd); return 1; } @@ -183,32 +122,34 @@ int main(int argc, char *argv[]) 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]); if (!file) - err(1, "Reading file %s", argv[1]); + err(1, "Reading file %s", argv[2]); - lines = split(file); + lines = strsplit(NULL, file, "\n", NULL); //extract info from lines 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; }