00001
00011 #include "buffer.h"
00012 #include "jbxl_state.h"
00013
00014
00024 Buffer* new_Buffer(int sz)
00025 {
00026 Buffer* buf;
00027
00028 buf = (Buffer*)malloc(sizeof(Buffer));
00029 if (buf==NULL) return NULL;
00030
00031 memset(buf, 0, sizeof(Buffer));
00032 buf->vldsz = -1;
00033 buf->state = JBXL_NORMAL;
00034
00035 if (sz>0) *buf = make_Buffer(sz + 1);
00036 return buf;
00037 }
00038
00039
00040
00049 Buffer init_Buffer()
00050 {
00051 Buffer buf;
00052
00053 memset(&buf, 0, sizeof(Buffer));
00054 buf.vldsz = -1;
00055 buf.state = JBXL_NORMAL;
00056
00057 return buf;
00058 }
00059
00060
00061
00074 Buffer make_Buffer(int sz)
00075 {
00076 Buffer buf;
00077
00078 memset(&buf, 0, sizeof(Buffer));
00079 buf.state = JBXL_NORMAL;
00080 if (sz<0) return buf;
00081
00082 buf.bufsz = sz;
00083 buf.buf = (unsigned char*)malloc(buf.bufsz+1);
00084
00085 if (buf.buf==NULL) {
00086 buf.bufsz = 0;
00087 buf.vldsz = -1;
00088 buf.state = JBXL_ERROR;
00089 }
00090 else {
00091 memset(buf.buf, 0, buf.bufsz+1);
00092 }
00093
00094 return buf;
00095 }
00096
00097
00098
00112 Buffer make_Buffer_bychar(unsigned char cc)
00113 {
00114 Buffer buf;
00115
00116 buf = make_Buffer(LADDR);
00117 if (buf.buf==NULL) return buf;
00118
00119 buf.buf[0] = cc;
00120 buf.vldsz = 1;
00121 return buf;
00122 }
00123
00124
00125
00133 void free_Buffer(Buffer* buf)
00134 {
00135 if (buf!=NULL) {
00136 if (buf->buf!=NULL) free(buf->buf);
00137 buf->buf = NULL;
00138 memset(buf, 0, sizeof(Buffer));
00139 buf->vldsz = -1;
00140 buf->state = JBXL_NORMAL;
00141 }
00142 }
00143
00144
00145
00154 void del_Buffer(Buffer** buf)
00155 {
00156 if (buf!=NULL && *buf!=NULL) {
00157 if ((*buf)->buf!=NULL) free((*buf)->buf);
00158 (*buf)->buf = NULL;
00159 free(*buf);
00160 *buf = NULL;
00161 }
00162 }
00163
00164
00165
00177 Buffer set_Buffer(void* dat, int len)
00178 {
00179 Buffer buf;
00180
00181 buf = init_Buffer();
00182 if (dat==NULL) return buf;
00183
00184 if (len<0) len = (int)strlen((char*)dat);
00185 buf = make_Buffer(len);
00186 if (buf.buf==NULL) return buf;
00187
00188 memcpy(buf.buf, dat, len);
00189 buf.vldsz = len;
00190 return buf;
00191 }
00192
00193
00199 Buffer make_Buffer_randomstr(int n)
00200 {
00201 char* str = random_str(n);
00202
00203 Buffer buf = set_Buffer(str, -1);
00204 free(str);
00205
00206 return buf;
00207 }
00208
00209
00210
00219 Buffer dup_Buffer(Buffer buf)
00220 {
00221 Buffer str = buf;
00222
00223 if (buf.bufsz>=0 && buf.buf!=NULL) {
00224 str.buf = (unsigned char*)malloc(buf.bufsz+1);
00225 memcpy(str.buf, buf.buf, buf.bufsz);
00226 str.buf[buf.bufsz] = '\0';
00227 }
00228
00229 return str;
00230 }
00231
00232
00233
00243 Buffer rept_Buffer(unsigned char cc, int n)
00244 {
00245 int i;
00246 Buffer str;
00247
00248 if (n<=0) n = 1;
00249 str = make_Buffer(n);
00250 for (i=0; i<n; i++) str.buf[i] = cc;
00251 str.vldsz = n;
00252 return str;
00253 }
00254
00255
00256
00263 void expand_Buffer(Buffer* buf, int len)
00264 {
00265 if (buf->bufsz>len) return;
00266
00267 Buffer expand = make_Buffer(len);
00268 copy_Buffer(buf, &expand);
00269 free_Buffer(buf);
00270
00271 *buf = expand;
00272 }
00273
00274
00275
00283 void clear_Buffer(Buffer* str)
00284 {
00285 if (str->buf!=NULL) memset(str->buf, 0, str->bufsz+1);
00286 str->vldsz = 0;
00287 str->state = JBXL_NORMAL;
00288 }
00289
00290
00291
00327 int copy_Buffer(Buffer* src, Buffer* dst)
00328 {
00329 int sz, dz;
00330
00331 if (src==NULL || dst==NULL) return JBXL_NULL_ERROR;
00332 if (src->buf==NULL) return JBXL_NULL_ERROR;
00333
00334 sz = src->vldsz;
00335 if (sz<0) sz = (int)strlen((const char*)src->buf);
00336 if (sz==0) return 0;
00337
00338 if (dst->bufsz < sz) {
00339 unsigned char* buf;
00340
00341 dz = (int)((sz+1)*BUFFER_FACT);
00342 buf = (unsigned char*)malloc(dz+1);
00343 if (buf==NULL) return JBXL_MALLOC_ERROR;
00344
00345 free(dst->buf);
00346 dst->bufsz = dz;
00347 dst->buf = buf;
00348 }
00349
00350
00351 memcpy(dst->buf, src->buf, sz);
00352 dst->buf[sz] = '\0';
00353 dst->vldsz = sz;
00354
00355 return sz;
00356 }
00357
00358
00359
00396 int cat_Buffer(Buffer* src, Buffer* dst)
00397 {
00398 int sz, dz;
00399
00400 if (src==NULL || dst==NULL) return JBXL_NULL_ERROR;
00401 if (src->buf==NULL) return JBXL_NULL_ERROR;
00402
00403 sz = src->vldsz;
00404 if (sz<0) sz = (int)strlen((const char*)src->buf);
00405 if (sz==0) return 0;
00406
00407 dz = dst->vldsz;
00408 if (dz<0) {
00409 if (dst->buf!=NULL) dz = (int)strlen((const char*)dst->buf);
00410 else dz = 0;
00411 }
00412
00413 if (dst->bufsz < sz+dz) {
00414 Buffer buf;
00415 buf.state = dst->state;
00416 buf.bufsz = (int)((dst->bufsz+sz+1)*BUFFER_FACT);
00417 buf.vldsz = dz;
00418 buf.buf = (unsigned char*)malloc(buf.bufsz+1);
00419 if (buf.buf==NULL) return JBXL_MALLOC_ERROR;
00420
00421 memcpy(buf.buf, dst->buf, dz);
00422 buf.buf[dz] = '\0';
00423 free_Buffer(dst);
00424 *dst = buf;
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447 }
00448
00449
00450 memcpy(dst->buf+dz, src->buf, sz);
00451 dst->buf[dz+sz] = '\0';
00452 dst->vldsz = sz + dz;
00453
00454 return dst->vldsz;
00455 }
00456
00457
00458
00471 int ins_Buffer(Buffer* src, Buffer* dst)
00472 {
00473 Buffer tmp = make_Buffer(src->bufsz + dst->bufsz);
00474
00475 int ret = copy_Buffer(src, &tmp);
00476 if (ret<0) {
00477 free_Buffer(&tmp);
00478 return ret;
00479 }
00480
00481 ret = cat_Buffer(dst, &tmp);
00482 if (ret<0) {
00483 free_Buffer(&tmp);
00484 return ret;
00485 }
00486
00487 free_Buffer(dst);
00488 *dst = tmp;
00489
00490 return dst->vldsz;
00491 }
00492
00493
00494
00532 int copy_b2Buffer(void* src, Buffer* dst, int len)
00533 {
00534 int sz, dz;
00535
00536 if (src==NULL || dst==NULL) return JBXL_NULL_ERROR;
00537 if (len<0) sz = (int)strlen((const char*)src);
00538 else sz = len;
00539 if (sz<=0) return 0;
00540
00541 if (dst->bufsz < sz) {
00542 unsigned char* buf;
00543 dz = (int)((sz+1)*BUFFER_FACT);
00544 buf = (unsigned char*)malloc(dz+1);
00545 if (buf==NULL) return JBXL_MALLOC_ERROR;
00546 if (dst->buf!=NULL) free(dst->buf);
00547 dst->bufsz = dz;
00548 dst->buf = buf;
00549 }
00550
00551 memcpy(dst->buf, src, sz);
00552 dst->buf[sz] = '\0';
00553 dst->vldsz = sz;
00554 dst->state = JBXL_NORMAL;
00555
00556 return sz;
00557 }
00558
00559
00560
00598 int cat_b2Buffer(void* src, Buffer* dst, int len)
00599 {
00600 int sz, dz;
00601
00602 if (src==NULL || dst==NULL) return JBXL_NULL_ERROR;
00603 if (len<0) sz = (int)strlen((const char*)src);
00604 else sz = len;
00605 if (sz<=0) return 0;
00606
00607 dz = dst->vldsz;
00608 if (dz<0) {
00609 if (dst->buf!=NULL) dz = (int)strlen((const char*)dst->buf);
00610 else dz = 0;
00611 }
00612
00613 if (dst->bufsz < sz+dz) {
00614 Buffer buf;
00615 buf.state = dst->state;
00616 buf.bufsz = (int)((dst->bufsz+sz+1)*BUFFER_FACT);
00617 buf.vldsz = dz;
00618 buf.buf = (unsigned char*)malloc(buf.bufsz+1);
00619 if (buf.buf==NULL) return JBXL_MALLOC_ERROR;
00620
00621 memcpy(buf.buf, dst->buf, dz);
00622 buf.buf[dz] = '\0';
00623 free_Buffer(dst);
00624 *dst = buf;
00625 }
00626
00627 memcpy(dst->buf+dz, src, sz);
00628 dst->buf[dz+sz] = '\0';
00629 dst->vldsz = sz + dz;
00630
00631 return dst->vldsz;
00632 }
00633
00634
00635
00650 int ins_b2Buffer(void* src, Buffer* dst, int len)
00651 {
00652 Buffer tmp = make_Buffer(dst->bufsz+len);
00653
00654 int ret = copy_b2Buffer(src, &tmp, len);
00655 if (ret<0) {
00656 free_Buffer(&tmp);
00657 return ret;
00658 }
00659
00660 ret = cat_Buffer(dst, &tmp);
00661 if (ret<0) {
00662 free_Buffer(&tmp);
00663 return ret;
00664 }
00665
00666 free_Buffer(dst);
00667 *dst = tmp;
00668
00669 return dst->vldsz;
00670 }
00671
00672
00673
00679 int copy_i2Buffer(int src, Buffer* dst)
00680 {
00681 char num[LEN_INT];
00682
00683 snprintf(num, LEN_INT-1, "%d", src);
00684 return copy_b2Buffer((void*)num, dst, (int)strlen(num));
00685 }
00686
00687
00688
00694 int cat_i2Buffer(int src, Buffer* dst)
00695 {
00696 char num[LEN_INT];
00697
00698 snprintf(num, LEN_INT-1, "%d", src);
00699 return cat_b2Buffer((void*)num, dst, (int)strlen(num));
00700 }
00701
00702
00703
00709 int ins_i2Buffer(int src, Buffer* dst)
00710 {
00711 char num[LEN_INT];
00712
00713 snprintf(num, LEN_INT-1, "%d", src);
00714 return ins_b2Buffer((void*)num, dst, (int)strlen(num));
00715 }
00716
00717
00718
00738 int cmp_Buffer(Buffer src, Buffer dst, int n)
00739 {
00740 int i;
00741
00742 if (src.buf==NULL || dst.buf==NULL) return JBXL_NULL_ERROR;
00743 if (n>src.vldsz || n>dst.vldsz) return JBXL_BUFFER_CMP_ERROR;
00744
00745 if (n<=0) {
00746 if (src.vldsz!=dst.vldsz) return 1;
00747 else n = src.vldsz;
00748 }
00749
00750 for (i=0; i<n; i++) {
00751 if (src.buf[i]!=dst.buf[i]) return 1;
00752 }
00753 return 0;
00754 }
00755
00756
00757
00781 Buffer encode_base64_Buffer(Buffer buf)
00782 {
00783 unsigned char* bas;
00784 int sz;
00785 Buffer ecd = init_Buffer();
00786
00787
00788 if (buf.buf==NULL) return ecd;
00789 if (buf.vldsz<0) sz = (int)strlen((const char*)buf.buf);
00790 else sz = buf.vldsz;
00791 if (sz<=0) return ecd;
00792
00793 bas = encode_base64(buf.buf, sz);
00794 if (bas==NULL) return ecd;
00795
00796 sz = ((sz + 2)/3)*4 + 1;
00797 ecd = make_Buffer(sz);
00798 if (ecd.buf==NULL) {
00799 free(bas);
00800 return ecd;
00801 }
00802
00803 copy_s2Buffer((char*)bas, &ecd);
00804
00805 free(bas);
00806 return ecd;
00807 }
00808
00809
00810
00828 Buffer decode_base64_Buffer(Buffer str)
00829 {
00830 unsigned char* bas;
00831 int sz;
00832 Buffer dcd = init_Buffer();
00833
00834 if (str.buf==NULL) return dcd;
00835
00836 bas = decode_base64(str.buf, &sz);
00837 if (bas==NULL) return dcd;
00838
00839 dcd = make_Buffer(sz);
00840 if (dcd.buf==NULL) {
00841 free(bas);
00842 return dcd;
00843 }
00844
00845 copy_b2Buffer(bas, &dcd, sz);
00846 dcd.vldsz = sz;
00847
00848 free(bas);
00849 return dcd;
00850 }
00851
00852
00853
00859 Buffer encode_base64_filename_Buffer(Buffer buf)
00860 {
00861 Buffer enc = encode_base64_Buffer(buf);
00862
00863 int i;
00864 for (i=0; i<enc.vldsz; i++) {
00865 if (enc.buf[i]=='/') enc.buf[i] = '$';
00866 }
00867
00868 return enc;
00869 }
00870
00871
00877 Buffer decode_base64_filename_Buffer(Buffer str)
00878 {
00879 int i;
00880 for (i=0; i<str.vldsz; i++) {
00881 if (str.buf[i]=='$') str.buf[i] = '/';
00882 }
00883
00884 Buffer dec = decode_base64_Buffer(str);
00885
00886 return dec;
00887 }
00888
00889
00890
00903 Buffer get_line_Buffer(Buffer str, int n)
00904 {
00905 int i, j, pos, cnt;
00906 unsigned char* buf;
00907
00908 Buffer ret = init_Buffer();
00909 if (str.buf==NULL) return ret;
00910
00911 buf = str.buf;
00912 for(i=0,j=0; j<n-1; j++) {
00913 while (buf[i]!=CHAR_LF && buf[i]!=CHAR_CR && buf[i]!='\0') i++;
00914 while (buf[i]==CHAR_LF || buf[i]==CHAR_CR) i++;
00915 }
00916 if (buf[i]=='\0') return ret;
00917
00918 pos = i;
00919 while (buf[i]!=CHAR_LF && buf[i]!=CHAR_CR && buf[i]!='\0') i++;
00920 cnt = i - pos;
00921
00922 if (cnt>=0) {
00923 ret = make_Buffer(cnt+1);
00924 if (ret.buf==NULL) return str;
00925
00926 for(i=0; i<cnt; i++) ret.buf[i] = buf[pos+i];
00927 ret.buf[cnt] = '\0';
00928 }
00929
00930 ret.vldsz = (int)strlen((const char*)ret.buf);
00931
00932 return ret;
00933 }
00934
00935
00936
00951 Buffer get_seq_data_Buffer(Buffer str, int* ptr)
00952 {
00953 int i, pos, cnt;
00954 unsigned char* buf;
00955
00956 Buffer ret = init_Buffer();
00957
00958 if (str.buf==NULL) return ret;
00959 if (str.vldsz<=0) str.vldsz = (int)strlen((const char*)str.buf);
00960 if (*ptr >= str.vldsz) return ret;
00961
00962 buf = str.buf;
00963 pos = *ptr;
00964 while (buf[*ptr]!=CHAR_LF && buf[*ptr]!=CHAR_CR && buf[*ptr]!='\0') (*ptr)++;
00965 cnt = *ptr - pos;
00966
00967 if (cnt>=0) {
00968 ret = make_Buffer(cnt+1);
00969 if (ret.buf==NULL) return ret;
00970
00971 for(i=0; i<cnt; i++) ret.buf[i] = buf[pos+i];
00972 ret.buf[cnt] = '\0';
00973 }
00974
00975 ret.vldsz = (int)strlen((const char*)ret.buf);
00976
00977
00978 while (buf[*ptr]==CHAR_LF || buf[*ptr]==CHAR_CR) (*ptr)++;
00979
00980 return ret;
00981 }
00982
00983
00984
00999 Buffer awk_Buffer(Buffer str, char cc, int n)
01000 {
01001 int i, j, pos, cnt;
01002 unsigned char* buf = str.buf;
01003 Buffer item = init_Buffer();
01004
01005 if (buf==NULL) return item;
01006 if (n<=0) n = 1;
01007
01008 for(i=0,j=0; j<n-1; j++) {
01009 while (buf[i]!='\0' && buf[i]!=cc) i++;
01010 if (buf[i]==cc) i++;
01011 }
01012 if (buf[i]=='\0') return item;
01013
01014 pos = i;
01015 while (buf[i]!='\0' && buf[i]!=cc) i++;
01016 cnt = i - pos;
01017
01018 item = make_Buffer(cnt);
01019 if (item.buf==NULL) return item;
01020
01021 for (i=0; i<cnt; i++) item.buf[i] = buf[pos+i];
01022 item.vldsz = (int)strlen((const char*)item.buf);
01023
01024 return item;
01025 }
01026
01027
01028
01044 Buffer cawk_Buffer(Buffer str, char cc, int n)
01045 {
01046 int i, j, pos, cnt;
01047 unsigned char* buf = str.buf;
01048 Buffer item = init_Buffer();
01049
01050 if (buf==NULL) return item;
01051 if (n<=0) n = 1;
01052
01053 i = 0;
01054 for(j=0; j<n-1; j++) {
01055 while (buf[i]!='\0' && buf[i]!=cc) i++;
01056 while (buf[i]!='\0' && buf[i]==cc) i++;
01057 }
01058 if (buf[i]=='\0') return item;
01059
01060 pos = i;
01061 while (buf[i]!='\0' && buf[i]!=cc) i++;
01062 cnt = i - pos;
01063
01064 item = make_Buffer(cnt);
01065 if (item.buf==NULL) return item;
01066
01067 for (i=0; i<cnt; i++) item.buf[i] = buf[pos+i];
01068 item.vldsz = (int)strlen((const char*)item.buf);
01069
01070 return item;
01071 }
01072
01073
01074
01085 Buffer pack_Buffer(Buffer buf, char cc)
01086 {
01087 Buffer res = init_Buffer();
01088
01089 if (buf.buf==NULL) return res;
01090
01091 res.buf = (unsigned char*)pack_char((char*)buf.buf, cc);
01092 res.vldsz = (int)strlen((char*)res.buf);
01093 res.bufsz = res.vldsz;
01094
01095 return res;
01096 }
01097
01098
01099
01109 void kanji_convert_Buffer(Buffer* str)
01110 {
01111 int i;
01112 unsigned char *c1, *c2;
01113
01114 if (KanjiCode==CODE_SJIS) {
01115 i = 0;
01116 while(str->buf[i]!='\0'){
01117 c1 = &(str->buf[i]);
01118 c2 = c1 + 1;
01119 if(*c1>=0xa1 && *c1<=0xfe){
01120 euc2sjis(c1, c2);
01121 i = i + 2;
01122 }
01123 else i++;
01124 }
01125 }
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140 }
01141
01142
01143
01152 Buffer randstr_Buffer(int n)
01153 {
01154 char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
01155 Buffer pass;
01156 int i, sz;
01157
01158 pass = make_Buffer(n);
01159 if (pass.buf==NULL) return pass;
01160
01161 sz = (int)strlen(base);
01162 for (i=0; i<n; i++) pass.buf[i] = base[rand()%sz];
01163 pass.vldsz = n;
01164
01165 return pass;
01166 }
01167
01168
01169
01178 Buffer randbit_Buffer(int n)
01179 {
01180 int i, sz;
01181 Buffer str;
01182
01183 sz = (n+7)/8;
01184 str = make_Buffer(sz);
01185 if (str.buf==NULL) return str;
01186 str.vldsz = sz;
01187
01188 for (i=0; i<n; i++) setBit(str.buf, i, rand()%2);
01189 return str;
01190 }
01191
01192
01193
01194 #define DUMP_BUFFER_LINE_SIZE 85 // 16*5("%02x "+"%c ") + 5(" "+"\r\n");
01195 #define DUMP_BUFFER_DELI_START 48 // 16*3("%02x ")
01196 #define DUMP_BUFFER_CHAR_START 51 // 16*3("%02x ") + 3(" ")
01197
01209 Buffer dump_Buffer(Buffer buf)
01210 {
01211 int sz;
01212 char wrkbuf[10];
01213 Buffer str = init_Buffer();
01214
01215 if (buf.buf==NULL) return str;
01216 if (buf.vldsz<0) sz = (int)strlen((const char*)buf.buf) + 1;
01217 else sz = buf.vldsz;
01218
01219 int lineno = (sz + 15)/16;
01220 str = make_Buffer(lineno*DUMP_BUFFER_LINE_SIZE+1);
01221
01222 int l;
01223 for (l=0; l<lineno; l++) {
01224 int sp = l*DUMP_BUFFER_LINE_SIZE;
01225 int i = 0;
01226 while (i<16) {
01227 sprintf(wrkbuf, "%02x ", buf.buf[l*16+i]);
01228 memcpy(str.buf+sp+i*3, wrkbuf, 3);
01229
01230 if (buf.buf[l*16+i]>=0x20 && buf.buf[l*16+i]<=0x7e) {
01231 sprintf(wrkbuf, "%c ", buf.buf[l*16+i]);
01232 memcpy(str.buf+sp+DUMP_BUFFER_CHAR_START+i*2, wrkbuf, 2);
01233 }
01234 else {
01235 memcpy(str.buf+sp+DUMP_BUFFER_CHAR_START+i*2, ". ", 2);
01236 }
01237
01238 if (l*16+i>=sz) {
01239 memcpy(str.buf+sp+i*3, " ", 3);
01240 memcpy(str.buf+sp+DUMP_BUFFER_CHAR_START+i*2, " ", 2);
01241 }
01242
01243 i++;
01244 }
01245 memcpy(str.buf+sp+DUMP_BUFFER_DELI_START, " ", 3);
01246 str.buf[sp+DUMP_BUFFER_LINE_SIZE-2] = '\r';
01247 str.buf[sp+DUMP_BUFFER_LINE_SIZE-1] = '\n';
01248 }
01249
01250 str.vldsz = lineno*DUMP_BUFFER_LINE_SIZE;
01251 return str;
01252 }
01253
01254
01255
01266 int recalc_strlen_Buffer(Buffer* buf)
01267 {
01268 int len = (int)strlen((char*)buf->buf);
01269 buf->vldsz = len;
01270 return len;
01271 }
01272
01273
01274
01283 void chomp_Buffer(Buffer* str)
01284 {
01285 int i, len;
01286
01287 if (str->buf==NULL) return;
01288
01289 len = (int)strlen((const char*)str->buf);
01290 for (i=0; i<len; i++) {
01291 if (str->buf[i]==CHAR_LF || str->buf[i]==CHAR_CR) {
01292 str->buf[i] = '\0';
01293 str->vldsz = (int)strlen((const char*)str->buf);
01294 return;
01295 }
01296 }
01297 }
01298
01299
01300
01310 int isText_Buffer(Buffer buf)
01311 {
01312 if (buf.vldsz==(int)strlen((const char*)buf.buf)) return TRUE;
01313 return FALSE;
01314 }
01315
01316
01317
01318
01320
01321
01322
01333 int fgets_Buffer(Buffer* str, FILE* fp)
01334 {
01335 char* p;
01336 int n, m;
01337 UNUSED(p);
01338
01339 memset(str->buf, 0, str->bufsz);
01340 p = fgets((char*)str->buf, str->bufsz, fp);
01341 m = (int)strlen((const char*)str->buf);
01342
01343 n = 0;
01344 while(str->buf[n]!=CHAR_LF && str->buf[n]!=CHAR_CR && str->buf[n]!='\0') n++;
01345 str->buf[n] = '\0';
01346 str->vldsz = n;
01347
01348
01349
01350 return m;
01351 }
01352
01353
01354
01365 int read_lines_Buffer(Buffer* str, FILE* fp)
01366 {
01367 Buffer buf;
01368 char* pp;
01369 UNUSED(pp);
01370
01371 buf = make_Buffer(str->bufsz);
01372 if (buf.buf==NULL) return JBXL_BUFFER_MAKE_ERROR;
01373
01374 pp = fgets((char*)buf.buf, buf.bufsz, fp);
01375 buf.vldsz = (int)strlen((const char*)buf.buf);
01376 copy_Buffer(&buf, str);
01377 clear_Buffer(&buf);
01378
01379 while (!feof(fp)) {
01380 pp = fgets((char*)buf.buf, buf.bufsz, fp);
01381 buf.vldsz = (int)strlen((const char*)buf.buf);
01382 cat_Buffer(&buf, str);
01383 clear_Buffer(&buf);
01384 }
01385
01386 free_Buffer(&buf);
01387 return str->vldsz;
01388 }
01389
01390
01391
01400 Buffer read_Buffer_file(const char* fn)
01401 {
01402 int sz;
01403 Buffer buf;
01404 FILE* fp;
01405
01406 buf = init_Buffer();
01407
01408 sz = file_size(fn);
01409 if (sz<=0) return buf;
01410
01411 fp = fopen(fn, "rb");
01412 if (fp==NULL) return buf;
01413
01414 buf = read_Buffer_data(fp, sz);
01415 fclose(fp);
01416
01417 return buf;
01418 }
01419
01420
01421
01431 Buffer read_Buffer_data(FILE* fp, int sz)
01432 {
01433 int cc;
01434 Buffer buf;
01435
01436 buf = init_Buffer();
01437 if (sz<0) return buf;
01438
01439 buf = make_Buffer(sz);
01440 if (buf.buf==NULL) return buf;
01441 buf.vldsz = sz;
01442
01443 cc = (int)fread(buf.buf, buf.vldsz, 1, fp);
01444 if (cc!=1) {
01445 free_Buffer(&buf);
01446 return buf;
01447 }
01448
01449 return buf;
01450 }
01451
01452
01453
01465 int save_Buffer_file(Buffer buf, char* fn)
01466 {
01467 int cc;
01468 FILE* fp;
01469
01470 fp = fopen(fn, "wb");
01471 if (fp==NULL) return FALSE;
01472
01473 cc = (int)fwrite(buf.buf, buf.vldsz, 1, fp);
01474 if (cc!=1) return FALSE;
01475 fclose(fp);
01476
01477 return TRUE;
01478 }
01479
01480
01481
01482
01484
01485
01486
01498 Buffer erase_bBuffer(Buffer buf, char* bin, int len)
01499 {
01500 int i, j, n;
01501 char cc;
01502
01503 Buffer res = dup_Buffer(buf);
01504 Buffer wrk = make_Buffer(buf.vldsz+1);
01505
01506 for (i=0; i<len; i++) {
01507 cc = bin[i];
01508 n = 0;
01509 for (j=0; j<res.vldsz; j++) {
01510 if (cc!=res.buf[j]) wrk.buf[n++] = res.buf[j];
01511 }
01512 wrk.vldsz = n;
01513
01514 copy_Buffer(&wrk, &res);
01515 clear_Buffer(&wrk);
01516 }
01517
01518 free_Buffer(&wrk);
01519
01520 return res;
01521 }
01522
01523
01524
01538 Buffer replace_sBuffer_bystr(Buffer buf, const char* frm, const char* tos)
01539 {
01540 int i, j, flen, tlen;
01541 Buffer res;
01542
01543 res = init_Buffer();
01544 if (buf.buf==NULL || frm==NULL || tos==NULL) return res;
01545
01546 flen = (int)strlen(frm);
01547 tlen = (int)strlen(tos);
01548 if (buf.vldsz<=0) buf.vldsz = (int)strlen((const char*)buf.buf);
01549
01550 int difsz = tlen - flen;
01551 if (difsz<0) difsz = 0;
01552 else difsz = difsz*100;
01553 res = make_Buffer((int)((buf.vldsz+difsz+1)*BUFFER_FACT));
01554
01555 i = j = 0;
01556 while (i<buf.vldsz && j<res.bufsz) {
01557 if (!strncmp((const char*)(buf.buf+i), frm, flen)){
01558 res.vldsz = (int)strlen((const char*)res.buf);
01559 cat_s2Buffer(tos, &res);
01560 i += flen;
01561 j += tlen;
01562 }
01563 else {
01564 res.buf[j++] = buf.buf[i++];
01565 }
01566 }
01567
01568 if (j==res.bufsz) res.state = JBXL_ERROR;
01569 res.vldsz = (int)strlen((const char*)res.buf);
01570
01571 return res;
01572 }
01573
01574
01575
01588 int replace_sBuffer_file(char* fn, Buffer frm, Buffer tos)
01589 {
01590 int ret;
01591 Buffer buf, res;
01592
01593 buf = read_Buffer_file(fn);
01594 if (buf.buf==NULL) return FALSE;
01595
01596 res = replace_sBuffer(buf, (char*)frm.buf, (char*)tos.buf);
01597 free_Buffer(&buf);
01598 if (res.buf==NULL) return FALSE;
01599
01600 ret = save_Buffer_file(res, fn);
01601 free_Buffer(&buf);
01602
01603 return ret;
01604 }
01605
01606
01607
01618 void rewrite_sBuffer_bystr(Buffer* buf, const char* frm, const char* tos)
01619 {
01620 Buffer tmp = replace_sBuffer_bystr(*buf, frm, tos);
01621 if (tmp.state==JBXL_NORMAL) {
01622 free_Buffer(buf);
01623 *buf = tmp;
01624 }
01625 return;
01626 }
01627
01628
01629
01630
01632
01633
01634
01648 int save_Buffer2_fp(Buffer key, Buffer buf, FILE* fp)
01649 {
01650 int cc;
01651
01652 cc = save_Buffer_fp(key, fp);
01653 if (!cc) return FALSE;
01654
01655 cc = save_Buffer_fp(buf, fp);
01656 if (!cc) return FALSE;
01657
01658 return TRUE;
01659 }
01660
01661
01662
01675 int save_Buffer_fp(Buffer buf, FILE* fp)
01676 {
01677 int cc, sz;
01678
01679 sz = htonl(buf.vldsz);
01680 cc = (int)fwrite(&sz, sizeof(sz), 1, fp);
01681 if (cc!=1) return FALSE;
01682
01683 cc = (int)fwrite(buf.buf, buf.vldsz, 1, fp);
01684 if (cc!=1) return FALSE;
01685
01686 return TRUE;
01687 }
01688
01689
01690
01700 Buffer read_Buffer_fp(FILE* fp)
01701 {
01702 int cc, sz;
01703 Buffer buf;
01704
01705 buf = init_Buffer();
01706 cc = (int)fread(&sz, sizeof(sz), 1, fp);
01707 if (cc!=1) return buf;
01708 sz = ntohl(sz);
01709
01710 buf = make_Buffer(sz);
01711 if (buf.buf==NULL) return buf;
01712 buf.vldsz = sz;
01713 cc = (int)fread(buf.buf, buf.vldsz, 1, fp);
01714 if (cc!=1) {
01715 free_Buffer(&buf);
01716 return buf;
01717 }
01718
01719 return buf;
01720 }
01721
01722
01723
01737 int read_Buffer2_fp(Buffer* key, Buffer* buf, FILE* fp)
01738 {
01739 if (key==NULL || buf==NULL) return FALSE;
01740
01741 *key = init_Buffer();
01742 *buf = init_Buffer();
01743
01744 *key = read_Buffer_fp(fp);
01745 if (key->buf==NULL) return FALSE;
01746
01747 *buf = read_Buffer_fp(fp);
01748 if (buf->buf==NULL) {
01749 free_Buffer(key);
01750 return FALSE;
01751 }
01752
01753 return TRUE;
01754 }
01755
01756
01757
01758
01760
01761
01762
01763
01764
01765
01766
01767
01768
01774 char pop_char_ringStack(Buffer* buf)
01775 {
01776 buf->vldsz--;
01777 if (buf->vldsz<0) buf->vldsz = buf->bufsz - 1;
01778
01779 return (char)buf->buf[buf->vldsz];
01780 }
01781
01782
01783
01789 void push_char_ringStack(Buffer* buf, char cc)
01790 {
01791 buf->buf[buf->vldsz] = (unsigned char)cc;
01792 buf->vldsz++;
01793 if (buf->vldsz==buf->bufsz) buf->vldsz = 0;
01794
01795 return;
01796 }
01797
01798