1230 lines · 30.9 KB · C
RawDownload
#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.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t