X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2F_infotojson%2Finfotojson.c;fp=tools%2F_infotojson%2Finfotojson.c;h=dd90dc2afaec3510c6ee1cfcd7fd3037b3f7b57c;hp=0000000000000000000000000000000000000000;hb=f51dd128c16fd6c654bdfbdcb19204bf9a867fe5;hpb=30d3e635ecef7961777a1aa98b1bde23712d6547;ds=sidebyside diff --git a/tools/_infotojson/infotojson.c b/tools/_infotojson/infotojson.c new file mode 100644 index 00000000..dd90dc2a --- /dev/null +++ b/tools/_infotojson/infotojson.c @@ -0,0 +1,214 @@ +/* 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) +{ + struct json *jsonobj; + unsigned int modulename; + + 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; + + 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->title = infofile[0]; + jsonobj->desc = &infofile[1]; + + return jsonobj; +} + +/*extracting title and description from _info.c files*/ +char **extractinfo(char **file) +{ + char **infofile = NULL; + unsigned int count = 0, j = 0, size = 0; + bool printing = false; + + while(file[size++]); + infofile = (char **) palloc(size * sizeof(char *)); + + for (j = 0; j < size - 1; j++) { + if (streq(file[j], "/**")) { + printing = true; + } + else if (streq(file[j], " */")) + printing = false; + else if (printing) { + if (strstarts(file[j], " * ")) + infofile[count++] = file[j] + 3; + else if (strstarts(file[j], " *")) + infofile[count++] = file[j] + 2; + else { + printf("Error in comments structure\n%d",j); + exit(1); + } + } + } + infofile[count] = NULL; + return infofile; +} + +/*storing json structure to json file*/ +int storejsontofile(struct json *jsonobj, 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,"\"Description\":[\n"); + while(jsonobj->desc[j++]) + fprintf(fp,"{\n\"str\":\"%s\"\n},\n",jsonobj->desc[j - 1]); + fprintf(fp,"]\n"); + fclose(fp); + return 1; + +} + +/*storing json structure to db*/ +int storejsontodb(struct json *jsonobj, char *db) +{ + char *cmd, *query; + sqlite3 *handle; + char *errstr; + struct db_query *q; + + handle = db_open(db); + + query = aprintf("SELECT module 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, combinedesc(jsonobj->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); + + db_command(handle, cmd); + db_close(handle); + return 1; +} + +int main(int argc, char *argv[]) +{ + char *file; + char **lines; + char **infofile; + + struct json *jsonobj = NULL; + + if(argc < 4) { + printf("usage: infotojson infofile jsonfile author sqlitedb\n"); + return 1; + } + + file = grab_file(NULL, argv[1]); + if (!file) + err(1, "Reading file %s", argv[1]); + + lines = split(file); + + //extract info from lines + infofile = extractinfo(lines); + + //create json obj + jsonobj = createjson(infofile, argv[3]); + + //store to file + storejsontofile(jsonobj, argv[2]); + + if(argv[4] != NULL) + storejsontodb(jsonobj, argv[4]); + + talloc_free(file); + return 0; +}