| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- /* 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;
- }
|