#include <stdio.h>#include <stdlib.h>#include <string.h>#ifndef WORGLITE#include <sqlite3.h>#endif#include "parg.h"#include "worgle.h"#include "worgle_private.h"#ifndef WORGLITE#include "db.h"#endif static int use_debug = 0;static int use_warnings = 0;static int map_source_code = 0;static char *map_filename = NULL;#ifndef WORGLITEstatic int generate_db = 0;static char *db_filename = NULL;#endifstatic int tangle_code = 1;enum {MODE_ORG,MODE_BEGINCODE,MODE_CODE};enum {ORGLET_HEADER,ORGLET_CONTENT,ORGLET_BLKREF,ORGLET_UNKNOWN};static int loadfile(worgle_d *worg, int file);static int parse_name(char *line, size_t len, worgle_string *str);#ifndef WORGLITEstatic int parse_header(worgle_d *worg, char *line, size_t len);#endifstatic int parse_begin(char *line, size_t len, worgle_string *str);static int check_for_reference(char *line , size_t size, worgle_string *str);static int worgle_getline(char *fullbuf, char **line, size_t *pos, size_t *line_size, size_t buf_size);static void append_filename(worgle_d *worg, char *filename);#ifndef WORGLITEstatic void tangle_to_db(worgle_d *worg);#endifstatic int loadfile(worgle_d *worg, int file){ FILE *fp; char *filename; worgle_textbuf *txt; size_t size; char *buf; txt = &worg->buffers[file]; filename = txt->filename.str; fp = fopen(filename, "r"); if(fp == NULL) { fprintf(stderr, "Could not find file %s\n", filename); return 1; } fseek(fp, 0, SEEK_END); size = ftell(fp); buf = calloc(1, size); worgle_textbuf_init(&worg->buffers[file], buf, size); fseek(fp, 0, SEEK_SET); fread(buf, size, 1, fp); fclose(fp); return 1;}int parse_file(worgle_d *worg, int file){ char *buf; size_t size; worgle_textbuf *curbuf; worgle_string str; char *line; size_t pos; size_t read; int mode; int rc; int status; curbuf = &worg->buffers[file]; buf = curbuf->buf; size = curbuf->size; worg->curbuf = curbuf;#ifndef WORGLITE worg->curorg = &worg->orgs[file]; if (file > 0) { worg->curorg->prev = &worg->orgs[file - 1]; } else { worg->curorg->prev = NULL; }#endif worgle_string_init(&str); line = NULL; pos = 0; mode = MODE_ORG; rc = 0; status = 0; worg->linum = 0; while (1) { worg->linum++; status = worgle_getline(buf, &line, &pos, &read, size); if(!status) break; if(mode == MODE_ORG) { #ifndef WORGLITE if (generate_db) { if (read >= 2) { if (parse_header(worg, line, read)) { continue; } } } #endif if(read >= 7) { if(!strncmp(line, "#+NAME", 6)) { #ifndef WORGLITE if (generate_db) { worgle_orgfile_append_content(worg, &worg->segblock); worgle_string_reset(&worg->segblock); } #endif if(line[6] != ':') { fprintf(stderr, "line %lu: expected ':'\n", worg->linum); rc = 1; break; } mode = MODE_BEGINCODE; parse_name(line, read, &str); worgle_begin_block(worg, &str); #ifndef WORGLITE continue; #endif } } #ifndef WORGLITE if (generate_db) { #ifndef WORGLITE if (worg->new_content) { worg->new_content = 0; worgle_string_reset(&worg->segblock); worg->segblock.str = line; } worg->segblock.size += read; #endif } #endif } else if(mode == MODE_CODE) { if(read >= 9) { if(!strncmp(line, "#+END_SRC", 9)) { mode = MODE_ORG; worg->block_started = 0; worgle_append_string(worg); #ifndef WORGLITE worg->new_content = 1; #endif continue; } } if(check_for_reference(line, read, &str)) { worgle_append_string(worg); worgle_append_reference(worg, &str); worg->block_started = 1; worgle_string_reset(&worg->block); continue; } worg->block.size += read; if(worg->block_started) { worg->block.str = line; worg->block_started = 0; worg->curline = worg->linum; } } else if(mode == MODE_BEGINCODE) { if (read >= 11) { if(!strncmp (line, "#+BEGIN_SRC",11)) { mode = MODE_CODE; worg->block_started = 1; worgle_string_reset(&worg->block); if (parse_begin(line, read, &str) == 2) { worgle_append_file(worg, &str); } continue; } else { fwrite(line, read, 1, stderr); fprintf(stderr, "line %lu: Expected #+BEGIN_SRC\n", worg->linum); rc = 1; break; } } fprintf(stderr, "line %lu: Expected #+BEGIN_SRC\n", worg->linum); rc = 1; } } return rc;}static int parse_name(char *line, size_t len, worgle_string *str){ size_t n; size_t pos; int mode; line+=7; len-=7; /* *namelen = 0; */ str->size = 0; str->str = NULL; if(len <= 0) return 1; pos = 0; mode = 0; for(n = 0; n < len; n++) { if(mode == 2) break; switch(mode) { case 0: if(line[n] == ' ') { } else { str->str = &line[n]; str->size++; pos++; mode = 1; } break; case 1: if(line[n] == 0xa) { mode = 2; break; } pos++; str->size++; break; default: break; } } /* *namelen = pos; */ return 1;}void worgle_begin_block(worgle_d *worg, worgle_string *name){ worg->curblock = worgle_hashmap_get(&worg->dict, name); if (worgle_block_id_get(worg->curblock) == 0) { worgle_block_id_set(worg->curblock, worgle_uuid_new(worg)); } worg->curblock->nblocks++;#ifndef WORGLITE worgle_orgfile_append_reference(worg, worg->curblock);#endif}#ifndef WORGLITEstatic int parse_header(worgle_d *worg, char *line, size_t len){ int mode; int rc; size_t s; char *header; worgle_string str; int lvl; mode = 0; if(line[0] != '*') return 0; rc = 0; worgle_string_init(&str); lvl = 1; for (s = 1; s < len; s++) { if (mode == 2) break; switch (mode) { case 0: if (line[s] == '*') { lvl++; } else if (line[s] == ' '){ mode = 1; } else { mode = 2; rc = 0; } break; case 1: rc = 1; mode = 2; header = &line[s]; str.str = header; str.size = len - s; str.size -= line[len - 1] == '\n'; worgle_orgfile_append_content(worg, &worg->segblock); worgle_string_reset(&worg->segblock); worgle_orgfile_append_header(worg, &str, lvl); worg->new_content = 1; break; } } return rc;}#endifstatic int parse_begin(char *line, size_t len, worgle_string *str){ size_t n; int mode; int rc; line += 11; len -= 11; if(len <= 0) return 0; mode = 0; n = 0; rc = 1; str->str = NULL; str->size = 0; while(n < len) { switch(mode) { case 0: /* initial spaces after BEGIN_SRC */ if(line[n] == ' ') { n++; } else { mode = 1; } break; case 1: /* look for :tangle */ if(line[n] == ' ') { mode = 0; n++; } else { if(line[n] == ':') { if(!strncmp(line + n + 1, "tangle", 6)) { n+=7; mode = 2; rc = 2; } } n++; } break; case 2: /* save file name, spaces after tangle */ if(line[n] != ' ') { str->str = &line[n]; str->size++; mode = 3; } n++; break; case 3: /* read up to next space or line break */ if(line[n] == ' ' || line[n] == '\n') { mode = 4; } else { str->size++; } n++; break; case 4: /* countdown til end */ n++; break; } } return rc;}void worgle_append_file(worgle_d *worg, worgle_string *filename){ worgle_file *f; f = worgle_filelist_append(&worg->flist, filename, worg->curblock); worgle_file_id_set(f, worgle_uuid_new(worg));}void worgle_append_string(worgle_d *worg){ worgle_segment *seg; if(worg->curblock == NULL) return; if(worg->curline < 0) return; seg = worgle_block_append_string(worg->curblock, &worg->block, worg->curline, &worg->curbuf->filename); worgle_segment_id_set(seg, worgle_uuid_new(worg)); worg->curblock->last_seg = seg->id;}void worgle_append_reference(worgle_d *worg, worgle_string *ref){ worgle_segment *seg; if(worg->curblock == NULL) return; seg = worgle_block_append_reference(worg->curblock, ref, worg->linum, &worg->curbuf->filename); worgle_segment_id_set(seg, worgle_uuid_new(worg)); worg->curblock->last_seg = seg->id;}static int check_for_reference(char *line , size_t size, worgle_string *str){ int mode; size_t n; mode = 0; str->size = 0; str->str = NULL; for(n = 0; n < size; n++) { if(mode < 0) break; switch(mode) { case 0: /* spaces */ if(line[n] == ' ') continue; else if(line[n] == '<') mode = 1; else mode = -1; break; case 1: /* second < */ if(line[n] == '<') mode = 2; else mode = -1; break; case 2: /* word setup */ str->str = &line[n]; str->size++; mode = 3; break; case 3: /* the word */ if(line[n] == '>') { mode = 4; break; } str->size++; break; case 4: /* last > */ if(line[n] == '>') mode = 5; else mode = -1; break; } } return (mode == 5);}static int worgle_getline(char *fullbuf, char **line, size_t *pos, size_t *line_size, size_t buf_size){ size_t p; size_t s; *line_size = 0; p = *pos; *line = &fullbuf[p]; s = 0; while(1) { s++; if(p >= buf_size) return 0; if(fullbuf[p] == '\n') { *pos = p + 1; *line_size = s; return 1; } p++; }}int worgle_generate(worgle_d *worg){ return worgle_filelist_write(&worg->flist, &worg->dict);}void worgle_init(worgle_d *worg){worgle_string_init(&worg->block);#ifndef WORGLITEworgle_string_init(&worg->segblock);#endifworg->curline = -1;worg->block_started = 0;#ifndef WORGLITEworg->new_content = 1;#endifworgle_hashmap_init(&worg->dict);worgle_filelist_init(&worg->flist);worg->curbuf = NULL;worg->buffers = NULL;worg->nbuffers = 0;worg->curblock = NULL;worg->linum = 0;worg->orgs = NULL;worg->curorg = NULL;worg->prog = 0;worg->UUID_count = 1;}void worgle_free(worgle_d *worg)Lines 1–500 of 1230. Load more
#include <stdio.h> #include <stdlib.h> #include <string.h> #ifndef WORGLITE #include <sqlite3.h> #endif #include "parg.h" #include "worgle.h" #include "worgle_private.h" #ifndef WORGLITE #include "db.h" #endif static int use_debug = 0; static int use_warnings = 0; static int map_source_code = 0; static char *map_filename = NULL; #ifndef WORGLITE static int generate_db = 0; static char *db_filename = NULL; #endif static int tangle_code = 1; enum { MODE_ORG, MODE_BEGINCODE, MODE_CODE }; enum { ORGLET_HEADER, ORGLET_CONTENT, ORGLET_BLKREF, ORGLET_UNKNOWN }; static int loadfile(worgle_d *worg, int file); static int parse_name(char *line, size_t len, worgle_string *str); #ifndef WORGLITE static int parse_header(worgle_d *worg, char *line, size_t len); #endif static int parse_begin(char *line, size_t len, worgle_string *str); static int check_for_reference(char *line , size_t size, worgle_string *str); static int worgle_getline(char *fullbuf, char **line, size_t *pos, size_t *line_size, size_t buf_size); static void append_filename(worgle_d *worg, char *filename); #ifndef WORGLITE static void tangle_to_db(worgle_d *worg); #endif static int loadfile(worgle_d *worg, int file) { FILE *fp; char *filename; worgle_textbuf *txt; size_t size; char *buf; txt = &worg->buffers[file]; filename = txt->filename.str; fp = fopen(filename, "r"); if(fp == NULL) { fprintf(stderr, "Could not find file %s\n", filename); return 1; } fseek(fp, 0, SEEK_END); size = ftell(fp); buf = calloc(1, size); worgle_textbuf_init(&worg->buffers[file], buf, size); fseek(fp, 0, SEEK_SET); fread(buf, size, 1, fp); fclose(fp); return 1; } int parse_file(worgle_d *worg, int file) { char *buf; size_t size; worgle_textbuf *curbuf; worgle_string str; char *line; size_t pos; size_t read; int mode; int rc; int status; curbuf = &worg->buffers[file]; buf = curbuf->buf; size = curbuf->size; worg->curbuf = curbuf; #ifndef WORGLITE worg->curorg = &worg->orgs[file]; if (file > 0) { worg->curorg->prev = &worg->orgs[file - 1]; } else { worg->curorg->prev = NULL; } #endif worgle_string_init(&str); line = NULL; pos = 0; mode = MODE_ORG; rc = 0; status = 0; worg->linum = 0; while (1) { worg->linum++; status = worgle_getline(buf, &line, &pos, &read, size); if(!status) break; if(mode == MODE_ORG) { #ifndef WORGLITE if (generate_db) { if (read >= 2) { if (parse_header(worg, line, read)) { continue; } } } #endif if(read >= 7) { if(!strncmp(line, "#+NAME", 6)) { #ifndef WORGLITE if (generate_db) { worgle_orgfile_append_content(worg, &worg->segblock); worgle_string_reset(&worg->segblock); } #endif if(line[6] != ':') { fprintf(stderr, "line %lu: expected ':'\n", worg->linum); rc = 1; break; } mode = MODE_BEGINCODE; parse_name(line, read, &str); worgle_begin_block(worg, &str); #ifndef WORGLITE continue; #endif } } #ifndef WORGLITE if (generate_db) { #ifndef WORGLITE if (worg->new_content) { worg->new_content = 0; worgle_string_reset(&worg->segblock); worg->segblock.str = line; } worg->segblock.size += read; #endif } #endif } else if(mode == MODE_CODE) { if(read >= 9) { if(!strncmp(line, "#+END_SRC", 9)) { mode = MODE_ORG; worg->block_started = 0; worgle_append_string(worg); #ifndef WORGLITE worg->new_content = 1; #endif continue; } } if(check_for_reference(line, read, &str)) { worgle_append_string(worg); worgle_append_reference(worg, &str); worg->block_started = 1; worgle_string_reset(&worg->block); continue; } worg->block.size += read; if(worg->block_started) { worg->block.str = line; worg->block_started = 0; worg->curline = worg->linum; } } else if(mode == MODE_BEGINCODE) { if (read >= 11) { if(!strncmp (line, "#+BEGIN_SRC",11)) { mode = MODE_CODE; worg->block_started = 1; worgle_string_reset(&worg->block); if (parse_begin(line, read, &str) == 2) { worgle_append_file(worg, &str); } continue; } else { fwrite(line, read, 1, stderr); fprintf(stderr, "line %lu: Expected #+BEGIN_SRC\n", worg->linum); rc = 1; break; } } fprintf(stderr, "line %lu: Expected #+BEGIN_SRC\n", worg->linum); rc = 1; } } return rc; } static int parse_name(char *line, size_t len, worgle_string *str) { size_t n; size_t pos; int mode; line+=7; len-=7; /* *namelen = 0; */ str->size = 0; str->str = NULL; if(len <= 0) return 1; pos = 0; mode = 0; for(n = 0; n < len; n++) { if(mode == 2) break; switch(mode) { case 0: if(line[n] == ' ') { } else { str->str = &line[n]; str->size++; pos++; mode = 1; } break; case 1: if(line[n] == 0xa) { mode = 2; break; } pos++; str->size++; break; default: break; } } /* *namelen = pos; */ return 1; } void worgle_begin_block(worgle_d *worg, worgle_string *name) { worg->curblock = worgle_hashmap_get(&worg->dict, name); if (worgle_block_id_get(worg->curblock) == 0) { worgle_block_id_set(worg->curblock, worgle_uuid_new(worg)); } worg->curblock->nblocks++; #ifndef WORGLITE worgle_orgfile_append_reference(worg, worg->curblock); #endif } #ifndef WORGLITE static int parse_header(worgle_d *worg, char *line, size_t len) { int mode; int rc; size_t s; char *header; worgle_string str; int lvl; mode = 0; if(line[0] != '*') return 0; rc = 0; worgle_string_init(&str); lvl = 1; for (s = 1; s < len; s++) { if (mode == 2) break; switch (mode) { case 0: if (line[s] == '*') { lvl++; } else if (line[s] == ' '){ mode = 1; } else { mode = 2; rc = 0; } break; case 1: rc = 1; mode = 2; header = &line[s]; str.str = header; str.size = len - s; str.size -= line[len - 1] == '\n'; worgle_orgfile_append_content(worg, &worg->segblock); worgle_string_reset(&worg->segblock); worgle_orgfile_append_header(worg, &str, lvl); worg->new_content = 1; break; } } return rc; } #endif static int parse_begin(char *line, size_t len, worgle_string *str) { size_t n; int mode; int rc; line += 11; len -= 11; if(len <= 0) return 0; mode = 0; n = 0; rc = 1; str->str = NULL; str->size = 0; while(n < len) { switch(mode) { case 0: /* initial spaces after BEGIN_SRC */ if(line[n] == ' ') { n++; } else { mode = 1; } break; case 1: /* look for :tangle */ if(line[n] == ' ') { mode = 0; n++; } else { if(line[n] == ':') { if(!strncmp(line + n + 1, "tangle", 6)) { n+=7; mode = 2; rc = 2; } } n++; } break; case 2: /* save file name, spaces after tangle */ if(line[n] != ' ') { str->str = &line[n]; str->size++; mode = 3; } n++; break; case 3: /* read up to next space or line break */ if(line[n] == ' ' || line[n] == '\n') { mode = 4; } else { str->size++; } n++; break; case 4: /* countdown til end */ n++; break; } } return rc; } void worgle_append_file(worgle_d *worg, worgle_string *filename) { worgle_file *f; f = worgle_filelist_append(&worg->flist, filename, worg->curblock); worgle_file_id_set(f, worgle_uuid_new(worg)); } void worgle_append_string(worgle_d *worg) { worgle_segment *seg; if(worg->curblock == NULL) return; if(worg->curline < 0) return; seg = worgle_block_append_string(worg->curblock, &worg->block, worg->curline, &worg->curbuf->filename); worgle_segment_id_set(seg, worgle_uuid_new(worg)); worg->curblock->last_seg = seg->id; } void worgle_append_reference(worgle_d *worg, worgle_string *ref) { worgle_segment *seg; if(worg->curblock == NULL) return; seg = worgle_block_append_reference(worg->curblock, ref, worg->linum, &worg->curbuf->filename); worgle_segment_id_set(seg, worgle_uuid_new(worg)); worg->curblock->last_seg = seg->id; } static int check_for_reference(char *line , size_t size, worgle_string *str) { int mode; size_t n; mode = 0; str->size = 0; str->str = NULL; for(n = 0; n < size; n++) { if(mode < 0) break; switch(mode) { case 0: /* spaces */ if(line[n] == ' ') continue; else if(line[n] == '<') mode = 1; else mode = -1; break; case 1: /* second < */ if(line[n] == '<') mode = 2; else mode = -1; break; case 2: /* word setup */ str->str = &line[n]; str->size++; mode = 3; break; case 3: /* the word */ if(line[n] == '>') { mode = 4; break; } str->size++; break; case 4: /* last > */ if(line[n] == '>') mode = 5; else mode = -1; break; } } return (mode == 5); } static int worgle_getline(char *fullbuf, char **line, size_t *pos, size_t *line_size, size_t buf_size) { size_t p; size_t s; *line_size = 0; p = *pos; *line = &fullbuf[p]; s = 0; while(1) { s++; if(p >= buf_size) return 0; if(fullbuf[p] == '\n') { *pos = p + 1; *line_size = s; return 1; } p++; } } int worgle_generate(worgle_d *worg) { return worgle_filelist_write(&worg->flist, &worg->dict); } void worgle_init(worgle_d *worg) { worgle_string_init(&worg->block); #ifndef WORGLITE worgle_string_init(&worg->segblock); #endif worg->curline = -1; worg->block_started = 0; #ifndef WORGLITE worg->new_content = 1; #endif worgle_hashmap_init(&worg->dict); worgle_filelist_init(&worg->flist); worg->curbuf = NULL; worg->buffers = NULL; worg->nbuffers = 0; worg->curblock = NULL; worg->linum = 0; worg->orgs = NULL; worg->curorg = NULL; worg->prog = 0; worg->UUID_count = 1; } void worgle_free(worgle_d *worg)