]> git.ozlabs.org Git - ccan/blobdiff - tools/_infotojson/infotojson.c
test case for grab_file
[ccan] / tools / _infotojson / infotojson.c
index e169fe17c953051c863650310d6c657067a0dfc2..f1493cba337cd5222c77c7fb882217e31e709e41 100644 (file)
@@ -1,73 +1,47 @@
 /* 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;
                } 
@@ -79,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);
                        }
                }
@@ -89,44 +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;
        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, strjoin(NULL,jsonobj->desc,"\n"));
+               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, strjoin(NULL,jsonobj->desc,"\n"), 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;
 }
 
@@ -135,17 +122,16 @@ 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 = strsplit(NULL, file, "\n", NULL);               
        
@@ -153,14 +139,17 @@ int main(int argc, char *argv[])
        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;
 }