diff -ur v20/cklst.sh v21/cklst.sh --- v20/cklst.sh 2018-09-12 23:32:12.000000000 +0900 +++ v21/cklst.sh 2018-09-14 05:09:46.000000000 +0900 @@ -1,27 +1,38 @@ #!/bin/bash +[ -e ezyaml ] || make [ -e blk.yaml ] || cat computing.yaml | ./blk.py > blk.yaml -[ -e sort_blk.yaml ] || sort blk.yaml > sort_blk.yaml [ -e sort_ck1.yaml ] || sort ck1.yaml > sort_ck1.yaml [ -e sort_ck3.yaml ] || sort ck3.yaml > sort_ck3.yaml +if [ ! -e sort_for_cklst ]; then + cat > sort_for_cklst < sort_blk.yaml + while read line; do echo $line echo $line | sh [ $? -ne 0 ] && echo NG done < /dev/null | sort | diff sort_blk.yaml - +cat blk.yaml | ./ezyaml | diff blk.yaml - + cat ck1.yaml | ./ezyaml.py 2> /dev/null | sort | diff sort_ck1.yaml - cat ck3.yaml | ./ezyaml.py 2> /dev/null | sort | diff sort_ck3.yaml - cat ck5.yaml | ./ezyaml.py 2> /dev/null | sort | diff sort_ck1.yaml - cat ck6.yaml | ./ezyaml.py 2> /dev/null | diff ck6.yaml - cat ck7.yaml | ./ezyaml.py 2> /dev/null | diff ck7.yaml - +cat blk.yaml | ./ezyaml.py 2> /dev/null | ./sort_for_cklst | diff sort_blk.yaml - EOL # EOF diff -ur v20/ezyaml.c v21/ezyaml.c --- v20/ezyaml.c 2018-09-12 22:21:45.000000000 +0900 +++ v21/ezyaml.c 2018-09-14 05:09:31.000000000 +0900 @@ -1,50 +1,5 @@ #include "objs.h" -#define DBG_(...) fprintf(stderr, __VA_ARGS__) -#define DBG(...) do{ DBG_(__VA_ARGS__); DBG_("\n"); }while(0) - -char * -cp_add(char *a, char *b) -{ - char *r = malloc( strlen(a) + strlen(b) + 1 ); - - strcpy(r, a); - free(a); /* ! */ - - strcat(r, b); - free(b); /* ! */ - - return r; -} - -char * -cp_replace(char *s, char *from, char *to) -{ - char *bak = s, *t, *r = strdup(""); - - while( ( t = strstr(s, from) ) != NULL ){ - if(t > s){ - r = cp_add( r, strndup(s, t-s) ); - } - r = cp_add( r, strdup(to) ); - s = t + strlen(from); - } - r = cp_add( r, strdup(s) ); - free(bak); /* ! */ - return r; -} - -char * -cp_char_n(char v, int n) -{ - char *r = malloc(n+1); - memset(r, v, n); - r[n] = '\0'; - return r; -} - -/**/ - void err(char *t, char *s) { @@ -52,19 +7,6 @@ exit(1); } -static struct obj * -lines_dump_sub(struct obj *str) -{ - fprintf( stderr, "\"%s\"\n", (char *)obj_buf(str) ); - return NULL; -} - -void -lines_dump(struct obj *lines) -{ - list_map(lines, lines_dump_sub); -} - /**/ char * @@ -96,18 +38,26 @@ return 0; } -struct obj * +void parse_append(struct obj *buf, int c) { char c1 = c; - return buf_append(buf, &c1, 1); + buf_append(buf, &c1, 1); +} + +void +parse_buf_to_lst(struct obj *lst, struct obj *buf) +{ + parse_append(buf, '\0'); + list_append( lst, str_new( obj_ptr(buf) ) ); + buf->n = 0; } struct obj * parse(char *s) { struct obj *lst = list_new(); - struct obj *buf = buf_new(1024); + struct obj *buf = buf_new(1024, NULL, 0); int in_esc = 0; int qt = 0; @@ -121,33 +71,27 @@ } if(in_esc){ in_esc = 0; - buf = parse_append(buf, c); + parse_append(buf, c); continue; } if(qt){ if(c == qt){ - buf = parse_append(buf, c); - buf = parse_append(buf, '\0'); - list_append( lst, str_new( obj_buf(buf) ) ); - buf->buf_n = 0; + parse_append(buf, c); + parse_buf_to_lst(lst, buf); qt = 0; continue; } }else if( is_qts(c) ){ qt = c; - if(buf->buf_n > 0){ - buf = parse_append(buf, '\0'); - list_append( lst, str_new( obj_buf(buf) ) ); - buf->buf_n = 0; + if(buf->n > 0){ + parse_buf_to_lst(lst, buf); } } - buf = parse_append(buf, c); + parse_append(buf, c); } - if(buf->buf_n > 0){ - buf = parse_append(buf, '\0'); - list_append( lst, str_new( obj_buf(buf) ) ); - buf->buf_n = 0; + if(buf->n > 0){ + parse_buf_to_lst(lst, buf); } obj_del(buf); @@ -162,16 +106,19 @@ s = lines_top_str(lst); if( s && is_qts(s[0]) ){ - list_pop_top(lst); + s = lines_pop_str(lst); idx += strlen(s); + free(s); } while( list_len(lst) > 0 ){ - struct obj *str = list_pop_top(lst); - s = obj_buf(str); + s = lines_pop_str(lst); if( strstr(s, t) ){ - return idx + ( strstr(s, t) - s ); + idx += ( strstr(s, t) - s ); + free(s); + return idx; } idx += strlen(s); + free(s); } return -1; } @@ -227,7 +174,7 @@ struct obj *get_other(int idt, struct obj *lines); struct obj *get_value(char *s); struct obj *get(int idt, int kind, struct obj *lines); -struct obj *get_cont_str(int idt, struct obj *lines); +char *get_cont_str(int idt, struct obj *lines); struct obj * get_dict_v(int idt, struct obj *lines) @@ -258,29 +205,29 @@ } } vp = NULL; - return obj_new(OBJ_TYP_PTR, &vp, 0); + return obj_new(OBJ_TYP_PTR, &vp); } struct obj * get_dict(int idt, struct obj *lines) { - struct obj *str = list_pop_top(lines); - char *s = slice_tail( obj_buf(str), idt ); - int idx = find_colon_idx(s); + char *s = lines_pop_str(lines); + char *t = slice_tail(s, idt); + int idx = find_colon_idx(t); - struct obj *sk = str_new_n(s, idx); - struct obj *sv = str_new( slice_tail(s, idx+1) ); + struct obj *sk = str_new_n(t, idx); + struct obj *sv = str_new( slice_tail(t, idx+1) ); struct obj *k, *v; struct obj *dic = dict_new(); - obj_del(str); + free(s); - sk = str_strip(sk); - k = get_value( obj_buf(sk) ); + str_strip(sk); + k = get_value( obj_ptr(sk) ); obj_del(sk); - sv = str_strip(sv); - v = get_value( obj_buf(sv) ); + str_strip(sv); + v = get_value( obj_ptr(sv) ); obj_del(sv); if(v->typ == OBJ_TYP_PTR && v->any.p == NULL){ @@ -288,9 +235,9 @@ v = get_dict_v(idt, lines); } }else if(v->typ == OBJ_TYP_STR){ - struct obj *add = get_cont_str(idt+2, lines); - v = str_append( v, obj_buf(add) ); - obj_del(add); + char *add = get_cont_str(idt+2, lines); + str_append(v, add); + free(add); } dict_add(dic, k, v); @@ -337,36 +284,36 @@ struct obj * get_value(char *s) { - int i; + int i, n; double d; char *e; - struct obj *obj, *lst, *str; + struct obj *obj, *lst; if(*s == '\0'){ void *vp = NULL; - return obj_new(OBJ_TYP_PTR, &vp, 0); + return obj_new(OBJ_TYP_PTR, &vp); } i = (int) strtol(s, &e, 10); if(*e == '\0'){ - return obj_new(OBJ_TYP_INT, &i, 0); + return obj_new(OBJ_TYP_INT, &i); } d = strtod(s, &e); if(*e == '\0'){ - return obj_new(OBJ_TYP_DOUBLE, &d, 0); + return obj_new(OBJ_TYP_DOUBLE, &d); } if( is_any_str(s, kwd_true) ){ i = 1; - return obj_new(OBJ_TYP_BOOL, &i, 0); + return obj_new(OBJ_TYP_BOOL, &i); } if( is_any_str(s, kwd_false) ){ i = 0; - return obj_new(OBJ_TYP_BOOL, &i, 0); + return obj_new(OBJ_TYP_BOOL, &i); } if( strcmp(s, "null") == 0 ){ void *vp = NULL; - return obj_new(OBJ_TYP_PTR, &vp, 0); + return obj_new(OBJ_TYP_PTR, &vp); } if( strcmp(s, "[]") == 0 ){ return list_new(); @@ -377,19 +324,17 @@ return obj; } + n = strlen(s); lst = parse(s); if( list_len(lst) == 1 && is_qts(*s) ){ - str = str_new(s+1); - s = obj_buf(str); - s[ strlen(s) - 1 ] = '\0'; - str->buf_n = strlen(s) + 1; - return str; + s++; + n -= 2; } - - return str_new(s); + obj_del(lst); + return str_new_n(s, n); } -struct obj * +char * get_cont_str(int idt, struct obj *lines) { if( list_len(lines) ){ @@ -399,35 +344,30 @@ if(kind_ == TYP_OTHER && idt_ == idt){ /* ! */ struct obj *v = get_value( slice_tail(s, idt) ); int typ = v->typ; - if( ( typ == OBJ_TYP_STR && strlen( obj_buf(v) ) ) || + if( ( typ == OBJ_TYP_STR && strlen( obj_ptr(v) ) ) || ( typ == OBJ_TYP_INT || typ == OBJ_TYP_DOUBLE ) ){ - struct obj *str = list_pop_top(lines); - char *s = slice_tail( obj_buf(str), idt ); - struct obj *add = get_cont_str(idt, lines); - struct obj *ret = str_new(" "); - ret = str_append(ret, s); - ret = str_append( ret, obj_buf(add) ); - - obj_del(str); - obj_del(add); - return ret; + char *s = lines_pop_str(lines); + char *t = strdup( slice_tail(s, idt) ); + free(s); + char *add = get_cont_str(idt, lines); + return cp_add( cp_add( strdup(" "), t ), add ); } } } - return str_new(""); + return strdup(""); } struct obj * get_other(int idt, struct obj *lines) { - struct obj *str = list_pop_top(lines); - char *s = obj_buf(str); + char *s = lines_pop_str(lines); struct obj *v = get_value( slice_tail(s, idt) ); if(v->typ == OBJ_TYP_STR){ - struct obj *add = get_cont_str(idt+2, lines); - v = str_append( v, obj_buf(add) ); - obj_del(add); + char *add = get_cont_str(idt+2, lines); + str_append(v, add); + free(add); } + free(s); return v; } @@ -446,11 +386,10 @@ struct obj * cut_comment(struct obj *str) { - char *s = obj_buf(str); + char *s = obj_ptr(str); char *t = strchr(s, '#'); if(t){ - *t = '\0'; - str->buf_n = strlen(s) + 1; + str_free_set( str, strndup( s, (t-s) ) ); } return NULL; } @@ -458,7 +397,7 @@ int is_not_empty(struct obj *str) { - char *s = obj_buf(str); + char *s = obj_ptr(str); return *s != '\0'; } @@ -466,7 +405,7 @@ load(struct obj *str) { struct obj *obj, *objs; - struct obj *lines = lines_new( obj_buf(str) ); + struct obj *lines = lines_new( obj_ptr(str) ); struct obj *lst_trash = list_new(); list_map(lines, cut_comment); @@ -478,7 +417,7 @@ while( list_len(lines) ){ int idt, kind; - get_idt_kind( obj_buf( list_top(lines) ), &idt, &kind ); + get_idt_kind( obj_ptr( list_top(lines) ), &idt, &kind ); obj = get(idt, kind, lines); list_append(objs, obj); } @@ -486,7 +425,7 @@ obj_del(lines); obj = objs; - if(list_len(objs) == 1){ + if( list_len(objs) == 1 ){ obj = list_pop_top(objs); obj_del(objs); } @@ -505,7 +444,7 @@ { struct obj *lst; char *sum; - char *s = obj_buf(str); + char *s = obj_ptr(str); if( strchr(s, ' ') == NULL ){ return str; @@ -517,17 +456,12 @@ obj_del(str); sum = strdup(""); - - str = list_pop_top(lst); - s = strdup( obj_buf(str) ); - obj_del(str); + s = lines_pop_str(lst); while( list_len(lst) ){ char *t; while( list_len(lst) && strlen(s) + 2 <= 82 ){ - str = list_pop_top(lst); - t = strdup( obj_buf(str) ); - obj_del(str); + t = lines_pop_str(lst); s = cp_add( s, strdup(" ") ); s = cp_add(s, t); } @@ -535,10 +469,7 @@ sum = cp_add(sum, s); sum = cp_add( sum, strdup("\n") ); s = cp_char_n(' ', idt+2); - - str = list_pop_top(lst); - t = strdup( obj_buf(str) ); - obj_del(str); + t = lines_pop_str(lst); s = cp_add(s, t); } } @@ -559,7 +490,8 @@ for(i=0; inext; - str = str_append( dump_other(k, idt, 'l'), ":" ); + str = dump_other(k, idt, 'l'); + str_append(str , ":"); if( v->typ == OBJ_TYP_LIST && list_len(v) ){ list_append(lines, str); @@ -568,9 +500,9 @@ list_append(lines, str); str = dump_dict(v, idt+2); }else{ - str = str_append(str, " "); + str_append(str, " "); tmp = dump_value(v, 'r'); - str = str_append( str, obj_buf(tmp) ); + str_append( str, obj_ptr(tmp) ); obj_del(tmp); str = wrap_line(str, idt); } @@ -596,7 +528,7 @@ char *s; str = dump_obj(e, idt+2); - s = obj_buf(str); + s = obj_ptr(str); s = cp_add( cp_add( strndup(s, idt), strdup("- ") ), strdup( &s[idt+2] ) ); list_append( lines, str_new(s) ); @@ -649,7 +581,7 @@ { if(obj->typ == OBJ_TYP_STR){ struct obj *str; - char *s = strdup( obj_buf(obj) ); + char *s = strdup( obj_ptr(obj) ); if( need_quote(s, obj, from_dic) ){ char *qt; int q2 = strchr(s, '"') != NULL; @@ -702,7 +634,7 @@ { struct obj *str = dump_value(obj, from_dic); char *s = cp_char_n(' ', idt); - s = cp_add( s, strdup( obj_buf(str) ) ); + s = cp_add( s, strdup( obj_ptr(str) ) ); obj_del(str); str = wrap_line( str_new(s), idt); free(s); @@ -725,7 +657,9 @@ struct obj * dump(struct obj *obj) { - return str_append( dump_obj(obj, 0), "\n" ); + struct obj *str = dump_obj(obj, 0); + str_append(str, "\n"); + return str; } int @@ -739,7 +673,7 @@ obj_del(str); str = dump(obj); - s = obj_buf(str); + s = obj_ptr(str); fwrite( s, 1, strlen(s), stdout ); obj_del(str); diff -ur v20/objs.c v21/objs.c --- v20/objs.c 2018-09-07 23:07:30.000000000 +0900 +++ v21/objs.c 2018-09-14 05:09:22.000000000 +0900 @@ -83,41 +83,6 @@ return obj; } -int -objs_sum_alc_n(struct objs *objs) -{ - struct obj *obj = objs->top; - int sum = 0, n = objs->n, i; - - for(i=0; ialc_n; - obj = obj->next; - } - return sum; -} - -void -objs_copy_to_obj_arr(struct objs *objs, struct obj *arr) -{ - /* - struct obj arr[ objs_sum_alc_n(objs) ]; - */ - - struct objs dsts = OBJS_INIT; - - struct obj *obj = objs->top; - int sum = 0, n = objs->n, i; - - for(i=0; ialc_n; - obj = obj->next; - } -} - /**/ int @@ -128,86 +93,42 @@ case OBJ_TYP_DOUBLE: return sizeof(double); case OBJ_TYP_PTR: return sizeof(void *); case OBJ_TYP_OBJS: return sizeof(struct objs); - case OBJ_TYP_BUF: /* ! */ default: break; } return 0; } -int -obj_req_sz(int typ, void *vp, int buf_sz) -{ - int sz; - - switch(typ){ - case OBJ_TYP_BUF: - return buf_sz; - case OBJ_TYP_STR: - if(!vp){ - return buf_sz; - } - sz = strlen(vp) + 1; - return buf_sz > sz ? buf_sz : sz; - default: - break; - } - return obj_typ_sz(typ); -} - -int -obj_alc_n(int req_sz) -{ - struct obj *obj; - int osz = sizeof(*obj); - int add = req_sz - sizeof(obj->any); - return ( osz + (add > 0 ? add : 0) + osz - 1 ) / osz; -} - void -obj_init(struct obj *obj, int typ, void *vp, int buf_sz) +obj_init(struct obj *obj, int typ, void *vp) { - int req_sz = obj_req_sz(typ, vp, buf_sz); - int alc_n = obj_alc_n(req_sz); - obj->prev = obj->next = NULL; - obj->alc_n = alc_n; obj->typ = typ; - obj->buf_sz = OBJ_TYP_BASE(typ) == OBJ_TYP_BUF ? req_sz : 0; - obj->buf_n = 0; - if(vp && req_sz > 0){ - int n = req_sz; - if(typ == OBJ_TYP_STR && strlen(vp) + 1 < n){ - n = strlen(vp) + 1; - } - memcpy(&obj->any, vp, n); - obj->buf_n = n; + obj->sz = obj->n = 0; + if(vp){ + memcpy( &obj->any, vp, obj_typ_sz(typ) ); } } void -obj_init_obj(struct obj *dst, struct obj *src) -{ - obj_init(dst, src->typ, &src->any, src->buf_sz); -} - -void obj_fini(struct obj *obj) { - if( (obj->typ & OBJ_TYP_MASK) == OBJ_TYP_OBJS ){ + if( OBJ_TYP_BASE(obj->typ) == OBJ_TYP_OBJS ){ objs_del_obj_all(&obj->any.objs); + }else if(obj->typ == OBJ_TYP_BUF || obj->typ == OBJ_TYP_STR){ + if( obj_ptr(obj) ){ + free( obj_ptr(obj) ); + obj_ptr(obj) = NULL; + obj->sz = obj->n = 0; + } } } struct obj * -obj_new(int typ, void *vp, int buf_sz) +obj_new(int typ, void *vp) { - int req_sz = obj_req_sz(typ, vp, buf_sz); - int alc_n = obj_alc_n(req_sz); - struct obj *obj = malloc( sizeof(*obj) * alc_n ); - - obj_init(obj, typ, vp, buf_sz); - + struct obj *obj = malloc( sizeof(*obj) ); + obj_init(obj, typ, vp); return obj; } @@ -218,12 +139,6 @@ free(obj); } -void * -obj_buf(struct obj *obj) -{ - return obj->any.buf; -} - int obj_eq(struct obj *a, struct obj *b) { @@ -241,17 +156,17 @@ if(bs_typ == OBJ_TYP_DOUBLE){ return a->any.d == b->any.d; } - if(bs_typ == OBJ_TYP_PTR){ - return a->any.p == b->any.p; - } if(a->typ == OBJ_TYP_STR){ - return strcmp( obj_buf(a), obj_buf(b) ) == 0; + return strcmp( obj_ptr(a), obj_ptr(b) ) == 0; } - if(bs_typ == OBJ_TYP_BUF){ - if(a->buf_n != b->buf_n){ + if(a->typ == OBJ_TYP_BUF){ + if(a->n != b->n){ return 0; } - return memcmp( obj_buf(a), obj_buf(b), a->buf_n ) == 0; + return memcmp( obj_ptr(a), obj_ptr(b), a->n ) == 0; + } + if(bs_typ == OBJ_TYP_PTR){ + return obj_ptr(a) == obj_ptr(b); } if(bs_typ == OBJ_TYP_OBJS){ /* same order ! */ @@ -275,61 +190,116 @@ /**/ -struct obj * -buf_new(int buf_sz) +static void * +alloc_cpy(int sz, void *vp, int n) { - return obj_new(OBJ_TYP_BUF, NULL, buf_sz); + void *r = malloc(sz); + if(!vp){ + n = 0; + }else if(n < 0 || n > sz){ + n = sz; + } + if(n > 0){ + memcpy(r, vp, n); + } + return r; } struct obj * -buf_read(FILE *fp, int add_sz) +buf_new(int sz, void *vp, int n) { - char buf[4096]; - struct obj bufs, *obj; - int n; + vp = alloc_cpy(sz, vp, n); + struct obj *obj = obj_new(OBJ_TYP_BUF, &vp); + obj->sz = sz; + + if(!vp){ + n = 0; + }else if(n < 0 || n > sz){ + n = sz; + } + obj->n = n; - bufs_init(&bufs); - while((n = fread(buf, 1, sizeof(buf), fp)) > 0){ - bufs_append(&bufs, buf, n); - } - if(add_sz > 0){ - bufs_append(&bufs, NULL, add_sz); - } - obj = bufs_join(&bufs); - obj->buf_n -= add_sz; - bufs_fini(&bufs); return obj; } struct obj * +buf_read(FILE *fp) +{ + char arr[4096]; + struct obj *buf = buf_new( sizeof(arr), NULL, 0 ), *r; + int n; + + while((n = fread(arr, 1, sizeof(arr), fp)) > 0){ + buf_append(buf, arr, n); + } + r = buf_new( buf->n, obj_ptr(buf), buf->n ); + obj_del(buf); + return r; +} + +void buf_append(struct obj *buf, void *vp, int sz) { - char *dst; - int asz = buf->buf_n + sz; + int asz = buf->n + sz; - if(asz > buf->buf_sz){ - struct obj *bak = buf; - int rsz = bak->buf_sz * 2; + if(asz > buf->sz){ + char *bak = obj_ptr(buf); + int rsz = buf->sz * 2; while(asz > rsz){ rsz *= 2; } - buf = buf_new(rsz); - memcpy( obj_buf(buf), obj_buf(bak), bak->buf_n ); - buf->buf_n = bak->buf_n; - obj_del(bak); /* ! */ + obj_ptr(buf) = alloc_cpy( rsz, bak, buf->n ); + buf->sz = rsz; + free(bak); } - dst = obj_buf(buf); - dst += buf->buf_n; - memcpy(dst, vp, sz); - buf->buf_n += sz; - return buf; + if(vp && sz > 0){ + char *dst = obj_ptr(buf) + buf->n; + memcpy(dst, vp, sz); + buf->n += sz; + } } -struct obj * -buf_append_str(struct obj *buf, char *s) +/**/ + +char * +cp_add(char *a, char *b) +{ + char *r = malloc( strlen(a) + strlen(b) + 1 ); + + strcpy(r, a); + free(a); /* ! */ + + strcat(r, b); + free(b); /* ! */ + + return r; +} + +char * +cp_replace(char *s, char *from, char *to) +{ + char *bak = s, *t, *r = strdup(""); + + while( ( t = strstr(s, from) ) != NULL ){ + if(t > s){ + r = cp_add( r, strndup(s, t-s) ); + } + r = cp_add( r, strdup(to) ); + s = t + strlen(from); + } + r = cp_add( r, strdup(s) ); + free(bak); /* ! */ + return r; +} + +char * +cp_char_n(char v, int n) { - return buf_append( buf, s, strlen(s)+1 ); + char *r = malloc(n+1); + memset(r, v, n); + r[n] = '\0'; + return r; } /**/ @@ -337,95 +307,78 @@ struct obj * str_new(char *s) { - return obj_new(OBJ_TYP_STR, s, 0); + s = strdup(s); + return obj_new(OBJ_TYP_STR, &s); } struct obj * str_new_n(char *s, int n) { - struct obj *str = obj_new(OBJ_TYP_STR, NULL, n+1); - char *d = obj_buf(str); - memcpy(d, s, n); - d[n] = '\0'; + struct obj *str; + s = strndup(s, n); + str = str_new(s); + free(s); return str; } struct obj * -str_new_sz(int sz) +str_read(FILE *fp) { - return obj_new(OBJ_TYP_STR, NULL, sz); + struct obj *buf = buf_read(fp); + struct obj *str = str_new_n( obj_ptr(buf), buf->n ); + obj_del(buf); + return str; } -struct obj * -str_read(FILE *fp) +void +str_free_set(struct obj *str, char *s) { - struct obj *str = buf_read(fp, 1); - char c = '\0'; - buf_append(str, &c, 1); - str->typ = OBJ_TYP_STR; /* ! */ - return str; + char *bak = obj_ptr(str); + if(bak){ + free(bak); + } + obj_ptr(str) = s; } -struct obj * +void str_append(struct obj *str, char *s) { - str->typ = OBJ_TYP_BUF; /* ! */ - str->buf_n = strlen( obj_buf(str) ); - str = buf_append_str(str, s); - str->typ = OBJ_TYP_STR; /* ! */ - return str; + obj_ptr(str) = cp_add( obj_ptr(str), strdup(s) ); } void str_trunc(struct obj *str) { - char *s = obj_buf(str); + char *s = obj_ptr(str); char *t = &s[ strlen(s)-1 ]; while(*t == ' ' || *t == '\t'){ *t-- = '\0'; - str->buf_n--; } + str_free_set( str, strdup(s) ); } -struct obj * +void str_strip(struct obj *str) { - char *s = obj_buf(str), *t = s; + char *t; str_trunc(str); + t = obj_ptr(str); while(*t == ' ' || *t == '\t'){ t++; } - if(s < t){ - struct obj *bak = str; - str = str_new(t); - obj_del(bak); - } - return str; + str_free_set( str, strdup(t) ); } /**/ -void -list_init(struct obj *obj) -{ - struct objs objs = OBJS_INIT; - obj_init(obj, OBJ_TYP_LIST, &objs, 0); -} - -void -list_fini(struct obj *lst) -{ - obj_fini(lst); -} - struct obj * list_new(void) { struct objs objs = OBJS_INIT; - return obj_new(OBJ_TYP_LIST, &objs, 0); + return obj_new(OBJ_TYP_LIST, &objs); } void @@ -542,7 +495,6 @@ void dict_del(struct obj *dic) { - dic->typ = OBJ_TYP_LIST; /* ! */ list_del(dic); } @@ -560,99 +512,25 @@ void dict_add_lst_kv(struct obj *dic, struct obj *lst_kv) { - dic->typ = OBJ_TYP_LIST; /* ! */ list_append(dic, lst_kv); - dic->typ = OBJ_TYP_DICT; /* ! */ } struct obj * dict_top_lst_kv(struct obj *dic) { - struct obj *lst_kv; - - dic->typ = OBJ_TYP_LIST; /* ! */ - lst_kv = list_top(dic); - dic->typ = OBJ_TYP_DICT; /* ! */ - - return lst_kv; + return list_top(dic); } struct obj * dict_pop_top(struct obj *dic) { - struct obj *lst_kv; - - dic->typ = OBJ_TYP_LIST; /* ! */ - lst_kv = list_pop_top(dic); - dic->typ = OBJ_TYP_DICT; /* ! */ - - return lst_kv; + return list_pop_top(dic); } int dict_len(struct obj *dic) { - int n; - - dic->typ = OBJ_TYP_LIST; /* ! */ - n = list_len(dic); - dic->typ = OBJ_TYP_DICT; /* ! */ - - return n; -} - -/**/ - -void -bufs_init(struct obj *bufs) -{ - list_init(bufs); -} - -void -bufs_append(struct obj *bufs, void *buf, int buf_sz) -{ - list_append( bufs, obj_new(OBJ_TYP_BUF, buf, buf_sz) ); -} - -int -bufs_sum_sz(struct obj *bufs) -{ - struct obj *obj = list_top(bufs); - int sum = 0, n = list_len(bufs), i; - - for(i=0; ibuf_sz; - obj = obj->next; - } - return sum; -} - -struct obj * -bufs_join(struct obj *bufs) -{ - int sz = bufs_sum_sz(bufs); - char buf[sz], *dp = buf; - - struct obj *obj = list_top(bufs); - int n = list_len(bufs), i; - - for(i=0; ibuf_sz ); - dp += obj->buf_sz; - obj = obj->next; - } - - return obj_new(OBJ_TYP_BUF, buf, sz); - /* not free bufs */ -} - -void -bufs_fini(struct obj *bufs) -{ - while( list_len(bufs) > 0 ){ - obj_del( list_pop_top(bufs) ); - } + return list_len(dic); } /**/ @@ -666,7 +544,7 @@ struct obj *str; char *t = strchr(s, '\n'); if(t){ - str = str_new_n(s, (t-s)); + str = str_new_n( s, (t-s) ); t++; }else{ str = str_new(s); @@ -680,7 +558,20 @@ char * lines_top_str(struct obj *lines) { - return list_len(lines) ? obj_buf( list_top(lines) ) : NULL; + return list_len(lines) ? obj_ptr( list_top(lines) ) : NULL; +} + +char * +lines_pop_str(struct obj *lines) +{ + char *s = NULL; + struct obj *str = list_pop_top(lines); + if(str){ + s = obj_ptr(str); + obj_ptr(str) = NULL; + obj_del(str); + } + return s; } struct obj * @@ -691,11 +582,11 @@ int n = list_len(lines), i; for(i=0; inext; + str = str->next; } return r; } diff -ur v20/objs.h v21/objs.h --- v20/objs.h 2018-09-07 23:03:17.000000000 +0900 +++ v21/objs.h 2018-09-14 05:09:22.000000000 +0900 @@ -5,6 +5,9 @@ #include #include +#define DBG_(...) fprintf(stderr, __VA_ARGS__) +#define DBG(...) do{ DBG_(__VA_ARGS__); DBG_("\n"); }while(0) + struct objs{ struct obj *top; int n; @@ -21,23 +24,18 @@ struct obj *objs_pop_top(struct objs *objs); struct obj *objs_pop_tail(struct objs *objs); -int objs_sum_alc_n(struct objs *objs); -void objs_copy_to_obj_arr(struct objs *objs, struct obj *arr); - /**/ struct obj{ struct obj *prev, *next; - int alc_n; int typ; - int buf_sz; - int buf_n; + int sz, n; + union{ int i; double d; void *p; struct objs objs; - char buf[1]; }any; }; @@ -45,104 +43,54 @@ #define OBJ_TYP_DOUBLE 1 #define OBJ_TYP_PTR 2 #define OBJ_TYP_OBJS 3 -#define OBJ_TYP_BUF 4 #define OBJ_TYP_EXP_SFT 8 #define OBJ_TYP_EXP(i) ( (i) << OBJ_TYP_EXP_SFT ) #define OBJ_TYP_BOOL ( OBJ_TYP_EXP(1) | OBJ_TYP_INT ) #define OBJ_TYP_LIST ( OBJ_TYP_EXP(1) | OBJ_TYP_OBJS ) #define OBJ_TYP_DICT ( OBJ_TYP_EXP(2) | OBJ_TYP_OBJS ) -#define OBJ_TYP_STR ( OBJ_TYP_EXP(1) | OBJ_TYP_BUF ) +#define OBJ_TYP_STR ( OBJ_TYP_EXP(1) | OBJ_TYP_PTR ) +#define OBJ_TYP_BUF ( OBJ_TYP_EXP(2) | OBJ_TYP_PTR ) #define OBJ_TYP_MASK ( (1<any.p ) int obj_typ_sz(int typ); -int obj_req_sz(int typ, void *vp, int buf_sz); -int obj_alc_n(int req_sz); - -void obj_init(struct obj *obj, int typ, void *vp, int buf_sz); -void obj_init_obj(struct obj *dst, struct obj *src); +void obj_init(struct obj *obj, int typ, void *vp); void obj_fini(struct obj *obj); - -struct obj *obj_new(int typ, void *vp, int buf_sz); +struct obj *obj_new(int typ, void *vp); void obj_del(struct obj *obj); - -void *obj_buf(struct obj *obj); - int obj_eq(struct obj *a, struct obj *b); -/* for stack */ - -/* - -int sz = 1024; -struct obj obj[ obj_alc_n(sz) ]; - -obj_init(obj, OBJ_TYP_BUF, NULL, sz); - : -*/ - -/* -char *s = "foo bar"; -struct obj obj[ obj_alc_n( strlen(s) + 1 ) ]; - -obj_init(obj, OBJ_TYP_STR, s, 0) - : -*/ - -/* -struct obj *src = obj_new(OBJ_TYP_STR, "foo bar", 0); -struct obj obj[ src->alc_n ]; - -obj_init_obj(obj, src); -obj_del(src); - : -*/ - -/* - -struct objs srcs = OBJS_INIT; - : - -struct obj arr[ objs_sum_alc_n(&srcs) ]; -struct objs dsts = { arr, srsc->n }; - -objs_copy_to_obj_arr(dsts, arr); - : -*/ - -struct obj *buf_new(int buf_sz); -struct obj *buf_read(FILE *fp, int add_sz); -struct obj *buf_append(struct obj *buf, void *vp, int sz); -struct obj *buf_append_str(struct obj *buf, char *s); +struct obj *buf_new(int sz, void *vp, int n); +struct obj *buf_read(FILE *fp); +void buf_append(struct obj *buf, void *vp, int sz); + +char *cp_add(char *a, char *b); +char *cp_replace(char *s, char *from, char *to); +char *cp_char_n(char v, int n); struct obj *str_new(char *s); struct obj *str_new_n(char *s, int n); -struct obj *str_new_sz(int sz); struct obj *str_read(FILE *fp); -struct obj *str_append(struct obj *str, char *s); +void str_free_set(struct obj *str, char *s); +void str_append(struct obj *str, char *s); void str_trunc(struct obj *str); -struct obj *str_strip(struct obj *str); +void str_strip(struct obj *str); -void list_init(struct obj *obj); -void list_fini(struct obj *lst); struct obj *list_new(void); void list_del(struct obj *lst); - struct objs *list_objs(struct obj *lst); - void list_insert(struct obj *lst, struct obj *obj); void list_append(struct obj *lst, struct obj *obj); void list_del_obj(struct obj *lst, struct obj *obj); struct obj *list_pop_top(struct obj *lst); struct obj *list_pop_tail(struct obj *lst); - int list_len(struct obj *lst); struct obj *list_top(struct obj *lst); struct obj *list_tail(struct obj *lst); - struct obj *list_map(struct obj *lst, struct obj *(*fp)(struct obj *e)); void list_filter(struct obj *lst, int (*fp)(struct obj *e), struct obj *lst_false); @@ -154,14 +102,9 @@ struct obj *dict_pop_top(struct obj *dic); int dict_len(struct obj *dic); -void bufs_init(struct obj *bufs); -void bufs_append(struct obj *bufs, void *buf, int buf_sz); -int bufs_sum_sz(struct obj *bufs); -struct obj *bufs_join(struct obj *bufs); -void bufs_fini(struct obj *bufs); - struct obj *lines_new(char *s); char *lines_top_str(struct obj *lines); +char *lines_pop_str(struct obj *lines); struct obj *lines_join(struct obj *lines, char *delim); #endif