00001
00017 #include "xtools.h"
00018
00019
00020
00022
00023
00024
00041 int udp_recv_Buffer_sockaddr_in(int sock, Buffer* str, struct sockaddr_in* sv_addr)
00042 {
00043 int cc, cadlen;
00044
00045 if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00046
00047 cadlen = sizeof(*sv_addr);
00048 memset(str->buf, 0, str->bufsz);
00049 str->vldsz = 0;
00050 str->state = JBXL_NORMAL;
00051 cc = recvfrom(sock, (char*)str->buf, str->bufsz, 0, (struct sockaddr*)sv_addr, (socklen_t*)&cadlen);
00052
00053 if (cc>=0) str->vldsz = cc;
00054 else str->state = cc = JBXL_NET_RECV_ERROR;
00055
00056 return cc;
00057 }
00058
00059
00060
00076 int udp_send_Buffer_sockaddr_in(int sock, Buffer* str, struct sockaddr_in* sv_addr)
00077 {
00078 int cc;
00079
00080 if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00081
00082 if (str->vldsz<0) str->vldsz = (int)strlen((const char*)str->buf);
00083 cc = sendto(sock, (char*)str->buf, str->vldsz, 0, (struct sockaddr*)sv_addr, sizeof(*sv_addr));
00084
00085 if (cc<0) cc = JBXL_NET_SEND_ERROR;
00086 return cc;
00087 }
00088
00089
00090
00104 int udp_send_sBuffer_sockaddr_in(int sock, Buffer* str, struct sockaddr_in* sv_addr)
00105 {
00106 int cc;
00107
00108 if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00109
00110 cc = sendto(sock, (char*)str->buf, (int)strlen((const char*)str->buf), 0, (struct sockaddr*)sv_addr, sizeof(*sv_addr));
00111 if (cc<0) cc = JBXL_NET_SEND_ERROR;
00112
00113 return cc;
00114 }
00115
00116
00135 int udp_recv_Buffer_wait_sockaddr_in(int sock, Buffer* str, struct sockaddr_in* sv_addr, int tm)
00136 {
00137 int cc;
00138
00139 if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00140
00141
00142 str->vldsz = 0;
00143 cc = udp_recv_wait_sockaddr_in(sock, (char*)str->buf, str->bufsz, sv_addr, tm);
00144 if (cc>=0) str->vldsz = cc;
00145
00146 return cc;
00147 }
00148
00149
00150
00162 struct sockaddr_in get_sockaddr_in_Buffer(Buffer buf)
00163 {
00164 int i, port = 0;
00165 struct sockaddr_in addr;
00166 memset(&addr, 0, sizeof(struct sockaddr_in));
00167
00168 if (buf.buf==NULL) return addr;
00169
00170 i = 0;
00171 while (buf.buf[i]!='\0' && buf.buf[i]!=':') i++;
00172 buf.buf[i] = '\0';
00173
00174 port = atoi((char*)&buf.buf[i+1]);
00175 addr = get_sockaddr_in((char*)buf.buf, port);
00176
00177 return addr;
00178 }
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00201
00202
00203
00204
00221 int udp_recv_Buffer(int sock, Buffer* str, struct addrinfo* sv_addr)
00222 {
00223 int cc;
00224 socklen_t cadlen;
00225
00226 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00227 if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00228
00229 cadlen = (int)sv_addr->ai_addrlen;
00230 memset(str->buf, 0, str->bufsz);
00231 str->vldsz = 0;
00232 str->state = JBXL_NORMAL;
00233 cc = recvfrom(sock, (char*)str->buf, str->bufsz, 0, sv_addr->ai_addr, &cadlen);
00234
00235 if (cc>=0) str->vldsz = cc;
00236 else str->state = cc = JBXL_NET_RECV_ERROR;
00237
00238 return cc;
00239 }
00240
00241
00242
00258 int udp_send_Buffer(int sock, Buffer* str, struct addrinfo* sv_addr)
00259 {
00260 int cc;
00261
00262 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00263 if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00264
00265 if (str->vldsz<0) str->vldsz = (int)strlen((const char*)str->buf);
00266 cc = sendto(sock, (char*)str->buf, str->vldsz, 0, sv_addr->ai_addr, (int)sv_addr->ai_addrlen);
00267
00268 if (cc<0) cc = JBXL_NET_SEND_ERROR;
00269
00270 return cc;
00271 }
00272
00273
00274
00287 int tcp_recv_Buffer(int sock, Buffer* str)
00288 {
00289 int cc;
00290
00291 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00292
00293 memset(str->buf, 0, str->bufsz);
00294 str->vldsz = 0;
00295 str->state = JBXL_NORMAL;
00296 cc = recv(sock, (char*)str->buf, str->bufsz, 0);
00297
00298 if (cc>=0) str->vldsz = cc;
00299 else str->state = cc = JBXL_NET_RECV_ERROR;
00300
00301 return cc;
00302 }
00303
00304
00305
00317 int tcp_send_Buffer(int sock, Buffer* str)
00318 {
00319 int cc;
00320
00321 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00322
00323 if (str->vldsz<0) str->vldsz = (int)strlen((const char*)str->buf);
00324 cc = send(sock, (char*)str->buf, str->vldsz, 0);
00325
00326 if (cc<0) cc = JBXL_NET_SEND_ERROR;
00327 return cc;
00328 }
00329
00330
00331
00350 int udp_recv_Buffer_wait(int sock, Buffer* str, struct addrinfo* sv_addr, int tm)
00351 {
00352 int cc;
00353
00354 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00355 if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00356
00357
00358 str->vldsz = 0;
00359 cc = udp_recv_wait(sock, (char*)str->buf, str->bufsz, sv_addr, tm);
00360 if (cc>=0) str->vldsz = cc;
00361
00362 return cc;
00363 }
00364
00365
00366
00384 int tcp_recv_Buffer_wait(int sock, Buffer* str, int tm)
00385 {
00386 int cc;
00387
00388 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00389
00390
00391 str->vldsz = 0;
00392 cc = tcp_recv_wait(sock, (char*)str->buf, str->bufsz, tm);
00393 if (cc>=0) str->vldsz = cc;
00394
00395 return cc;
00396 }
00397
00398
00399
00415 int tcp_recv_Buffer_tosize(int sock, Buffer* str, Buffer* mod, int size)
00416 {
00417 int cc, sz;
00418 int modon = FALSE;
00419
00420 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00421 if (mod!=NULL && mod->buf!=NULL) modon = TRUE;
00422
00423 if (modon) memset(mod->buf, 0, mod->vldsz);
00424 Buffer buf = make_Buffer(RECVBUFSZ);
00425
00426 sz = str->vldsz;
00427 while (sz<size) {
00428 cc = tcp_recv_Buffer(sock, &buf);
00429 if (cc>0) {
00430 cat_Buffer(&buf, str);
00431 sz += cc;
00432 }
00433 else {
00434 if (cc<0) sz = cc;
00435 break;
00436 }
00437 }
00438 free_Buffer(&buf);
00439
00440 if (sz>size && modon) {
00441 copy_b2Buffer((void*)(str->buf+size), mod, sz-size);
00442 str->vldsz = size;
00443 }
00444 return sz;
00445 }
00446
00447
00448
00469 int tcp_recv_Buffer_tosize_wait(int sock, Buffer* str, Buffer* mod, int size, int tm)
00470 {
00471 int cc, sz;
00472 int modon = FALSE;
00473
00474 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00475 if (mod!=NULL && mod->buf!=NULL) modon = TRUE;
00476
00477 if (modon) memset(mod->buf, 0, mod->vldsz);
00478 Buffer buf = make_Buffer(RECVBUFSZ);
00479
00480 sz = str->vldsz;
00481 while (sz<size) {
00482 cc = tcp_recv_Buffer_wait(sock, &buf, tm);
00483 if (cc>0) {
00484 cat_Buffer(&buf, str);
00485 sz += cc;
00486 }
00487 else {
00488 if (cc<0) sz = cc;
00489 break;
00490 }
00491 }
00492 free_Buffer(&buf);
00493
00494 if (sz>size && modon) {
00495 copy_b2Buffer((void*)(str->buf+size), mod, sz-size);
00496 str->vldsz = size;
00497 }
00498 return sz;
00499 }
00500
00501
00502
00516 int udp_send_sBuffer(int sock, Buffer* str, struct addrinfo* sv_addr)
00517 {
00518 int cc;
00519
00520 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00521 if (sv_addr==NULL) return JBXL_ARGS_ERROR;
00522
00523 cc = sendto(sock, (char*)str->buf, (int)strlen((const char*)str->buf), 0, sv_addr->ai_addr, (int)sv_addr->ai_addrlen);
00524 if (cc<0) cc = JBXL_NET_SEND_ERROR;
00525
00526 return cc;
00527 }
00528
00529
00530
00542 int tcp_send_sBuffer(int sock, Buffer* str)
00543 {
00544 int cc;
00545
00546 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00547
00548 cc = send(sock, (char*)str->buf, (int)strlen((const char*)str->buf), 0);
00549 return cc;
00550 }
00551
00552
00553
00565 int tcp_send_sBufferln(int sock, Buffer* str)
00566 {
00567 int cc;
00568 Buffer buf;
00569
00570 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
00571
00572 buf = dup_Buffer(*str);
00573 cat_s2Buffer("\r\n", &buf);
00574 cc = send(sock, (char*)buf.buf, (int)strlen((const char*)buf.buf), 0);
00575 free_Buffer(&buf);
00576
00577 return cc;
00578 }
00579
00580
00581
00612 int tcp_recv_mstream_Buffer(int sock, Buffer* mesg, mstream* sb, int tm)
00613 {
00614 int cc;
00615 unsigned char* pp;
00616
00617 if (mesg==NULL || sb==NULL) return JBXL_ARGS_ERROR;
00618 *mesg = make_Buffer(LBUF);
00619
00620 if (sb->buf==NULL) {
00621 *sb = make_mstream(RECVBUFSZ);
00622 if (sb->buf==NULL) return JBXL_MALLOC_ERROR;
00623 }
00624
00625 while (sb->datano==0) {
00626 cc = tcp_recv_Buffer_wait(sock, mesg, tm);
00627 if (cc<=0) {
00628 free_Buffer(mesg);
00629 return cc;
00630 }
00631 put_mstream(sb, mesg->buf);
00632 clear_Buffer(mesg);
00633 }
00634
00635 pp = get_mstream(sb);
00636 if (pp==NULL) return JBXL_NET_BUF_ERROR;
00637 copy_s2Buffer((char*)pp, mesg);
00638 free(pp);
00639
00640 return mesg->vldsz;
00641 }
00642
00643
00644
00667 int tcp_recv_lines_Buffer(int sock, Buffer* mesg, int tm)
00668 {
00669 int cc;
00670 Buffer buf;
00671
00672 if (mesg==NULL) return JBXL_ARGS_ERROR;
00673 buf = make_Buffer(LBUF);
00674
00675 cc = tcp_recv_Buffer_wait(sock, &buf, tm);
00676 while (cc>0) {
00677 cat_Buffer(&buf, mesg);
00678 if (buf.buf[cc-1]==CHAR_LF) break;
00679 clear_Buffer(&buf);
00680 cc = tcp_recv_Buffer_wait(sock, &buf, tm);
00681 }
00682 free_Buffer(&buf);
00683
00684 if (cc<=0) {
00685 free_Buffer(mesg);
00686 return cc;
00687 }
00688
00689 return mesg->vldsz;
00690 }
00691
00692
00693
00695
00696
00697
00708 Buffer comp_hostport(char* host, unsigned short port)
00709 {
00710 Buffer buf;
00711 char hostport[LBUF];
00712
00713 hostport[0] = '\0';
00714
00715 if (host!=NULL) {
00716 if (port!=0) snprintf(hostport, LBUF-1, "%s:%d", host, port);
00717 else snprintf(hostport, LBUF-1, "%s", host);
00718 }
00719 else {
00720 if (port!=0) snprintf(hostport, LBUF-1, "%d", port);
00721 }
00722
00723 buf = make_Buffer_bystr(hostport);
00724
00725 return buf;
00726 }
00727
00728
00729
00742 int decomp_hostport(Buffer buf, Buffer* host, unsigned short* port)
00743 {
00744 if (buf.buf==NULL) return FALSE;
00745
00746 if (port!=NULL) {
00747 int i = 0;
00748 while (buf.buf[i]!='\0' && buf.buf[i]!=':') i++;
00749 if (buf.buf[i]!='\0') *port = (unsigned short)atoi((char*)&buf.buf[i+1]);
00750 else *port = 0;
00751 }
00752
00753 if (host!=NULL) {
00754 Buffer hostport = dup_Buffer(buf);
00755
00756 int i = 0;
00757 while (hostport.buf[i]!='\0' && hostport.buf[i]!=':') i++;
00758 hostport.buf[i] = '\0';
00759 hostport.vldsz = (int)strlen((char*)hostport.buf);
00760 *host = hostport;
00761 }
00762
00763 return TRUE;
00764 }
00765
00766
00767
00780 Buffer comp_url(char* protocol, char* host, unsigned short port, char* dir)
00781 {
00782 Buffer url;
00783 char num[20];
00784
00785 url = make_Buffer(LNAME);
00786
00787 if (protocol!=NULL) {
00788 copy_s2Buffer(protocol, &url);
00789 cat_s2Buffer("://", &url);
00790 }
00791
00792 cat_s2Buffer(host, &url);
00793
00794 if (port!=0) {
00795 snprintf(num, 10, ":%d", port);
00796 cat_s2Buffer(num, &url);
00797 }
00798
00799 if (dir!=NULL) {
00800 if (dir[0]!='/') cat_s2Buffer("/", &url);
00801 cat_s2Buffer(dir, &url);
00802 }
00803
00804 return url;
00805 }
00806
00807
00808
00831 int decomp_url(Buffer url, Buffer* srvurl, Buffer* protocol, Buffer* srvfqdn, unsigned short* sport, Buffer* srvdir)
00832 {
00833 Buffer item1, item2, item3, item4, wrk;
00834
00835 if (srvurl !=NULL) *srvurl = init_Buffer();
00836 if (protocol!=NULL) *protocol = init_Buffer();
00837 if (srvfqdn !=NULL) *srvfqdn = init_Buffer();
00838 if (srvdir !=NULL) *srvdir = init_Buffer();
00839 if (sport !=NULL) *sport = 0;
00840 if (url.buf ==NULL) return FALSE;
00841
00842 item1 = init_Buffer();
00843 item2 = init_Buffer();
00844 item3 = init_Buffer();
00845 item4 = init_Buffer();
00846
00847 if (strstr((char*)url.buf, "://")!=NULL) {
00848
00849 item1 = awk_Buffer(url, '/', 1);
00850 item2 = awk_Buffer(url, '/', 3);
00851 if (protocol!=NULL) {
00852 *protocol = dup_Buffer(item1);
00853 protocol->buf[protocol->vldsz-1] = '\0';
00854 protocol->vldsz--;
00855 }
00856 }
00857 else {
00858
00859 item2 = awk_Buffer(url, '/', 1);
00860 }
00861
00862 if (item2.buf!=NULL) {
00863 item3 = awk_Buffer(item2, ':', 1);
00864 if (item3.buf==NULL) {
00865 free_Buffer(&item1);
00866 free_Buffer(&item2);
00867 return FALSE;
00868 }
00869 item4 = awk_Buffer(item2, ':', 2);
00870 }
00871 else {
00872 free_Buffer(&item1);
00873 return FALSE;
00874 }
00875
00876 if (item4.buf!=NULL && sport!=NULL) {
00877 *sport = (unsigned short)atoi((char*)item4.buf);
00878 }
00879
00880 wrk = make_Buffer(LBUF);
00881 if (item1.buf!=NULL) {
00882 copy_Buffer(&item1, &wrk);
00883 cat_s2Buffer("//", &wrk);
00884 }
00885 cat_Buffer(&item2, &wrk);
00886
00887 if (item3.buf!=NULL) {
00888 if (srvfqdn!=NULL) *srvfqdn = item3;
00889 else free_Buffer(&item3);
00890 }
00891
00892 if (srvdir!=NULL) {
00893 *srvdir = make_Buffer_bystr((char*)(url.buf+strlen((char*)(wrk.buf))));
00894 if ((srvdir->buf)[0]=='\0') copy_s2Buffer("/", srvdir);
00895 }
00896
00897 if (srvurl!=NULL) *srvurl = wrk;
00898 else free_Buffer(&wrk);
00899
00900 free_Buffer(&item1);
00901 free_Buffer(&item2);
00902 free_Buffer(&item4);
00903
00904 return TRUE;
00905 }
00906
00907
00908 Buffer make_form_urlenc(const char* key, const char* val)
00909 {
00910 Buffer buf = init_Buffer();
00911 if (key==NULL) return buf;
00912
00913 buf = make_Buffer_str(key);
00914 cat_s2Buffer("=", &buf);
00915
00916 if (val!=NULL) {
00917 unsigned char* val_enc = encode_urlenc((unsigned char*)val, -1);
00918 if (val_enc!=NULL) {
00919 cat_s2Buffer(val_enc, &buf);
00920 free(val_enc);
00921 }
00922 }
00923
00924 return buf;
00925 }
00926
00927
00928 void add_form_urlenc(Buffer* buf, const char* key, const char* val)
00929 {
00930 if (buf==NULL || key==NULL) return;
00931
00932 cat_s2Buffer("&", buf);
00933 cat_s2Buffer(key, buf);
00934 cat_s2Buffer("=", buf);
00935
00936 if (val!=NULL) {
00937 unsigned char* val_enc = encode_urlenc((unsigned char*)val, -1);
00938 if (val_enc!=NULL) {
00939 cat_s2Buffer(val_enc, buf);
00940 free(val_enc);
00941 }
00942 }
00943
00944 return;
00945 }
00946
00947
00948
00950
00951
00952
00980 int save_tagged_Buffer(Buffer buf, FILE* fp, unsigned int mode, int prfm)
00981 {
00982 int cc;
00983 Buffer tag, enc;
00984
00985 tag = make_Buffer(2);
00986 if (tag.buf==NULL) return FALSE;
00987 tag.buf[0] = mode & 0x0f;
00988 tag.buf[1] = mode & 0xf0;
00989
00990
00991 if (tag.buf[1]==JBXL_FIO_ORIGINAL || !prfm) {
00992 enc = dup_Buffer(buf);
00993 }
00994 else if (tag.buf[1]==JBXL_FIO_BASE64) {
00995 enc = encode_base64_Buffer(buf);
00996 }
00997 else {
00998 enc = dup_Buffer(buf);
00999 }
01000
01001 tag.vldsz = 2;
01002 cc = save_Buffer2_fp(tag, enc, fp);
01003 free_Buffer(&enc);
01004 free_Buffer(&tag);
01005
01006 if (!cc) return FALSE;
01007 return TRUE;
01008 }
01009
01010
01011
01038 Buffer read_tagged_Buffer(FILE* fp, unsigned int* mode)
01039 {
01040 unsigned char mthd, kind;
01041 Buffer tmp, tag, enc, buf;
01042
01043 buf = init_Buffer();
01044 if (mode==NULL) return buf;
01045
01046 if (!read_Buffer2_fp(&tag, &enc, fp)) return buf;
01047
01048 kind = *mode & 0x0f;
01049 mthd = *mode & 0xf0;
01050 if (kind!=tag.buf[0] && kind!=JBXL_FIO_ANY) {
01051 free_Buffer(&enc);
01052 free_Buffer(&tag);
01053 return buf;
01054 }
01055
01056
01057 if (mthd==tag.buf[1]) {
01058 buf = dup_Buffer(enc);
01059 }
01060 else {
01061
01062 if (tag.buf[1]==JBXL_FIO_BASE64) {
01063 tmp = decode_base64_Buffer(enc);
01064 }
01065 else {
01066 tmp = dup_Buffer(enc);
01067 }
01068
01069
01070 if (mthd==JBXL_FIO_BASE64) {
01071 buf = encode_base64_Buffer(tmp);
01072 }
01073 else {
01074 buf = dup_Buffer(tmp);
01075 }
01076 free_Buffer(&tmp);
01077 }
01078
01079 *mode = (unsigned int)tag.buf[0];
01080 free_Buffer(&enc);
01081 free_Buffer(&tag);
01082
01083 return buf;
01084 }
01085
01086
01087
01106 Buffer fgets_mstream_Buffer(Buffer buf, mstream* sb)
01107 {
01108 Buffer ret;
01109 unsigned char* pp;
01110
01111 ret = init_Buffer();
01112
01113 pp = fgets_mstream(buf.buf, sb);
01114 if (pp!=NULL) {
01115 ret = make_Buffer(LBUF);
01116 copy_s2Buffer((char*)pp, &ret);
01117 free(pp);
01118 }
01119 return ret;
01120 }
01121
01122
01123
01124
01126
01127
01128
01143 int get_runlength_byte(unsigned char* buf, int len, int pos)
01144 {
01145 int i, sz;
01146
01147 sz = -1;
01148 for (i=0; i<len; i++) {
01149 if (buf[i]==0x00) {
01150 if (i+1>=len) return JBXL_XTOOLS_RUNLEN_ERROR;
01151 if (buf[i+1]==0x00) return JBXL_XTOOLS_RUNLEN2_ERROR;
01152 sz += buf[i+1];
01153 if (sz>=pos) return i;
01154 i++;
01155 }
01156 else sz++;
01157
01158 if (sz>=pos) return i;
01159 }
01160
01161 return JBXL_ERROR;
01162 }
01163
01164
01165
01177 Buffer decode_runlength(unsigned char* buf, int len, int sz)
01178 {
01179 int i, j, k;
01180 Buffer ret = init_Buffer();
01181
01182
01183 i = j = 0;
01184 if (sz<=0) {
01185 while (j<len) {
01186 if (buf[j]==0x00) {
01187 if (j+1<len) {
01188 if (buf[j+1]==0x00) return ret;
01189 i += (int)buf[j+1];
01190 j += 2;
01191 }
01192 else break;
01193 }
01194 else {
01195 i++;
01196 j++;
01197 }
01198 }
01199
01200 if (j==len) sz = i;
01201 else return ret;
01202 }
01203
01204 ret = make_Buffer(sz);
01205 if (ret.buf==NULL) return ret;
01206
01207 i = j = 0;
01208 while (i<sz && j<len) {
01209 if (buf[j]==0x00) {
01210 if (j+1<len) {
01211 for (k=0; k<(int)buf[j+1]; k++) ret.buf[i++] = 0x00;
01212 j += 2;
01213 }
01214 else break;
01215 }
01216 else ret.buf[i++] = buf[j++];
01217 }
01218
01219 if (i==sz) ret.vldsz = sz;
01220 else free_Buffer(&ret);
01221
01222 return ret;
01223 }
01224
01225
01226 Buffer encode_runlength(unsigned char* buf, int len)
01227 {
01228 int i, j, k;
01229 Buffer ret = init_Buffer();
01230
01231 ret = make_Buffer(2*len);
01232 if (ret.buf==NULL) return ret;
01233
01234 i = j = 0;
01235 while (j<len) {
01236 ret.buf[i] = buf[j];
01237
01238 if (buf[j]==0x00) {
01239 k = 0;
01240 while (buf[j]==0x00 && j<len) {
01241 k++;
01242 j++;
01243 }
01244 ret.buf[i+1] = (unsigned char)k;
01245 i += 2;
01246 }
01247 else {
01248 i++;
01249 j++;
01250 }
01251 }
01252
01253 ret.vldsz = i;
01254 return ret;
01255 }
01256
01257
01258
01260
01261
01262
01277 int put_Buffer_ringBuffer(ringBuffer* rb, Buffer* buf)
01278 {
01279 if (rb==NULL) return JBXL_ARGS_ERROR;
01280 rb->state = JBXL_NORMAL;
01281
01282 if (buf==NULL) return JBXL_ARGS_ERROR;
01283 if (rb->buf==NULL) return JBXL_TOOLS_BUF_ERROR;
01284 if (rb->datasz + buf->vldsz > rb->bufsz) {
01285 rb->state = JBXL_ERROR;
01286 return JBXL_TOOLS_BUFSZ_ERROR;
01287 }
01288
01289 if (rb->epoint + buf->vldsz <= rb->bufsz) {
01290 memcpy(&(rb->buf[rb->epoint]), buf->buf, buf->vldsz);
01291 rb->epoint = rb->epoint + buf->vldsz;
01292 if (rb->epoint==rb->bufsz) rb->epoint = 0;
01293 }
01294 else {
01295 memcpy(&(rb->buf[rb->epoint]), buf->buf, rb->bufsz - rb->epoint);
01296 memcpy(rb->buf, &(buf->buf[rb->bufsz - rb->epoint]), buf->vldsz - (rb->bufsz - rb->epoint));
01297 rb->epoint = rb->epoint + buf->vldsz - rb->bufsz;
01298 }
01299
01300 rb->datasz += buf->vldsz;
01301 return buf->vldsz;
01302 }
01303
01304
01305
01319 Buffer* get_Buffer_ringBuffer(ringBuffer* rb, int sz)
01320 {
01321 if (rb==NULL) return NULL;
01322 if (rb->buf==NULL) return NULL;
01323 if (sz>rb->datasz) return NULL;
01324
01325 Buffer* buf = new_Buffer(sz);
01326
01327 if (rb->spoint + sz <= rb->bufsz) {
01328 copy_b2Buffer(&(rb->buf[rb->spoint]), buf, sz);
01329 rb->spoint = rb->spoint + sz;
01330 if (rb->spoint==rb->bufsz) rb->spoint = 0;
01331 }
01332 else {
01333 copy_b2Buffer(&(rb->buf[rb->spoint]), buf, rb->bufsz - rb->spoint);
01334 cat_b2Buffer(rb->buf, buf, sz - (rb->bufsz - rb->spoint));
01335 rb->spoint = rb->spoint + sz - rb->bufsz;
01336 }
01337
01338 rb->datasz -= sz;
01339 return buf;
01340 }
01341
01342
01343
01344
01346
01347
01348
01360 Buffer* get_Buffer_dim_tList(tList* lp)
01361 {
01362 int nn, mx;
01363 tList* lt;
01364 Buffer* buf;
01365 Buffer* ret;
01366
01367 if (lp==NULL) return NULL;
01368
01369
01370 lt = lp;
01371 nn = 0;
01372 while(lt!=NULL && lt->ldat.key.buf!=NULL) {
01373 nn++;
01374 lt = lt->next;
01375 }
01376 if (nn==0) return NULL;
01377
01378 mx = nn;
01379 buf = ret = (Buffer*)malloc(sizeof(Buffer)*mx);
01380 if (ret==NULL) return NULL;
01381
01382 nn = 0;
01383 while(lp!=NULL && lp->ldat.key.buf!=NULL) {
01384 *buf = dup_Buffer(lp->ldat.key);
01385 buf->state = mx - nn;
01386 nn++;
01387 buf++;
01388 lp = lp->next;
01389 }
01390
01391 return ret;
01392 }
01393
01394
01395
01407 Buffer* get_Buffer_dim_tList_value(tList* lp)
01408 {
01409 int nn, mx;
01410 tList* lt;
01411 Buffer* buf;
01412 Buffer* ret;
01413
01414 if (lp==NULL) return NULL;
01415
01416 lt = lp;
01417 nn = 0;
01418 while(lt!=NULL && lt->ldat.val.buf!=NULL) {
01419 nn++;
01420 lt = lt->next;
01421 }
01422 if (nn==0) return NULL;
01423
01424 mx = nn;
01425 buf = ret = (Buffer*)malloc(sizeof(Buffer)*mx);
01426 if (ret==NULL) return NULL;
01427
01428 nn = 0;
01429 while(lp!=NULL && lp->ldat.val.buf!=NULL) {
01430 *buf = dup_Buffer(lp->ldat.val);
01431 buf->state = mx - nn;
01432 nn++;
01433 buf++;
01434 lp = lp->next;
01435 }
01436
01437 return ret;
01438 }
01439
01440
01441
01456 Buffer* awk_Buffer_dim(Buffer buf, char cc)
01457 {
01458 Buffer* bf = NULL;
01459
01460 tList* lp = awk_Buffer_tList(buf, cc);
01461 if (lp!=NULL) bf = get_Buffer_dim_tList(lp);
01462 del_all_tList(&lp);
01463
01464 return bf;
01465 }
01466
01467
01468
01484 Buffer* cawk_Buffer_dim(Buffer buf, char cc)
01485 {
01486 Buffer* bf = NULL;
01487
01488 tList* lp = cawk_Buffer_tList(buf, cc);
01489 if (lp!=NULL) bf = get_Buffer_dim_tList(lp);
01490 del_all_tList(&lp);
01491
01492 return bf;
01493 }
01494
01495
01496
01511 Buffer* decompline_Buffer_dim(Buffer buf, int mode)
01512 {
01513 Buffer* dim;
01514 int i, n, m;
01515
01516 if (buf.buf==NULL) return NULL;
01517
01518 n = i = 0;
01519 while(buf.buf[i]!='\0' && i<buf.vldsz) {
01520 if (buf.buf[i]==CHAR_CR) {
01521 n++;
01522 if (i+1<buf.vldsz && buf.buf[i+1]==CHAR_LF) i++;
01523 }
01524 else if (buf.buf[i]==CHAR_LF) n++;
01525 else if (i+1<buf.vldsz && buf.buf[i+1]=='\0') n++;
01526 else if (i+1==buf.vldsz || buf.buf[i+1]=='\0') n++;
01527 i++;
01528 }
01529 if (n==0) n = 1;
01530
01531 dim = (Buffer*)malloc(sizeof(Buffer)*n);
01532 if (dim==NULL) return NULL;
01533
01534 int nxt = 0;
01535 for (m=0; m<n-1; m++) {
01536 int cnt = 0;
01537 int fwd = 0;
01538 while (buf.buf[nxt+cnt]!=CHAR_CR && buf.buf[nxt+cnt]!=CHAR_LF && nxt+cnt<buf.vldsz) cnt++;
01539
01540 if (buf.buf[nxt+cnt]==CHAR_CR || buf.buf[nxt+cnt]==CHAR_LF) fwd++;
01541 if (buf.buf[nxt+cnt]==CHAR_CR && nxt+cnt+1<buf.vldsz && buf.buf[nxt+cnt+1]==CHAR_LF) fwd++;
01542 if (mode==ON) cnt += fwd;
01543
01544 dim[m] = make_Buffer(cnt);
01545 for (i=0; i<cnt; i++) {
01546 dim[m].buf[i] = buf.buf[nxt+i];
01547 }
01548 dim[m].vldsz = cnt;
01549 dim[m].state = n;
01550
01551 if (mode==ON) nxt += cnt;
01552 else nxt += cnt + fwd;
01553 }
01554
01555
01556 dim[n-1] = make_Buffer(buf.vldsz-nxt);
01557 for (i=0; i<buf.vldsz-nxt; i++) {
01558 dim[n-1].buf[i] = buf.buf[nxt+i];
01559 }
01560 dim[n-1].vldsz = buf.vldsz - nxt;
01561 dim[n-1].state = n;
01562
01563 return dim;
01564 }
01565
01566
01567
01573 Buffer join_Buffer_dim(Buffer* dim, const char* deli)
01574 {
01575 int i, nn;
01576 Buffer buf;
01577
01578 buf = init_Buffer();
01579 if (dim==NULL) return buf;
01580
01581 buf = make_Buffer(LBUF);
01582 nn = dim->state;
01583
01584 for (i=0; i<nn; i++) {
01585 cat_Buffer(dim, &buf);
01586 if (deli!=NULL && i!=nn-1) cat_s2Buffer(deli, &buf);
01587 dim++;
01588 }
01589
01590 return buf;
01591 }
01592
01593
01594
01600 void del_Buffer_dim(Buffer** dim)
01601 {
01602 int i, nn;
01603 Buffer* buf;
01604
01605 if (dim==NULL || *dim==NULL) return;
01606 buf = *dim;
01607
01608 nn = buf->state;
01609 if (nn<=0) free_Buffer(buf);
01610
01611 for (i=0; i<nn; i++) {
01612 free_Buffer(buf);
01613 buf++;
01614 }
01615
01616 free(*dim);
01617 *dim = NULL;
01618 return;
01619 }
01620
01621
01622
01623
01625
01626
01627
01637 tList* get_tList_line_Buffer(Buffer buf, int n)
01638 {
01639 if (buf.buf==NULL || n<=0) return NULL;
01640
01641 Buffer line = get_line_Buffer(buf, n);
01642 if (line.buf==NULL) return NULL;
01643
01644 char* packline = pack_char((char*)line.buf, ' ');
01645 free_Buffer(&line);
01646 if (packline==NULL) return NULL;
01647
01648 tList* list = awk_tList(packline, ' ');
01649 free(packline);
01650
01651 return list;
01652 }
01653
01654
01655
01663 tList* get_tList_seq_data_Buffer(Buffer buf, int* ptr)
01664 {
01665 if (buf.buf==NULL || *ptr<0) return NULL;
01666 if (*ptr>=buf.vldsz) return NULL;
01667
01668 Buffer line = get_seq_data_Buffer(buf, ptr);
01669 if (line.buf==NULL) return NULL;
01670
01671 char* packline = pack_char((char*)line.buf, ' ');
01672 free_Buffer(&line);
01673 if (packline==NULL) return NULL;
01674
01675 tList* list = awk_tList(packline, ' ');
01676 free(packline);
01677
01678 return list;
01679 }
01680
01681
01682
01683
01685
01686
01687
01704 int set_item_tList(tList* list, char* key, int no, char deli, int nm, char* value)
01705 {
01706 int cn = 0;
01707 tList* lp;
01708
01709 if (list==NULL || key==NULL || value==NULL) return JBXL_ARGS_ERROR;
01710
01711 if (no>0) {
01712 lp = strncasecmp_tList(list, key, 0, no);
01713 if (lp!=NULL) {
01714 int rep = set_item_tList_node(lp, deli, nm, value);
01715 if (rep) cn = 1;
01716 }
01717 }
01718 else {
01719 int nn = 1;
01720 cn = 0;
01721 lp = strncasecmp_tList(list, key, 0, nn);
01722 while (lp!=NULL) {
01723 int rep = set_item_tList_node(lp, deli, nm, value);
01724 if (rep) cn++;
01725 lp = strncasecmp_tList(list, key, 0, ++nn);
01726 }
01727 }
01728
01729 return cn;
01730 }
01731
01732
01733 int set_item_tList_node(tList* lp, char deli, int nm, char* value)
01734 {
01735 int rep = FALSE;
01736 char dl[2] = " ";
01737 Buffer* bp;
01738
01739 if (lp==NULL || value==NULL) return FALSE;
01740
01741 dl[0] = deli;
01742
01743 bp = cawk_Buffer_dim(lp->ldat.val, deli);
01744 if (bp!=NULL && bp->state>=nm) {
01745 Buffer buf = make_Buffer_bystr(value);
01746 free_Buffer(&bp[nm-1]);
01747 bp[nm-1] = buf;
01748
01749 free_Buffer(&lp->ldat.val);
01750 lp->ldat.val = join_Buffer_dim(bp, dl);
01751 rep = TRUE;
01752 }
01753 del_Buffer_dim(&bp);
01754
01755 return rep;
01756 }
01757
01758
01759
01777 int replace_item_tList(tList* list, char* key, int no, char deli, int nm, char* srcval, char* value)
01778 {
01779 int cn = 0;
01780 tList* lp;
01781
01782 if (list==NULL || key==NULL || value==NULL) return JBXL_ARGS_ERROR;
01783 if (srcval==NULL) {
01784 return set_item_tList(list, key, no, deli, nm, value);
01785 }
01786
01787 if (no>0) {
01788 lp = strncasecmp_tList(list, key, 0, no);
01789 if (lp!=NULL) {
01790 int rep = replace_item_tList_node(lp, deli, nm, srcval, value);
01791 if (rep) cn = 1;
01792 }
01793 }
01794 else {
01795 int nn = 1;
01796 cn = 0;
01797 lp = strncasecmp_tList(list, key, 0, nn);
01798 while (lp!=NULL) {
01799 int rep = replace_item_tList_node(lp, deli, nm, srcval, value);
01800 if (rep) cn++;
01801 lp = strncasecmp_tList(list, key, 0, ++nn);
01802 }
01803 }
01804
01805 return cn;
01806 }
01807
01808
01809 int replace_item_tList_node(tList* lp, char deli, int nm, char* srcval, char* value)
01810 {
01811 int rep = FALSE;
01812 char dl[2] = " ";
01813 Buffer* bp;
01814 Buffer buf;
01815
01816 if (lp==NULL || value==NULL) return FALSE;
01817 if (nm<=0) nm = 1;
01818 if (srcval==NULL) {
01819 return set_item_tList_node(lp, deli, nm, value);
01820 }
01821
01822 dl[0] = deli;
01823
01824 bp = cawk_Buffer_dim(lp->ldat.val, deli);
01825 if (bp!=NULL && bp->state>=nm) {
01826 buf = replace_sBuffer(bp[nm-1], srcval, value);
01827 free_Buffer(&bp[nm-1]);
01828 bp[nm-1] = buf;
01829 free_Buffer(&lp->ldat.val);
01830 lp->ldat.val = join_Buffer_dim(bp, dl);
01831 rep = TRUE;
01832 }
01833 del_Buffer_dim(&bp);
01834
01835 return rep;
01836 }
01837
01838
01839
01840
01842
01843
01844
01856 tList* get_dir_files(const char* dirn)
01857 {
01858 tList* lp = NULL;
01859 tList* ln = NULL;
01860
01861 #ifdef WIN32
01862
01863 WIN32_FIND_DATAA FindFileData;
01864 HANDLE hFind;
01865
01866 Buffer pth = make_Buffer_bystr(dirn);
01867 if (pth.buf[strlen((char*)pth.buf)-1]!='\\') cat_s2Buffer("\\", &pth);
01868 Buffer buf = dup_Buffer(pth);
01869 cat_s2Buffer("*", &buf);
01870
01871
01872 hFind = FindFirstFileA((LPCSTR)(buf.buf), &FindFileData);
01873 if (hFind!=INVALID_HANDLE_VALUE) {
01874 Buffer tmp;
01875 do {
01876 if (strcmp(".", FindFileData.cFileName) && strcmp("..", FindFileData.cFileName)) {
01877 tmp = dup_Buffer(pth);
01878 cat_s2Buffer(FindFileData.cFileName, &tmp);
01879 ln = add_tList_node_str(ln, NULL, tmp.buf);
01880 if (lp==NULL) lp = ln;
01881 free_Buffer(&tmp);
01882 }
01883 } while (FindNextFileA(hFind, &FindFileData));
01884
01885 FindClose(hFind);
01886 }
01887 free_Buffer(&buf);
01888 free_Buffer(&pth);
01889
01890 #else
01891
01892 DIR *dp;
01893 struct dirent *dir;
01894
01895 Buffer pth = make_Buffer_bystr(dirn);
01896 if (pth.buf[strlen((char*)pth.buf)-1]!='/') cat_s2Buffer("/", &pth);
01897
01898 dp = opendir(dirn);
01899 if (dp!=NULL ){
01900 Buffer tmp;
01901 dir = readdir(dp);
01902 while (dir != NULL ){
01903 if (strcmp(".", dir->d_name) && strcmp("..", dir->d_name)) {
01904 tmp = dup_Buffer(pth);
01905 cat_s2Buffer(dir->d_name, &tmp);
01906 ln = add_tList_node_str(ln, NULL, (char*)tmp.buf);
01907 if (lp==NULL) lp = ln;
01908 free_Buffer(&tmp);
01909 }
01910 dir = readdir(dp);
01911 }
01912
01913 closedir(dp);
01914 }
01915 free_Buffer(&pth);
01916
01917 #endif
01918
01919
01920 ln = lp;
01921 while (ln!=NULL) {
01922 tList* lo = ln->next;
01923 while (lo!=NULL) {
01924 if (strcmp((char*)ln->ldat.val.buf, (char*)lo->ldat.val.buf)>0) {
01925 swap_tList_node(ln, lo);
01926 }
01927 lo = lo->next;
01928 }
01929 ln = ln->next;
01930 }
01931
01932 return lp;
01933 }
01934
01935
01936 tList* get_dir_files_rcsv(const char* dirn)
01937 {
01938 tList* lp = get_dir_files(dirn);
01939 if (lp==NULL) return NULL;
01940
01941 tList* lt = dup_tList(lp);
01942 while (lt!=NULL) {
01943 tList* lc = get_dir_files_rcsv((char*)lt->ldat.val.buf);
01944 if (lc!=NULL) add_tList_end(lp, lc);
01945 lt = lt->next;
01946 }
01947 del_tList(<);
01948
01949 return lp;
01950 }
01951
01952
01953 void del_file_extension_Buffer(Buffer* path)
01954 {
01955 if (path==NULL) return;
01956
01957 int count = path->vldsz - 1;
01958 while (count>=0) {
01959 if (path->buf[count]=='.') {
01960 path->buf[count] = '\0';
01961 path->vldsz = (int)strlen((char*)path->buf);
01962 break;
01963 }
01964 count--;
01965 }
01966 }
01967
01968
01969
01973 void change_file_extension_Buffer(Buffer* path, const char* ext)
01974 {
01975 if (path==NULL) return;
01976
01977 int count = path->vldsz - 1;
01978 while (count>=0) {
01979 if (path->buf[count]=='.') {
01980 path->buf[count] = '\0';
01981 path->vldsz = (int)strlen((char*)path->buf);
01982 if (ext[0]!='.') cat_s2Buffer(".", path);
01983 cat_s2Buffer(ext, path);
01984 break;
01985 }
01986 else if (path->buf[count]=='/' || path->buf[count]=='\\') {
01987 count = -1;
01988 break;
01989 }
01990 count--;
01991 }
01992
01993 if (count<0) {
01994 if (ext[0]!='.') cat_s2Buffer(".", path);
01995 cat_s2Buffer(ext, path);
01996 }
01997 }
01998
01999
02000
02001
02003
02004
02012 char* get_resource_path(char* name, tList* lp)
02013 {
02014 if (name==NULL) return NULL;
02015
02016 while (lp!=NULL) {
02017 if (!strcasecmp((char*)lp->ldat.key.buf, name)) {
02018 return (char*)lp->ldat.val.buf;
02019 }
02020 lp = lp->next;
02021 }
02022
02023 return NULL;
02024 }
02025
02026
02027
02038 tList* add_resource_list(const char* path, int keylen, tList* list, tList* extn)
02039 {
02040 if (path==NULL) return list;
02041
02042 tList* lp = get_dir_files(path);
02043 tList* pp = find_tList_end(list);
02044
02045
02046 while (lp!=NULL) {
02047 Buffer fn = make_Buffer_bystr(get_file_name((char*)lp->ldat.val.buf));
02048 char* ext = get_file_extension((char*)fn.buf);
02049
02050 if (extn==NULL || strncasecmp_tList(extn, ext, 0, 1)==NULL) {
02051 if (keylen<=0) {
02052 lp->ldat.key = make_Buffer_bystr((char*)fn.buf);
02053 pp = add_tList_node_bydata(pp, lp->ldat);
02054 }
02055 else if (fn.vldsz>=keylen) {
02056 fn.buf[keylen] = '\0';
02057 fn.vldsz = keylen;
02058 lp->ldat.key = make_Buffer_bystr((char*)fn.buf);
02059 pp = add_tList_node_bydata(pp, lp->ldat);
02060 }
02061 }
02062
02063 if (list==NULL) list = pp;
02064 lp = lp->next;
02065 free_Buffer(&fn);
02066 }
02067
02068 return list;
02069 }
02070
02071
02072