diff options
| author | M. Shulhan <ms@kilabit.org> | 2009-02-15 21:20:52 +0700 |
|---|---|---|
| committer | M. Shulhan <ms@kilabit.org> | 2009-02-15 21:20:52 +0700 |
| commit | 1661c4681059e0be014641bfae8aa5096a36fd8b (patch) | |
| tree | 64ac439371e7cbeff25de6eb556218b845d2dd96 | |
| parent | 8db65208771259e7c4329de32891a5fe37bde227 (diff) | |
| download | vos-1661c4681059e0be014641bfae8aa5096a36fd8b.tar.xz | |
fix bug in create statement.
vos:
- renice parsing arguments.
vos_errno:
- rewrite E_VOS_PARAM as global help message.
op/vos_Bucket:
- bucket_file_write(): new function.
- record_write_once(): fix bug in start/end position.
- bucket_read_filtered():
+ if record is rejected, go to next line.
+ fix bug in using "str" variable while record is being rejected.
op/vos_File:
- file_write(): only reset file buffer until idx.
op/vos_Record:
- record_read_filtered(): if record is rejected, go to next line.
proc/vos_create:
- vos_process_create():
+ remove "bucket_print()" in debug.
+ fix thread restart, at phase 2.
proc/vos_sort:
- sort_process(): fix typo.
| -rw-r--r-- | op/vos_Bucket.c | 100 | ||||
| -rw-r--r-- | op/vos_File.c | 2 | ||||
| -rw-r--r-- | op/vos_Record.c | 4 | ||||
| -rw-r--r-- | proc/vos_create.c | 4 | ||||
| -rw-r--r-- | proc/vos_sort.c | 2 | ||||
| -rw-r--r-- | vos.c | 47 | ||||
| -rw-r--r-- | vos_errno.c | 7 |
7 files changed, 113 insertions, 53 deletions
diff --git a/op/vos_Bucket.c b/op/vos_Bucket.c index f7985e2..00c0bb9 100644 --- a/op/vos_Bucket.c +++ b/op/vos_Bucket.c @@ -94,7 +94,31 @@ void bucket_destroy(struct Bucket *B, const int n) } } -static int record_write_once(struct Record *R, struct File *F, struct Field *frmt) +static int bucket_file_write(struct File *F) +{ + int s = 0; + unsigned long len = 0; + unsigned long fidx = F->idx; + + /* set F->idx to the last new line */ + while (F->idx > 0 && FCURC(F) != CH_NEWLINE) + F->idx--; + + len = fidx - F->idx; + fidx = F->idx; + + s = file_write(F); + if (s) + return s; + + F->buf = memmove(F->buf, &F->buf[fidx], len); + F->idx = len; + + return 0; +} + +static int record_write_once(struct Record *R, struct File *F, + struct Field *frmt, int *start_p) { int s; long len = 0; @@ -102,20 +126,19 @@ static int record_write_once(struct Record *R, struct File *F, struct Field *frm /* set start position */ if (frmt->start_p) { - len = F->pos + frmt->start_p; - if (len < F->idx) { - while (F->idx > len) { + if ((*start_p) > frmt->start_p) { + while ((*start_p) > frmt->start_p) { FCURC(F) = ' '; F->idx--; + (*start_p)--; } - } else { - len2 = F->idx; - while (len2 < len) { + } else if ((*start_p) < frmt->start_p) { + while ((*start_p) < frmt->start_p) { + (*start_p)++; FCURC(F) = ' '; F->idx++; - len2++; if (F->idx >= F->size) { - s = file_write(F); + s = bucket_file_write(F); if (s) return s; } @@ -125,9 +148,10 @@ static int record_write_once(struct Record *R, struct File *F, struct Field *frm /* write left quote */ if (frmt->left_q) { + (*start_p)++; FCURC(F) = frmt->left_q; if (++F->idx >= F->size) { - s = file_write(F); + s = bucket_file_write(F); if (s) return s; } @@ -146,13 +170,14 @@ static int record_write_once(struct Record *R, struct File *F, struct Field *frm len = len2; } if ((F->idx + len) >= F->size) { - s = file_write(F); + s = bucket_file_write(F); if (s) return s; } if (len > 0) { memcpy(&FCURC(F), R->v->buf, len); F->idx += len; + (*start_p) += len; str_prune(R->v); } @@ -160,8 +185,9 @@ static int record_write_once(struct Record *R, struct File *F, struct Field *frm if (frmt->right_q) { FCURC(F) = frmt->right_q; F->idx++; + (*start_p)++; if (F->idx >= F->size) { - s = file_write(F); + s = bucket_file_write(F); if (s) return s; } @@ -173,8 +199,9 @@ static int record_write_once(struct Record *R, struct File *F, struct Field *frm FCURC(F) = ' '; F->idx++; len++; + (*start_p)++; if (F->idx >= F->size) { - s = file_write(F); + s = bucket_file_write(F); if (s) return s; } @@ -184,8 +211,9 @@ static int record_write_once(struct Record *R, struct File *F, struct Field *frm if (frmt->sep) { FCURC(F) = frmt->sep; F->idx++; + (*start_p)++; if (F->idx >= F->size) { - s = file_write(F); + s = bucket_file_write(F); if (s) return s; } @@ -200,7 +228,7 @@ int bucket_write(struct Bucket *B, const int n, struct File *F, int s = 0; int i = 0; int empty = 1; - unsigned long nrow = 0; + int start_p = 0; struct Field *pfld = 0; struct String snon = {0, 0, "\0"}; struct Record non = {0, 0, &snon, 0, 0, 0, 0}; @@ -222,31 +250,33 @@ int bucket_write(struct Bucket *B, const int n, struct File *F, pfld = flds; for (i = 1; i < n; i++) { if (! B[i].stat) { - s = record_write_once(B[i].p, F, pfld); + s = record_write_once(B[i].p, F, pfld, + &start_p); if (s) goto err; B[i].p = B[i].p->row_next; - if (B[i].p == B[i].cnt->row_last || (! B[i].p)) { + if (B[i].p == B[i].cnt->row_last + || (! B[i].p)) { empty++; - B[i].stat = 1; - B[i].p = B[i].cnt; - B[i].cnt->row_last = 0; + B[i].stat = 1; + B[i].p = B[i].cnt; + B[i].cnt->row_last = 0; } } else { - s = record_write_once(&non, F, pfld); + s = record_write_once(&non, F, pfld, + &start_p); } pfld = pfld->next; } if (F->idx >= F->size) { - s = file_write(F); + s = bucket_file_write(F); if (s) goto err; } FCURC(F) = CH_NEWLINE; F->idx++; - F->pos = F->idx; - nrow++; + start_p = 0; } file_write(F); err: @@ -303,7 +333,6 @@ int bucket_read_filtered(struct Bucket *B, struct File *F, struct Field *_fld) if (s) goto err; } - } } } else if (fld->left_q) { @@ -334,16 +363,16 @@ int bucket_read_filtered(struct Bucket *B, struct File *F, struct Field *_fld) } } } else if (fld->right_q) { - if (fld->flag && ! reject) + if (fld->flag && ! reject) { s = file_fetch_until(F, str, fld->right_q); - else + start_p += str->idx + 1; + } else { s = file_skip_until(F, fld->right_q); + } if (s) goto err; F->idx++; - start_p += str->idx + 1; - if (F->idx >= F->size) { s = file_read(F); if (s) @@ -370,16 +399,15 @@ int bucket_read_filtered(struct Bucket *B, struct File *F, struct Field *_fld) } } } else if (fld->sep) { - if (fld->flag && !reject) + if (fld->flag && !reject) { s = file_fetch_until(F, str, fld->sep); - else + start_p += str->idx + 1; + } else s = file_skip_until(F, fld->sep); if (s) goto err; F->idx++; - start_p += str->idx + 1; - if (F->idx >= F->size) { s = file_read(F); if (s) @@ -400,6 +428,7 @@ int bucket_read_filtered(struct Bucket *B, struct File *F, struct Field *_fld) /* reject this record */ if (s == 0) { reject = 1; + break; /* prune later */ } } @@ -407,7 +436,7 @@ int bucket_read_filtered(struct Bucket *B, struct File *F, struct Field *_fld) fld = fld->next; } if (FCURC(F) != CH_NEWLINE) { - s = file_fetch_until(F, str, CH_NEWLINE); + s = file_skip_until(F, CH_NEWLINE); } F->idx++; @@ -424,7 +453,8 @@ int bucket_read_filtered(struct Bucket *B, struct File *F, struct Field *_fld) s = 0; /* move `p' to the next row in the bucket */ while (fld) { - B[fld->idx].p = B[fld->idx].p->row_next; + if (B[fld->idx].p) + B[fld->idx].p = B[fld->idx].p->row_next; fld = fld->next; } } diff --git a/op/vos_File.c b/op/vos_File.c index 5d0ffee..dfb80cb 100644 --- a/op/vos_File.c +++ b/op/vos_File.c @@ -107,7 +107,7 @@ int file_write(struct File *F) return E_FILE_WRITE; } - F->buf = memset(F->buf, FILE_DEF_SET, F->size); + F->buf = memset(F->buf, FILE_DEF_SET, F->idx); F->pos += F->idx; F->idx = 0; diff --git a/op/vos_Record.c b/op/vos_Record.c index 459b43f..17a9f3d 100644 --- a/op/vos_Record.c +++ b/op/vos_Record.c @@ -689,7 +689,7 @@ int record_read_filtered(struct Record **R, struct File *F, struct Field *fld) /* reject this record */ if (s == 0) { reject = 1; - str_prune(str); + break; } } @@ -710,7 +710,7 @@ int record_read_filtered(struct Record **R, struct File *F, struct Field *fld) } /* go to next row */ if (FCURC(F) != CH_NEWLINE) { - s = file_fetch_until(F, str, CH_NEWLINE); + s = file_skip_until(F, CH_NEWLINE); } F->idx++; s = 0; diff --git a/proc/vos_create.c b/proc/vos_create.c index 0f32de0..14134ab 100644 --- a/proc/vos_create.c +++ b/proc/vos_create.c @@ -205,7 +205,6 @@ int vos_process_create(struct Stmt *create) if (_vos.debug & DBG_CREATE) { printf("parent: writing bucket\n"); - bucket_print(buckets, n_bucket); } s = bucket_write(buckets, n_bucket, F, create->out->fields); if (s) @@ -217,7 +216,9 @@ int vos_process_create(struct Stmt *create) /* restart threads */ if (cproc[i].status == CPROC_BUCKETS_FULL) cproc[i].status = CPROC_START; + } + for (i = 0; i < n_in; i++) { /* wait until child fill the buckets */ while (cproc[i].status == CPROC_START) sleep(THREAD_TIME_WAIT); @@ -238,7 +239,6 @@ int vos_process_create(struct Stmt *create) if (_vos.debug & DBG_CREATE) { printf("parent: writing bucket\n"); - bucket_print(buckets, n_bucket); } s = bucket_write(buckets, n_bucket, F, create->out->fields); if (s) diff --git a/proc/vos_sort.c b/proc/vos_sort.c index 627bfd8..70b5078 100644 --- a/proc/vos_sort.c +++ b/proc/vos_sort.c @@ -191,7 +191,7 @@ static void *sort_process(void *parm) goto err; } - /* phase 1: create & file rows */ + /* phase 1: create & fill rows */ while (FCURP(F) < psort->pos_end) { s = record_read(&R, F, psort->sort->in->fields); if (! R) @@ -5,6 +5,13 @@ #include "proc/vos_create.h" #include "proc/vos_join.h" +enum _arg_todo { + ARG_DONE = 0, + ARG_START, + ARG_DEBUG_VALUE, + ARG_VOS_SCRIPT +}; + /** * @return: * < 0..(n-1) : success @@ -29,25 +36,43 @@ int get_token_idx(const char **ls, const unsigned int n, const char *tok) static int vos_init(int argc, char **argv) { - /* very lazy parsing argument */ - if (argc < 1 || argc == 2 || argc > 3) - return E_VOS_PARAM; + int i = 1; + int s = ARG_START; _vos.debug = 0; + while (i <= argc && s != ARG_DONE) { + switch (s) { + case ARG_START: + s = strcmp(argv[i], "-h"); + if (s == 0) + return E_VOS_PARAM; + + s = strcmp(argv[i], "-d"); + if (s == 0) + s = ARG_DEBUG_VALUE; + else + s = ARG_VOS_SCRIPT; + break; + + case ARG_DEBUG_VALUE: + _vos.debug = strtol(argv[i], 0, 0); + s = ARG_VOS_SCRIPT; + break; - if (argc == 3) { - if (argv[1][0] != '-') - return E_VOS_PARAM; - if (argv[1][1] != 'd') - return E_VOS_PARAM; - _vos.debug = strtol(argv[2], 0, 0); + case ARG_VOS_SCRIPT: + _vos.script = argv[i]; + s = ARG_DONE; + break; + } + i++; } + if (s != ARG_DONE) + return E_VOS_PARAM; _vos.file_buf_size = VOS_DEF_FILE_BUF_SIZE; _vos.proc_cmp_case = VOS_DEF_PROC_CMP_CASE; _vos.proc_max = VOS_DEF_PROC_MAX; _vos.proc_max_row = VOS_DEF_PROC_MAX_ROW; - _vos.script = argv[argc]; srand(time((void *) 0)); @@ -97,7 +122,7 @@ int main(int argc, char *argv[]) s = vos_init(argc - 1, argv); if (s) - return s; + goto err; s = vos_parsing(&stmt, _vos.script); if (s) diff --git a/vos_errno.c b/vos_errno.c index 5f340e1..09a5c5a 100644 --- a/vos_errno.c +++ b/vos_errno.c @@ -2,7 +2,12 @@ const char *vos_errmsg[N_VOS_ERRNO] = { "\0", - "Usage: vos [-d {1,2,4,8,16}] <vos script>\n\0", + "Usage: vos [-d {1|2|4|8|16}] <vos script>\n"\ + " -d 1 : debug / test script\n"\ + " -d 2 : debug script parser\n"\ + " -d 4 : debug sort statement\n"\ + " -d 8 : debug create statement\n"\ + " -d 16 : debug join statement\n\0", "line %d: unexpected character '%c'.\n\0", "line %d: unexpected token '%s'.\n\0", |
