00001
00009 #ifdef CPLUSPLUS
00010 #undef CPLUSPLUS
00011 #endif
00012
00013
00014 #include "tools.h"
00015 #include "jbxl_state.h"
00016
00017
00018 int DebugMode = OFF;
00019 int UnitTestMode = OFF;
00020
00021 int KanjiCode = CODE_UTF8;
00022 int HostEndian = UNKNOWN_ENDIAN;
00023
00024
00025 unsigned char LocalIPNum[4] = {0x7f, 0x00, 0x00, 0x01};
00026 unsigned char LocalIPNum6[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
00027
00028
00030
00031
00032
00033
00034 #ifndef CPLUSPLUS
00035
00050 int isNull(void* p)
00051 {
00052 if (p==NULL) return TRUE;
00053
00054 #ifdef WIN32
00055 if (p==WIN_DD_NULL) return TRUE;
00056 #endif
00057
00058 return FALSE;
00059 }
00060
00061 #endif
00062
00063
00064
00065
00067
00068
00081 int is_little_endian(void)
00082 {
00083 unsigned char x[] = {0x01, 0x00};
00084
00085 if (HostEndian==LITTLE_ENDIAN) return TRUE;
00086
00087 else if (HostEndian==BIG_ENDIAN) return FALSE;
00088
00089 else {
00090 unsigned short* xx = (unsigned short*)x;
00091 if (*xx==1) {
00092 HostEndian = LITTLE_ENDIAN;
00093 return TRUE;
00094 }
00095 else {
00096 HostEndian = BIG_ENDIAN;
00097 return FALSE;
00098 }
00099 }
00100 }
00101
00102
00103
00116 int is_big_endian(void)
00117 {
00118 unsigned char x[] = {0x00, 0x01};
00119
00120 if (HostEndian==BIG_ENDIAN) return TRUE;
00121
00122 else if (HostEndian==LITTLE_ENDIAN) return FALSE;
00123
00124 else {
00125 unsigned short* xx = (unsigned short*)x;
00126 if (*xx==1) {
00127 HostEndian = BIG_ENDIAN;
00128 return TRUE;
00129 }
00130 else {
00131 HostEndian = LITTLE_ENDIAN;
00132 return FALSE;
00133 }
00134 }
00135 }
00136
00137
00138
00146 void check_endian(void)
00147 {
00148 if (HostEndian==UNKNOWN_ENDIAN) is_little_endian();
00149 }
00150
00151
00152
00160 double double_from_little_endian(void* ptr)
00161 {
00162 double ret = *((double*)ptr);
00163
00164 if (HostEndian==UNKNOWN_ENDIAN) check_endian();
00165 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 8);
00166 return ret;
00167 }
00168
00169
00170
00179 float float_from_little_endian(void* ptr)
00180 {
00181 float ret = *((float*)ptr);
00182
00183 if (HostEndian==UNKNOWN_ENDIAN) check_endian();
00184 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 4);
00185 return ret;
00186 }
00187
00188
00189
00198 int int_from_little_endian(void* ptr)
00199 {
00200 int ret = *((int*)ptr);
00201
00202 if (HostEndian==UNKNOWN_ENDIAN) check_endian();
00203 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 4);
00204 return ret;
00205 }
00206
00207
00208
00217 unsigned int uint_from_little_endian(void* ptr)
00218 {
00219 unsigned int ret = *((unsigned int*)ptr);
00220
00221 if (HostEndian==UNKNOWN_ENDIAN) check_endian();
00222 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 4);
00223 return ret;
00224 }
00225
00226
00227
00236 short short_from_little_endian(void* ptr)
00237 {
00238 short ret = *((short*)ptr);
00239
00240 if (HostEndian==UNKNOWN_ENDIAN) check_endian();
00241 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 2);
00242 return ret;
00243 }
00244
00245
00246
00255 unsigned short ushort_from_little_endian(void* ptr)
00256 {
00257 unsigned short ret = *((unsigned short*)ptr);
00258
00259 if (HostEndian==UNKNOWN_ENDIAN) check_endian();
00260 if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 2);
00261 return ret;
00262 }
00263
00264
00265
00274 double double_from_big_endian(void* ptr)
00275 {
00276 double ret = *((double*)ptr);
00277
00278 if (HostEndian==UNKNOWN_ENDIAN) check_endian();
00279 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 8);
00280 return ret;
00281 }
00282
00283
00284
00293 float float_from_big_endian(void* ptr)
00294 {
00295 float ret = *((float*)ptr);
00296
00297 if (HostEndian==UNKNOWN_ENDIAN) check_endian();
00298 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 4);
00299 return ret;
00300 }
00301
00302
00303
00312 int int_from_big_endian(void* ptr)
00313 {
00314 int ret = *((int*)ptr);
00315
00316 if (HostEndian==UNKNOWN_ENDIAN) check_endian();
00317 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 4);
00318 return ret;
00319 }
00320
00321
00322
00331 unsigned int uint_from_big_endian(void* ptr)
00332 {
00333 int ret = *((unsigned int*)ptr);
00334
00335 if (HostEndian==UNKNOWN_ENDIAN) check_endian();
00336 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 4);
00337 return ret;
00338 }
00339
00340
00341
00350 short short_from_big_endian(void* ptr)
00351 {
00352 short ret = *((short*)ptr);
00353
00354 if (HostEndian==UNKNOWN_ENDIAN) check_endian();
00355 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 2);
00356 return ret;
00357 }
00358
00359
00360
00369 unsigned short ushort_from_big_endian(void* ptr)
00370 {
00371 unsigned short ret = *((unsigned short*)ptr);
00372
00373 if (HostEndian==UNKNOWN_ENDIAN) check_endian();
00374 if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 2);
00375 return ret;
00376 }
00377
00378
00379
00380
00382
00383
00384
00385
00386
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456 char* get_local_timestamp(time_t date, const char* format)
00457 {
00458 char* buf = (char*)malloc(64);
00459
00460
00461 struct tm tm = *localtime(&date);
00462 strftime(buf, 63, format, &tm);
00463
00464 return buf;
00465 }
00466
00467
00468
00469 char* get_gmt_timestamp(time_t date, const char* format)
00470 {
00471 char* buf = (char*)malloc(64);
00472
00473 struct tm tm = *gmtime(&date);
00474
00475 strftime(buf, 63, format, &tm);
00476
00477 return buf;
00478 }
00479
00480
00481
00482
00484
00485
00486
00488
00504 char* get_line(char* buf, int n)
00505 {
00506 int i, j, pos, cnt;
00507 char* ret = NULL;
00508
00509 if (buf==NULL) return NULL;
00510
00511 for(i=0,j=0; j<n-1; j++) {
00512 while (buf[i]!=CHAR_LF && buf[i]!=CHAR_CR && buf[i]!='\0') i++;
00513 while (buf[i]==CHAR_LF || buf[i]==CHAR_CR) i++;
00514 }
00515 if (buf[i]=='\0') return NULL;
00516
00517 pos = i;
00518 while (buf[i]!=CHAR_LF && buf[i]!=CHAR_CR && buf[i]!='\0') i++;
00519 cnt = i - pos;
00520
00521 if (cnt>=0) {
00522 ret = (char*)malloc(cnt+1);
00523 if (ret==NULL) return NULL;
00524
00525 for(i=0; i<cnt; i++) ret[i] = buf[pos+i];
00526 ret[cnt] = '\0';
00527 }
00528 return ret;
00529 }
00530
00531
00532
00550 char* get_seq_data(char* buf, int* ptr)
00551 {
00552 int pos, cnt;
00553 char* ret = NULL;
00554
00555 if (buf==NULL || buf[*ptr]=='\0') return NULL;
00556
00557 pos = *ptr;
00558 while (buf[*ptr]!=CHAR_LF && buf[*ptr]!=CHAR_CR && buf[*ptr]!='\0') (*ptr)++;
00559 cnt = *ptr - pos;
00560
00561 if (cnt>=0) {
00562 ret = (char*)malloc(cnt+1);
00563 if (ret==NULL) return NULL;
00564
00565 int i;
00566 for(i=0; i<cnt; i++) ret[i] = buf[pos+i];
00567 ret[cnt] = '\0';
00568 }
00569
00570 while (buf[*ptr]==CHAR_LF || buf[*ptr]==CHAR_CR) (*ptr)++;
00571 return ret;
00572 }
00573
00574
00575
00589 char* awk(char* buf, char cc, int n)
00590 {
00591 int i, j, pos, cnt;
00592 char* item = NULL;
00593
00594 if (buf==NULL) return NULL;
00595
00596 for(i=0,j=0; j<n-1; j++) {
00597 while (buf[i]!='\0' && buf[i]!=cc) i++;
00598 if (buf[i]==cc) i++;
00599 }
00600 if (buf[i]=='\0') return NULL;
00601
00602 pos = i;
00603 while (buf[i]!='\0' && buf[i]!=cc) i++;
00604 cnt = i - pos;
00605
00606 item = (char*)malloc(cnt+1);
00607 if (item==NULL) return NULL;
00608
00609 for (i=0; i<cnt; i++) item[i] = buf[pos+i];
00610 item[cnt] = '\0';
00611
00612 return item;
00613 }
00614
00615
00616
00632 char* cawk(char* buf, char cc, int n)
00633 {
00634 int i, j, pos, cnt;
00635 char* item = NULL;
00636
00637 if (buf==NULL) return NULL;
00638
00639 for(i=0,j=0; j<n-1; j++) {
00640 while (buf[i]!='\0' && buf[i]!=cc) i++;
00641 while (buf[i]!='\0' && buf[i]==cc) i++;
00642 }
00643 if (buf[i]=='\0') return NULL;
00644
00645 pos = i;
00646 while (buf[i]!='\0' && buf[i]!=cc) i++;
00647 cnt = i - pos;
00648
00649 item = (char*)malloc(cnt+1);
00650 if (item==NULL) return NULL;
00651
00652 for (i=0; i<cnt; i++) item[i] = buf[pos+i];
00653 item[cnt] = '\0';
00654
00655 return item;
00656 }
00657
00658
00659
00674 int bincmp(unsigned char* b1, unsigned char* b2, int n)
00675 {
00676 int i;
00677
00678 if (b1==NULL || b2==NULL) return 1;
00679
00680 for (i=0; i<n; i++) {
00681 if (b1[i]!=b2[i]) return 1;
00682 }
00683
00684 return 0;
00685 }
00686
00687
00688
00699 int strnrvscmp(const char* s1, const char* s2, int n)
00700 {
00701 int j1, j2;
00702
00703 if (s1==NULL || s2==NULL) return 1;
00704
00705 j1 = (int)strlen(s1) - 1;
00706 j2 = (int)strlen(s2) - 1;
00707
00708 while (n>0 && j1>=0 && j2>=0) {
00709 if (s1[j1--] != s2[j2--]) return 1;
00710 n--;
00711 }
00712
00713 if (n==0) return 0;
00714 else return 1;
00715 }
00716
00717
00718
00729 int strncaservscmp(const char* s1, const char* s2, int n)
00730 {
00731 int j1, j2;
00732
00733 if (s1==NULL || s2==NULL) return 1;
00734
00735 j1 = (int)strlen(s1) - 1;
00736 j2 = (int)strlen(s2) - 1;
00737
00738 while (n>0 && j1>=0 && j2>=0) {
00739 if (toupper(s1[j1--]) != toupper(s2[j2--])) return 1;
00740 n--;
00741 }
00742
00743 if (n==0) return 0;
00744 else return 1;
00745 }
00746
00747
00748
00763 char* strstrcase(const char* buf, const char* nd)
00764 {
00765 char* pp;
00766 char* pb;
00767 char* pn;
00768
00769 if (buf==NULL || nd==NULL) return NULL;
00770
00771 pb = (char*)malloc(strlen(buf)+1);
00772 if (pb==NULL) return NULL;
00773 memcpy(pb, buf, (int)strlen(buf)+1);
00774
00775 pn = (char*)malloc(strlen(nd)+1);
00776 if (pn==NULL) {
00777 free(pb);
00778 return NULL;
00779 }
00780 memcpy(pn, nd, (int)strlen(nd)+1);
00781
00782 upper_string(pb);
00783 upper_string(pn);
00784
00785 pp = strstr(pb, pn);
00786 if (pp!=NULL) {
00787 pp = (pp - pb) + (char*)buf;
00788 }
00789 free(pb);
00790 free(pn);
00791
00792 return pp;
00793 }
00794
00795
00796
00812 int ex_strncmp(const char* dat, const char* key, int len)
00813 {
00814 if (dat==NULL || key==NULL) return FALSE;
00815
00816 if (len==0) {
00817 if (!strcmp(dat, key)) return TRUE;
00818 }
00819 else if (len>0) {
00820 if (!strncmp(dat, key, len)) return TRUE;
00821 }
00822 else if (len<0) {
00823 int sz;
00824 if (len==-1) sz = (int)strlen(dat);
00825 else sz = (int)strlen(key);
00826 if (!strncmp(dat, key, sz)) return TRUE;
00827 }
00828
00829 return FALSE;
00830 }
00831
00832
00833
00849 int ex_strncasecmp(const char* dat, const char* key, int len)
00850 {
00851 if (dat==NULL || key==NULL) return FALSE;
00852
00853 if (len==0) {
00854 if (!strcasecmp(dat, key)) return TRUE;
00855 }
00856 else if (len>0) {
00857 if (!strncasecmp(dat, key, len)) return TRUE;
00858 }
00859 else if (len<0) {
00860 int sz;
00861 if (len==-1) sz = (int)strlen(dat);
00862 else sz = (int)strlen(key);
00863 if (!strncasecmp(dat, key, sz)) return TRUE;
00864 }
00865
00866 return FALSE;
00867 }
00868
00869
00870
00886 int ex_strnrvscmp(const char* dat, const char* key, int len)
00887 {
00888 if (dat==NULL || key==NULL) return FALSE;
00889
00890 if (len==0) {
00891 if (!strcmp(dat, key)) return TRUE;
00892 }
00893 else if (len>0) {
00894 if (!strnrvscmp(dat, key, len)) return TRUE;
00895 }
00896 else if (len<0) {
00897 int sz;
00898 if (len==-1) sz = (int)strlen(dat);
00899 else sz = (int)strlen(key);
00900 if (!strnrvscmp(dat, key, sz)) return TRUE;
00901 }
00902
00903 return FALSE;
00904 }
00905
00906
00907
00923 int ex_strncaservscmp(const char* dat, const char* key, int len)
00924 {
00925 if (dat==NULL || key==NULL) return FALSE;
00926
00927 if (len==0) {
00928 if (!strcasecmp(dat, key)) return TRUE;
00929 }
00930 else if (len>0) {
00931 if (!strncaservscmp(dat, key, len)) return TRUE;
00932 }
00933 else if (len<0) {
00934 int sz;
00935 if (len==-1) sz = (int)strlen(dat);
00936 else sz = (int)strlen(key);
00937 if (!strncaservscmp(dat, key, sz)) return TRUE;
00938 }
00939
00940 return FALSE;
00941 }
00942
00943
00944
00953 char* chomp(char* buf)
00954 {
00955 int i, len;
00956
00957 if (buf==NULL) return NULL;
00958
00959 len = (int)strlen(buf);
00960 for (i=0; i<len; i++) {
00961 if (buf[i]==CHAR_LF || buf[i]==CHAR_CR) {
00962 buf[i] = '\0';
00963 return buf;
00964 }
00965 }
00966 return buf;
00967 }
00968
00969
00970
00981 char* skip_chars(char* pp, const char* check)
00982 {
00983 int n, sqf = 0, dqf = 0;
00984
00985 n = (int)strlen(check);
00986
00987 while (*pp!='\0') {
00988 while (*pp=='\\') pp += 2;
00989
00990 if (*pp!='\0') {
00991 if (!sqf && *pp=='\"') dqf = 1 - dqf;
00992 else if (!dqf && *pp=='\'') sqf = 1 - sqf;
00993
00994 else if (!sqf && !dqf) {
00995 int i;
00996 for (i=0; i<n; i++) {
00997 if (*pp==check[i]) return pp;
00998 }
00999 }
01000 pp++;
01001 }
01002 }
01003
01004 return NULL;
01005 }
01006
01007
01008
01019 char* skip_char(char* pp, char cc)
01020 {
01021 int sqf = 0, dqf = 0;
01022
01023 while (*pp!='\0') {
01024 while (*pp=='\\') pp += 2;
01025
01026 if (*pp!='\0') {
01027 if (!sqf && *pp=='\"') dqf = 1 - dqf;
01028 else if (!dqf && *pp=='\'') sqf = 1 - sqf;
01029 else if (!sqf && !dqf && *pp==cc) return pp;
01030 pp++;
01031 }
01032 }
01033
01034 return pp;
01035 }
01036
01037
01038
01057 char* skip_char_pair(char* pp, char pair, char end)
01058 {
01059 int cnt = 0, sqf = 0, dqf = 0;
01060
01061 if (*pp==pair) {
01062 cnt = 1;
01063 pp++;
01064 }
01065
01066 while (*pp!='\0') {
01067 while (*pp=='\\') pp += 2;
01068
01069 if (*pp!='\0') {
01070 if (!sqf && *pp=='\"') dqf = 1 - dqf;
01071 else if (!dqf && *pp=='\'') sqf = 1 - sqf;
01072
01073 else if (!sqf && !dqf) {
01074 if (*pp==end) cnt--;
01075 else if (*pp==pair) cnt++;
01076 if (cnt==0) return pp;
01077 }
01078 pp++;
01079 }
01080 }
01081
01082 return pp;
01083 }
01084
01085
01086
01096 char* skip_string_end(char* pp)
01097 {
01098 char ch = *pp;
01099
01100 if (*pp=='\"' || *pp=='\'') {
01101 pp++;
01102
01103 while (*pp!='\0') {
01104 while (*pp=='\\') pp += 2;
01105
01106 if (*pp!='\0') {
01107 if (*pp==ch) return pp;
01108 }
01109 pp++;
01110 }
01111 }
01112 return pp;
01113 }
01114
01115
01116
01129 char* pack_head_tail_char(char* mesg, char cc)
01130 {
01131 int sz;
01132 char* ps;
01133 char* pe;
01134 char* pp;
01135
01136 if (mesg==NULL) return NULL;
01137
01138 ps = mesg;
01139 while(*ps==cc || *ps==CHAR_TAB || *ps==CHAR_LF || *ps==CHAR_CR) ps++;
01140 pe = ps;
01141 while(*pe!='\0') pe++;
01142 pe--;
01143 while(*pe==cc || *pe==CHAR_TAB || *pe==CHAR_LF || *pe==CHAR_CR) pe--;
01144
01145 sz = (int)(pe - ps) + 1;
01146 pp = (char*)malloc((size_t)(sz + 1));
01147 memcpy(pp, ps, sz);
01148 pp[sz] = '\0';
01149
01150 return pp;
01151 }
01152
01153
01154
01169
01170
01171
01172
01173
01174
01175
01176
01177
01193 char* pack_char_len(char* mesg, char cc, int len)
01194 {
01195 int i, j;
01196 int sf = OFF;
01197 int ff = ON;
01198 char* pp;
01199
01200 if (mesg==NULL) return NULL;
01201
01202 if (len==0) return NULL;
01203 if (len<0) len = (int)strlen(mesg);
01204 pp = (char*)malloc(len+1);
01205 if (pp==NULL) return NULL;
01206
01207 i = j = 0;
01208 while(mesg[i]!='\0' && i<len) {
01209 if (mesg[i]==CHAR_TAB) mesg[i] = ' ';
01210 if (mesg[i]!=CHAR_CR && mesg[i]!=CHAR_LF) {
01211 if (mesg[i]==cc) {
01212 if (sf==OFF) {
01213 sf = ON;
01214 if (ff==ON) ff = OFF;
01215 else pp[j++] = mesg[i];
01216 }
01217 }
01218 else {
01219 sf = ff = OFF;
01220 pp[j++] = mesg[i];
01221 }
01222 }
01223 i++;
01224 }
01225 pp[j] = '\0';
01226
01227
01228 i = (int)strlen(pp) - 1;
01229 while(i>=0) {
01230 if (pp[i]==cc) i--;
01231 else break;
01232 }
01233 pp[i+1] = '\0';
01234
01235 return pp;
01236 }
01237
01238
01239
01249 char* change_esc(char* mesg)
01250 {
01251 int i, j;
01252 char* pp;
01253
01254 if (mesg==NULL) return NULL;
01255
01256 pp = (char*)malloc((strlen(mesg)+1)*2);
01257 if (pp==NULL) return NULL;
01258
01259 i = j = 0;
01260 while(mesg[i]!='\0') {
01261 if (mesg[i]==CHAR_CR) {
01262 pp[j++] = '\\';
01263 pp[j++] = 'r';
01264 }
01265 else if (mesg[i]==CHAR_LF) {
01266 pp[j++] = '\\';
01267 pp[j++] = 'n';
01268 }
01269 else {
01270 pp[j++] = mesg[i];
01271 }
01272 i++;
01273 }
01274 pp[j] = '\0';
01275
01276 return pp;
01277 }
01278
01279
01280
01297 char* replace_str(char* buf, int len, const char* frm, const char* tos)
01298 {
01299 char* wrk = NULL;
01300 int i, j, k, slen, flen, tlen;
01301
01302 if (buf==NULL || frm==NULL || tos==NULL) return NULL;
01303
01304 wrk = (char*)malloc(len);
01305 if (wrk==NULL) return NULL;
01306
01307 slen = (int)strlen(buf);
01308 flen = (int)strlen(frm);
01309 tlen = (int)strlen(tos);
01310
01311 i = j = 0;
01312 while (i<slen && j<len) {
01313 if (!strncmp((const char*)(buf+i), frm, flen)){
01314 for (k=0; k<tlen; k++) {
01315 wrk[j+k] = tos[k];
01316 }
01317 i += flen;
01318 j += tlen;
01319 }
01320 else {
01321 wrk[j++] = buf[i++];
01322 }
01323 }
01324
01325
01326 if (j>=len) {
01327 free(wrk);
01328 return NULL;
01329 }
01330
01331 wrk[j] = '\0';
01332 for (k=0; k<=j; k++) buf[k] = wrk[k];
01333 free(wrk);
01334
01335 return buf;
01336 }
01337
01338
01339
01352 char* cut_str(char* buf, int ls, int le)
01353 {
01354 int i, len;
01355 char* ret;
01356
01357 if (buf==NULL) return NULL;
01358
01359 ls = Max(ls, 0);
01360 le = Min(le, (int)strlen((const char*)buf));
01361 len = le - ls + 1;
01362 if (len<=0) return NULL;
01363
01364 ret = (char*)malloc(len+1);
01365 if (ret==NULL) return NULL;
01366 memset(ret, 0, len+1);
01367
01368 for (i=0; i<len; i++) ret[i] = buf[i+ls];
01369
01370 return ret;
01371 }
01372
01373
01374
01383 char* dup_str(char* buf)
01384 {
01385 int len;
01386 char* ret;
01387
01388 if (buf==NULL) return NULL;
01389
01390 len = (int)strlen(buf);
01391 ret = (char*)malloc(len+1);
01392 if (ret==NULL) return NULL;
01393
01394 memcpy(ret, buf, len);
01395 ret[len] = '\0';
01396
01397 return ret;
01398 }
01399
01400
01401
01402 static char _ToSTR[LDATA];
01403
01404
01413 char* itostr(int n)
01414 {
01415 memset(_ToSTR, 0, LDATA);
01416 snprintf(_ToSTR, LDATA-1, "%d", n);
01417 return _ToSTR;
01418 }
01419
01420
01421
01430 char* ltostr(long int n)
01431 {
01432 memset(_ToSTR, 0, LDATA);
01433 snprintf(_ToSTR, LDATA-1, "%ld", n);
01434 return _ToSTR;
01435 }
01436
01437
01438
01447 char* ultostr(unsigned long int n)
01448 {
01449 memset(_ToSTR, 0, LDATA);
01450 snprintf(_ToSTR, LDATA-1, "%lu", n);
01451 return _ToSTR;
01452 }
01453
01454
01455
01464 char* lltostr(long long int n)
01465 {
01466 memset(_ToSTR, 0, LDATA);
01467 snprintf(_ToSTR, LDATA-1, "%lld", n);
01468 return _ToSTR;
01469 }
01470
01471
01472
01481 char* ulltostr(unsigned long long int n)
01482 {
01483 memset(_ToSTR, 0, LDATA);
01484 snprintf(_ToSTR, LDATA-1, "%llu", n);
01485 return _ToSTR;
01486 }
01487
01488
01489
01498 char* ftostr(float n)
01499 {
01500 memset(_ToSTR, 0, LDATA);
01501 snprintf(_ToSTR, LDATA-1, "%f", n);
01502 return _ToSTR;
01503 }
01504
01505
01506
01515 char* dtostr(double n)
01516 {
01517 memset(_ToSTR, 0, LDATA);
01518 snprintf(_ToSTR, LDATA-1, "%f", n);
01519 return _ToSTR;
01520 }
01521
01522
01523
01532 char* itostr_ts(int n)
01533 {
01534 char* str = NULL;
01535 str = (char*)malloc(LDATA);
01536 if (str==NULL) return NULL;
01537
01538 memset(str, 0, LDATA);
01539 snprintf(str, LDATA-1, "%d", n);
01540 return str;
01541 }
01542
01543
01544
01553 char* ltostr_ts(long int n)
01554 {
01555 char* str = NULL;
01556 str = (char*)malloc(LDATA);
01557 if (str==NULL) return NULL;
01558
01559 memset(str, 0, LDATA);
01560 snprintf(str, LDATA-1, "%ld", n);
01561 return str;
01562 }
01563
01564
01565
01574 char* ultostr_ts(unsigned long int n)
01575 {
01576 char* str = NULL;
01577 str = (char*)malloc(LDATA);
01578 if (str==NULL) return NULL;
01579
01580 memset(str, 0, LDATA);
01581 snprintf(str, LDATA-1, "%lu", n);
01582 return str;
01583 }
01584
01585
01586
01595 char* lltostr_ts(long long int n)
01596 {
01597 char* str = NULL;
01598 str = (char*)malloc(LDATA);
01599 if (str==NULL) return NULL;
01600
01601 memset(str, 0, LDATA);
01602 snprintf(str, LDATA-1, "%lld", n);
01603 return str;
01604 }
01605
01606
01607
01616 char* ulltostr_ts(unsigned long long int n)
01617 {
01618 char* str = NULL;
01619 str = (char*)malloc(LDATA);
01620 if (str==NULL) return NULL;
01621
01622 memset(str, 0, LDATA);
01623 snprintf(str, LDATA-1, "%llu", n);
01624 return str;
01625 }
01626
01627
01628
01637 char* ftostr_ts(float n)
01638 {
01639 char* str = NULL;
01640 str = (char*)malloc(LDATA);
01641 if (str==NULL) return NULL;
01642
01643 memset(str, 0, LDATA);
01644 snprintf(str, LDATA-1, "%f", n);
01645 return str;
01646 }
01647
01648
01649
01658 char* dtostr_ts(double n)
01659 {
01660 char* str = NULL;
01661 str = (char*)malloc(LDATA);
01662 if (str==NULL) return NULL;
01663
01664 memset(str, 0, LDATA);
01665 snprintf(str, LDATA-1, "%f", n);
01666 return str;
01667 }
01668
01669
01670
01680 int count_lines(const char* buf)
01681 {
01682 int i = 0;
01683 int line = 0;
01684
01685 if (buf==NULL) return 0;
01686 line++;
01687
01688 while(buf[i]!='\0') {
01689 if (buf[i]==CHAR_CR) {
01690 line++;
01691 if (buf[i+1]==CHAR_LF) i++;
01692 }
01693 else if (buf[i]==CHAR_LF) {
01694 line++;
01695 }
01696 i++;
01697 }
01698
01699 return line;
01700 }
01701
01702
01703
01714 int hexstr2i(const char* str)
01715 {
01716 int i, ret = 0;
01717 if (str==NULL) return ret;
01718
01719 int len = (int)strlen(str);
01720
01721 for (i=0; i<len; i++) {
01722 if (str[i]>='0' && str[i]<='9') {
01723 ret = ret*16;
01724 ret += (int)(str[i] - '0');
01725 }
01726 else if (str[i]>='A' && str[i]<='F') {
01727 ret = ret*16;
01728 ret += (int)(str[i] - 'A') + 10;
01729 }
01730 else if (str[i]>='a' && str[i]<='f') {
01731 ret = ret*16;
01732 ret += (int)(str[i] - 'a') + 10;
01733 }
01734 else if (str[i]!=' ') {
01735 break;
01736 }
01737 }
01738
01739 return ret;
01740 }
01741
01743
01744 #ifndef WIN32
01745
01755 void init_rand(void)
01756 {
01757 FILE* fp;
01758 unsigned int seed;
01759 size_t sz;
01760 UNUSED(sz);
01761
01762 fp = fopen("/dev/urandom", "rb");
01763 if (fp==NULL) {
01764 srand(time(NULL));
01765 return;
01766 }
01767 sz = fread(&seed, sizeof(unsigned int), 1, fp);
01768 fclose(fp);
01769
01770 srand(seed);
01771 }
01772
01773 #endif
01774
01775
01776
01786 char* randstr(int n)
01787 {
01788 char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
01789 char* pass;
01790 int i, sz;
01791
01792 if (n<=0) return NULL;
01793 pass = (char*)malloc(n+1);
01794 if (pass==NULL) return pass;
01795
01796 sz = (int)strlen(base);
01797 for (i=0; i<n; i++) pass[i] = base[rand()%sz];
01798 pass[n] = '\0';
01799
01800 return pass;
01801 }
01802
01803
01804
01814 unsigned char* randbit(int n)
01815 {
01816 int i, sz;
01817 unsigned char* bin;
01818
01819 sz = (n+7)/8;
01820 bin = (unsigned char*)malloc(sz);
01821 if (bin==NULL) return NULL;
01822
01823 memset(bin, 0, sz);
01824 for (i=0; i<n; i++) setBit(bin, i, rand()%2);
01825
01826 return bin;
01827 }
01828
01829
01830
01832
01833
01834
01835 unsigned long long int ntohull(unsigned long long int s)
01836 {
01837 if (is_little_endian()) {
01838 long long int d;
01839 uByte* src = (uByte*)&s;
01840 uByte* dst = (uByte*)&d;
01841 dst[0] = src[7];
01842 dst[1] = src[6];
01843 dst[2] = src[5];
01844 dst[3] = src[4];
01845 dst[4] = src[3];
01846 dst[5] = src[2];
01847 dst[6] = src[1];
01848 dst[7] = src[0];
01849 return d;
01850 }
01851 return s;
01852 }
01853
01854
01855
01866 void swap_byte(void* p, int s, int c)
01867 {
01868 int i;
01869 uByte* u = (uByte*)p;
01870 for (i=0; i<s; i+=c) reverse_str(&u[i], c);
01871 }
01872
01873
01874
01884 short swaps(unsigned short p)
01885 {
01886 short r;
01887 uByte* t;
01888 uByte* f;
01889
01890 t = (uByte*)&r;
01891 f = (uByte*)&p;
01892 t[0] = f[1];
01893 t[1] = f[0];
01894
01895 return r;
01896 }
01897
01898
01899
01909 int swapl(unsigned int p)
01910 {
01911 int r;
01912 uByte* t;
01913 uByte* f;
01914
01915 t = (uByte*)&r;
01916 f = (uByte*)&p;
01917 t[0] = f[3];
01918 t[1] = f[2];
01919 t[2] = f[1];
01920 t[3] = f[0];
01921
01922 return r;
01923 }
01924
01925
01926
01935 void reverse_str(uByte* p, int s)
01936 {
01937 int i;
01938 uByte c;
01939
01940 if (s<=0) s = (int)strlen((const char*)p);
01941
01942 for (i=0; i<s/2; i++) {
01943 c = p[s-1-i];
01944 p[s-1-i] = p[i];
01945 p[i] = c;
01946 }
01947 }
01948
01949
01950
01951
01953
01969 int file_from_to(const char* src, const char* dst, const char* mode)
01970 {
01971 long int sz;
01972 unsigned char* buf;
01973 FILE* fp;
01974 size_t rs;
01975 UNUSED(rs);
01976
01977 sz = file_size(src);
01978 if (sz<0) return JBXL_FILE_EXIST_ERROR;
01979 buf = (unsigned char*)malloc(sz);
01980 if (buf==NULL) return JBXL_MALLOC_ERROR;
01981
01982 fp = fopen(src, "rb");
01983 if (fp==NULL) {
01984 free(buf);
01985 return JBXL_FILE_OPEN_ERROR;
01986 }
01987 rs = fread(buf, sz, 1, fp);
01988 fclose(fp);
01989
01990 fp = fopen(dst, mode);
01991 if (fp==NULL) {
01992 free(buf);
01993 return JBXL_FILE_DESTOPEN_ERROR;
01994 }
01995 fwrite(buf, sz, 1, fp);
01996 fclose(fp);
01997
01998 free(buf);
01999 return sz;
02000 }
02001
02002
02003
02019 int fp_from_to(FILE* src, FILE* dst, long int sz)
02020 {
02021 unsigned char* buf;
02022 size_t rs;
02023 UNUSED(rs);
02024
02025 if (sz<=0) return JBXL_ARGS_ERROR;
02026 if (src==NULL) return JBXL_FILE_OPEN_ERROR;
02027 if (dst==NULL) return JBXL_FILE_DESTOPEN_ERROR;
02028
02029 buf = (unsigned char*)malloc(sz);
02030 if (buf==NULL) return JBXL_MALLOC_ERROR;
02031
02032 rs = fread(buf, sz, 1, src);
02033 sz = (int)fwrite(buf, sz, 1, dst);
02034
02035 free(buf);
02036 return sz;
02037 }
02038
02039
02040
02050 char* get_file_name(const char* str)
02051 {
02052 if (str==NULL) return NULL;
02053
02054 #ifdef WIN32
02055 char cc = '\\';
02056 #else
02057 char cc = '/';
02058 #endif
02059
02060 int len = (int)strlen(str);
02061 int sz = 0;
02062 while (sz<len && str[len-1-sz]!=cc) sz++;
02063 char* fnm = (char*)str + len - sz;
02064
02065 return fnm;
02066 }
02067
02068
02069
02079 char* del_file_name(const char* str)
02080 {
02081 if (str==NULL) return NULL;
02082
02083 #ifdef WIN32
02084 char cc = '\\';
02085 #else
02086 char cc = '/';
02087 #endif
02088
02089 char* path = (char*)str;
02090 int len = (int)strlen(str);
02091 if (len==1) {
02092 if (path[0]==cc) return path;
02093 else return NULL;
02094 }
02095
02096 int sz = len - 1;
02097 while (sz>=0 && str[sz]!=cc) sz--;
02098
02099 if (sz<0) {
02100 path[0] = '.';
02101 path[1] = cc;
02102 path[2] = '\0';
02103 }
02104 else {
02105 path[sz+1] = '\0';
02106 }
02107
02108 return path;
02109 }
02110
02111
02112
02123
02124
02125
02126
02127
02128
02129
02130
02131
02132
02133
02134
02135
02136
02137
02138
02139
02140
02141
02142
02143
02144
02145
02146
02147
02148
02149
02150
02151
02152
02153
02154
02155
02156
02157
02158
02159
02160
02161
02162
02163
02164
02165
02166
02167
02168
02169
02178 char* get_file_path(const char* str)
02179 {
02180 if (str==NULL || str[0]=='\0') return NULL;
02181
02182 int len = (int)strlen(str);
02183 char* path = (char*)malloc(len+1);
02184 memcpy(path, str, len+1);
02185
02186 #ifdef WIN32
02187 char cc = '\\';
02188 #else
02189 char cc = '/';
02190 #endif
02191
02192 int sz = len - 1;
02193 while (sz>=0 && path[sz]!=cc) sz--;
02194
02195 if (sz<0) {
02196 free(path);
02197 path = NULL;
02198 }
02199 else {
02200 path[sz+1] = '\0';
02201 }
02202
02203 return path;
02204 }
02205
02206
02215 char* get_file_extension(const char* str)
02216 {
02217 int sz, len;
02218 char* ext;
02219
02220 if (str==NULL) return NULL;
02221
02222 char pd = '.';
02223
02224 #ifdef WIN32
02225 char cc = '\\';
02226 #else
02227 char cc = '/';
02228 #endif
02229
02230 len = (int)strlen(str);
02231 sz = 0;
02232 while (sz<len && str[len-1-sz]!=cc && str[len-1-sz]!=pd) sz++;
02233
02234 if (str[len-1-sz]!=pd) return NULL;
02235 ext = (char*)str + len - sz;
02236
02237 return ext;
02238 }
02239
02240
02241
02251 char* del_file_extension(const char* str)
02252 {
02253 if (str==NULL) return NULL;
02254
02255 char cc = '.';
02256 char* path = (char*)str;
02257
02258 int len = (int)strlen(path);
02259 int sz = len - 1;
02260 while (sz>=0 && path[sz]!=cc) sz--;
02261
02262 if (sz<1) return path;
02263 path[sz] = '\0';
02264
02265 return path;
02266 }
02267
02268
02269
02278 char* cut_file_extension(const char* str)
02279 {
02280 if (str==NULL) return NULL;
02281
02282 char cc = '.';
02283 int len = (int)strlen(str);
02284 char* path = (char*)malloc(len+1);
02285 memcpy(path, str, len+1);
02286
02287 int sz = len - 1;
02288 while (sz>=0 && path[sz]!=cc) sz--;
02289
02290 if (sz<1) return path;
02291 path[sz] = '\0';
02292
02293 return path;
02294 }
02295
02296
02297
02306 unsigned long int file_size(const char* fn)
02307 {
02308 struct stat stbuf;
02309
02310 stat(fn, &stbuf);
02311
02312 #ifdef WIN32
02313 return stbuf.st_size;
02314 #else
02315 if (S_ISREG(stbuf.st_mode)) return stbuf.st_size;
02316 else return 0;
02317 #endif
02318 }
02319
02320
02321
02334 int file_exist(const char* fn)
02335 {
02336 FILE* fp;
02337
02338 if (fn==NULL) return FALSE;
02339
02340 if ((fp=fopen(fn,"rb"))==NULL) {
02341 return FALSE;
02342 }
02343 fclose(fp);
02344 return TRUE;
02345 }
02346
02347
02348
02364 FILE* file_chmod_open(const char* fn, const char* fm, mode_t mode)
02365 {
02366 FILE* fp;
02367
02368 if (!file_exist(fn)) {
02369 if ((fp=fopen(fn,"wb"))==NULL) return NULL;
02370 fclose(fp);
02371 }
02372
02373 #ifndef WIN32
02374 fp = NULL;
02375 if (chmod(fn, mode)) return fp;
02376 #endif
02377
02378 fp = fopen(fn, fm);
02379 return fp;
02380 }
02381
02382
02383
02396 char* temp_filename(const char* dir, int flen)
02397 {
02398 FILE* fp;
02399 int i, dlen=0;
02400 char nostr = '\0';
02401 char* fname;
02402 char* fnbin;
02403 char* fnb64;
02404 size_t rs;
02405 UNUSED(rs);
02406
02407 if (dir==NULL) dir = &nostr;
02408 dlen = (int)strlen(dir);
02409 if (flen<=0) flen = 15;
02410
02411 fname = (char*)malloc(dlen+flen+1);
02412 if (fname==NULL) return NULL;
02413 fnbin = (char*)malloc(flen);
02414 if (fnbin==NULL) {
02415 free(fname);
02416 return NULL;
02417 }
02418
02419 fnb64 = NULL;
02420 fp = fopen("/dev/urandom", "rb");
02421
02422 do {
02423 if (fp!=NULL) {
02424 rs = fread(fnbin, flen, 1, fp);
02425 fnb64 = (char*)encode_base64((unsigned char*)fnbin, flen);
02426 if (fnb64!=NULL) fnb64[flen] = '\0';
02427 }
02428 if (fnb64==NULL) fnb64 = randstr(flen);
02429
02430 for (i=0; i<flen; i++) {
02431 if (fnb64[i]=='/') fnb64[i] = 'x';
02432 if (fnb64[i]=='+') fnb64[i] = 'X';
02433 }
02434
02435 memset (fname, 0, dlen+flen+1);
02436 strncpy(fname, dir, dlen);
02437 strncat(fname, fnb64, flen);
02438 free(fnb64);
02439 } while(file_exist(fname));
02440
02441 if (fp!=NULL) fclose(fp);
02442 free(fnbin);
02443 return fname;
02444 }
02445
02446
02456 unsigned char* read_file(const char* fname, unsigned long int* size)
02457 {
02458 size_t rs;
02459 UNUSED(rs);
02460
02461 if (size==NULL) return NULL;
02462
02463 *size = file_size(fname);
02464 if (*size<=0) return NULL;
02465
02466 unsigned char* buf = (unsigned char*)malloc(*size);
02467 if (buf==NULL) return NULL;
02468
02469 FILE* fp = fopen(fname, "rb");
02470 if (fp==NULL) {
02471 free(buf);
02472 return NULL;
02473 }
02474
02475 rs = fread(buf, *size, 1, fp);
02476 fclose(fp);
02477
02478 return buf;
02479 }
02480
02481
02482
02493 long int write_file(const char* fname, unsigned char* buf, unsigned long int size)
02494 {
02495 if (size==0) return 0;
02496
02497 FILE* fp = fopen(fname, "wb");
02498 if (fp==NULL) return 0;
02499
02500 size = (long int)fwrite(buf, size, 1, fp);
02501 fclose(fp);
02502
02503 return size;
02504 }
02505
02506
02507
02517 char* double_bs(char* str)
02518 {
02519 int i, j;
02520 int len, bsn=0;
02521 char* buf;
02522
02523 len = (int)strlen(str);
02524 for (i=0; i<len; i++) if (str[i]=='\\') bsn++;
02525 buf = (char*)malloc(len+bsn+1);
02526 if (buf==NULL) return NULL;
02527
02528 for (i=0,j=0; i<len; i++) {
02529 buf[j++] = str[i];
02530 if (str[i]=='\\') buf[j++] = '\\';
02531 }
02532 buf[j] = '\0';
02533
02534 return buf;
02535 }
02536
02537
02538
02551 char* numbering_name(const char* fmt, int n)
02552 {
02553 int len;
02554 char fname[LNAME], *fo;
02555
02556 memset(fname, 0, LNAME);
02557 snprintf(fname, LNAME-1, fmt, n);
02558 len = (int)strlen(fname);
02559
02560 fo = (char*)malloc(len + 1);
02561 if (fo==NULL) return NULL;
02562
02563 memset(fo, 0, len+1);
02564 strncpy(fo, fname, len);
02565 return fo;
02566 }
02567
02568
02569
02570
02572
02583 void kanji_convert(unsigned char* mesg)
02584 {
02585 if (KanjiCode==CODE_SJIS) {
02586 kanji_convert_euc2sjis(mesg);
02587 }
02588 }
02589
02590
02591
02599 void kanji_convert_euc2sjis(unsigned char* mesg)
02600 {
02601 int i = 0;
02602 while(mesg[i]!='\0' && mesg[i+1]!='\0'){
02603 if (mesg[i]>=0xa1 && mesg[i]<=0xfe){
02604 euc2sjis(&mesg[i], &mesg[i+1]);
02605 i = i + 2;
02606 }
02607 else i++;
02608 }
02609 }
02610
02611
02612
02620 void kanji_convert_sjis2euc(unsigned char* mesg)
02621 {
02622 int i = 0;
02623 while(mesg[i]!='\0' && mesg[i+1]!='\0'){
02624
02625 if ((mesg[i]>=0x81 && mesg[i]<=0x9f) ||
02626 (mesg[i]>=0xe0 && mesg[i]<=0xfe) || mesg[i]==0xff) {
02627 sjis2euc(&mesg[i], &mesg[i+1]);
02628 i = i + 2;
02629 }
02630 else i++;
02631 }
02632 }
02633
02634
02635
02644 void euc2sjis(unsigned char *c1, unsigned char *c2)
02645 {
02646 if (*c1%2==0) *c2 -= 0x02;
02647 else{
02648 *c2 -= 0x61;
02649 if (*c2>0x7e) (*c2)++;
02650 }
02651
02652 if (*c1<0xdf) {
02653 (*c1)++;
02654 *c1 /= 2;
02655 *c1 += 0x30;
02656 }
02657 else {
02658 (*c1)++;
02659 *c1 /= 2;
02660 *c1 += 0x70;
02661 }
02662 }
02663
02664
02665
02674 void sjis2euc(unsigned char *c1, unsigned char *c2)
02675 {
02676 if (*c2<0x9f) {
02677 if (*c1 < 0xa0) {
02678 *c1 -= 0x81;
02679 *c1 *= 2;
02680 *c1 += 0xa1;
02681 }
02682
02683 else {
02684 *c1 -= 0xe0;
02685 *c1 *= 2;
02686 *c1 += 0xdf;
02687 }
02688 if (*c2>0x7f) (*c2)--;
02689 *c2 += 0x61;
02690 }
02691 else {
02692 if (*c1<0xa0) {
02693 *c1 -= 0x81;
02694 *c1 *= 2;
02695 *c1 += 0xa2;
02696 }
02697 else {
02698 *c1 -= 0xe0;
02699 *c1 *= 2;
02700 *c1 += 0xe0;
02701 }
02702 *c2 += 2;
02703 }
02704 }
02705
02706
02707
02715 void upper_string(char* str)
02716 {
02717 int i;
02718 for (i=0; i<(int)strlen((const char*)str); i++) {
02719 if (str[i]>='a' && str[i]<='z') str[i] += 'A' - 'a';
02720 }
02721 }
02722
02723
02724
02746 unsigned char* decode_base64(unsigned char* buf, int* sz)
02747 {
02748 int i, j, cc=0, bas, lt, ln;
02749 unsigned char* dcd;
02750
02751 lt = 0;
02752 ln = (int)strlen((const char*)buf);
02753 while (buf[lt]!='=' && lt<ln) {
02754 lt++;
02755 if (lt==ln) break;
02756 }
02757
02758
02759 int len = ((lt+1)*3)/4;
02760 if (sz!=NULL) *sz = len;
02761
02762 dcd = (unsigned char*)malloc(len);
02763 if (dcd==NULL) return NULL;
02764 memset(dcd, 0, len);
02765
02766 for (i=0; i<lt; i++) {
02767 if (buf[i]>='A' && buf[i]<='Z') cc = buf[i] - 'A';
02768 else if (buf[i]>='a' && buf[i]<='z') cc = buf[i] - 'a' + 26;
02769 else if (buf[i]>='0' && buf[i]<='9') cc = buf[i] - '0' + 52;
02770 else if (buf[i]=='+') cc = 62;
02771 else if (buf[i]=='/') cc = 63;
02772
02773 if (cc<64) {
02774 bas = 32;
02775 for (j=0; j<6; j++) {
02776 setBit(dcd, i*6+j, cc/bas);
02777 cc = cc%bas;
02778 bas = bas/2;
02779 }
02780 }
02781 }
02782
02783 return dcd;
02784 }
02785
02786
02787
02811 unsigned char* encode_base64(unsigned char* buf, int sz)
02812 {
02813 unsigned char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
02814 unsigned char bas;
02815 int i, j, len;
02816 unsigned char* ecd;
02817
02818 if (buf==NULL) return NULL;
02819 if (sz<0) len = (int)strlen((const char*)buf);
02820 else len = sz;
02821 if (len<=0) return NULL;
02822
02823 sz = ((len+2)/3)*4;
02824 ecd = (unsigned char*)malloc(sz+1);
02825 if (ecd==NULL) return NULL;
02826 memset(ecd, 0, sz+1);
02827
02828 for (i=0; i<sz; i++) {
02829 bas = 0x00;
02830 if (len*8 > i*6) {
02831 for (j=0; j<6; j++) {
02832 if (len*8 > i*6+j) setBit(&bas, j+2, getBit(buf, i*6+j));
02833
02834 }
02835 ecd[i] = base[(int)bas];
02836 }
02837 else {
02838 ecd[i] = '=';
02839 }
02840 }
02841
02842 return ecd;
02843 }
02844
02845
02851 unsigned char* decode_base64_filename(unsigned char* buf, int* sz)
02852 {
02853 int i, len = (int)strlen((char*)buf);
02854 for (i=0; i<len; i++) {
02855 if (buf[i]=='$') buf[i] = '/';
02856 }
02857
02858 unsigned char* dec = decode_base64(buf, sz);
02859
02860 return dec;
02861 }
02862
02863
02869 unsigned char* encode_base64_filename(unsigned char* buf, int sz)
02870 {
02871 unsigned char* enc = encode_base64(buf, sz);
02872
02873 int i, len = (int)strlen((char*)enc);
02874 for (i=0; i<len; i++) {
02875 if (enc[i]=='/') enc[i] = '$';
02876 }
02877
02878 return enc;
02879 }
02880
02881
02882
02893 unsigned char* decode_urlenc(unsigned char* buf, int* sz)
02894 {
02895 int i, j, len;
02896 unsigned char* dec;
02897
02898 if (buf==NULL) return NULL;
02899
02900 len = (int)strlen((const char*)buf) + 1;
02901 dec = (unsigned char*)malloc(len);
02902 if (dec==NULL) return NULL;
02903 memset(dec, 0, len);
02904
02905 i = j = 0;
02906 while (buf[i]!='\0') {
02907 if (buf[i]=='%') {
02908 if (buf[i+1]=='\0') return dec;
02909 if (buf[i+2]=='\0') return dec;
02910 dec[j++] = decode_hex(buf[i+1], buf[i+2]);
02911 i += 2;
02912 }
02913 else {
02914 if (buf[i]=='+') dec[j++] = ' ';
02915 else dec[j++] = buf[i];
02916 }
02917 i++;
02918 }
02919
02920 *sz = j;
02921 return dec;
02922 }
02923
02924
02925
02940 unsigned char* encode_urlenc(unsigned char* buf, int sz)
02941 {
02942 int i, j, len;
02943 unsigned char* enc;
02944
02945 if (buf==NULL) return NULL;
02946
02947 if (sz<0) sz = (int)strlen((const char*)buf);
02948 len = sz*3 + 1;
02949 enc = (unsigned char*)malloc(len);
02950 if (enc==NULL) return NULL;
02951 memset(enc, 0, len);
02952
02953 for(i=0, j=0; i<sz; i++) {
02954 if (buf[i]==' ') {
02955 enc[j++] = '+';
02956 }
02957 else if ((buf[i]>=0x30 && buf[i]<=0x39) ||
02958 (buf[i]>=0x41 && buf[i]<=0x5a) ||
02959 (buf[i]>=0x61 && buf[i]<=0x7a) ||
02960 buf[i]=='-' || buf[i]=='.' || buf[i]=='_'){
02961 enc[j++] = buf[i];
02962 }
02963 else {
02964 unsigned char* asc = encode_hex(buf[i]);
02965 if (asc==NULL) {
02966 free(enc);
02967 return NULL;
02968 }
02969 enc[j++] = '%';
02970 enc[j++] = asc[0];
02971 enc[j++] = asc[1];
02972 free(asc);
02973 }
02974 }
02975
02976 return enc;
02977 }
02978
02979
02980
02991 unsigned char* decode_quoted_printable(unsigned char* buf, int* sz)
02992 {
02993 int i, j, len;
02994 unsigned char* dec;
02995
02996 len = (int)strlen((const char*)buf) + 1;
02997 dec = (unsigned char*)malloc(len);
02998 if (dec==NULL) return NULL;
02999 memset(dec, 0, len);
03000
03001 i = j = 0;
03002 while (buf[i]!='\0') {
03003 if (buf[i]=='=') {
03004 if (buf[i+1]=='\0') return dec;
03005 if (buf[i+2]=='\0') return dec;
03006 dec[j++] = decode_hex(buf[i+1], buf[i+2]);
03007 i += 2;
03008 }
03009 else {
03010 if (buf[i]=='_') dec[j++] = ' ';
03011 else dec[j++] = buf[i];
03012 }
03013 i++;
03014 }
03015
03016 *sz = j;
03017 return dec;
03018 }
03019
03020
03021
03037 unsigned char* encode_quoted_printable(unsigned char* buf, int sz)
03038 {
03039 int i, j, len;
03040 unsigned char* enc;
03041
03042 if (sz<0) sz = (int)strlen((const char*)buf);
03043 len = sz*3 + 1;
03044 enc = (unsigned char*)malloc(len);
03045 if (enc==NULL) return NULL;
03046 memset(enc, 0, len);
03047
03048 for (i=0, j=0; i<sz; i++) {
03049 if (buf[i]=='=') {
03050 enc[j++] = '=';
03051 enc[j++] = '3';
03052 enc[j++] = 'D';
03053 }
03054 else if (buf[i]=='_') {
03055 enc[j++] = '=';
03056 enc[j++] = '5';
03057 enc[j++] = 'F';
03058 }
03059 else if (buf[i]==' ') {
03060 enc[j++] = '_';
03061 }
03062 else if (buf[i]<=0x1f || buf[i]>=0x7f) {
03063 unsigned char* asc = encode_hex(buf[i]);
03064 if (asc==NULL) {
03065 free(enc);
03066 return NULL;
03067 }
03068 enc[j++] = '=';
03069 enc[j++] = asc[0];
03070 enc[j++] = asc[1];
03071 free(asc);
03072 }
03073 else {
03074 enc[j++] = buf[i];
03075 }
03076 }
03077
03078 return enc;
03079 }
03080
03081
03082
03102 unsigned char* encode_hex(unsigned char cc)
03103 {
03104 unsigned char* ret;
03105 unsigned char pp1, pp2;
03106 unsigned char base[] = "0123456789ABCDEF";
03107
03108 ret = (unsigned char*)malloc(3);
03109 if (ret==NULL) return NULL;
03110
03111 pp1 = cc >> 4;
03112 pp2 = cc & 0x0f;
03113
03114 ret[0] = base[pp1];
03115 ret[1] = base[pp2];
03116 ret[2] = '\0';
03117
03118 return ret;
03119 }
03120
03121
03122
03136 unsigned char decode_hex(unsigned char pp1, unsigned char pp2)
03137 {
03138 unsigned char ret;
03139
03140 if (pp1>=0x30 && pp1<=0x39) pp1 -= 0x30;
03141 else if (pp1>=0x41 && pp1<=0x46) pp1 -= 0x37;
03142 else if (pp1>=0x61 && pp1<=0x66) pp1 -= 0x57;
03143 else pp1 = 0x00;
03144
03145 if (pp2>=0x30 && pp2<=0x39) pp2 -= 0x30;
03146 else if (pp2>=0x41 && pp2<=0x46) pp2 -= 0x37;
03147 else if (pp2>=0x41 && pp2<=0x46) pp2 -= 0x57;
03148 else pp1 = 0x00;
03149
03150 ret = (pp1<<4) + pp2;
03151 return ret;
03152 }
03153
03154
03155
03156
03158
03159
03160
03170 ringBuffer* new_ringBuffer(int sz)
03171 {
03172 ringBuffer* rb;
03173
03174 rb = (ringBuffer*)malloc(sizeof(ringBuffer));
03175 if (rb==NULL) return NULL;
03176 memset(rb, 0, sizeof(ringBuffer));
03177 rb->state = JBXL_NORMAL;
03178
03179 if (sz>0) {
03180 rb->buf = (unsigned char*)malloc(sz);
03181 if (rb->buf==NULL) return rb;
03182 memset(rb->buf, 0, sz);
03183 rb->bufsz = sz;
03184 }
03185 return rb;
03186 }
03187
03188
03189
03199 void del_ringBuffer(ringBuffer** rb)
03200 {
03201 if (rb!=NULL && *rb!=NULL) {
03202 freeNull((*rb)->buf);
03203 free(*rb);
03204 *rb = NULL;
03205 }
03206 }
03207
03208
03209
03218 ringBuffer init_ringBuffer()
03219 {
03220 ringBuffer rb;
03221
03222 memset(&rb, 0, sizeof(ringBuffer));
03223 rb.state = JBXL_NORMAL;
03224
03225 return rb;
03226 }
03227
03228
03229
03239 ringBuffer make_ringBuffer(int sz)
03240 {
03241 ringBuffer rb;
03242
03243 memset(&rb, 0, sizeof(ringBuffer));
03244
03245 if (sz>0) {
03246 rb.buf = (unsigned char*)malloc(sz);
03247 if (rb.buf==NULL) return rb;
03248 memset(rb.buf, 0, sz);
03249 rb.bufsz = sz;
03250 rb.state = JBXL_NORMAL;
03251 }
03252
03253 return rb;
03254 }
03255
03256
03257
03265 void free_ringBuffer(ringBuffer* rb)
03266 {
03267 if (rb!=NULL) {
03268 freeNull(rb->buf);
03269 memset(rb, 0, sizeof(ringBuffer));
03270 rb->state = JBXL_NORMAL;
03271 }
03272 }
03273
03274
03275
03283 void clear_ringBuffer(ringBuffer* rb)
03284 {
03285 if (rb!=NULL) {
03286 int sz = rb->bufsz;
03287 unsigned char* ptr = rb->buf;
03288 memset(rb->buf, 0, rb->bufsz);
03289 memset(rb, 0, sizeof(ringBuffer));
03290 rb->buf = ptr;
03291 rb->state = JBXL_NORMAL;
03292 rb->bufsz = sz;
03293 }
03294 }
03295
03296
03297
03313 int put_ringBuffer(ringBuffer* rb, unsigned char* pp, int sz)
03314 {
03315 if (rb==NULL) return JBXL_ARGS_ERROR;
03316 rb->state = JBXL_NORMAL;
03317
03318 if (pp==NULL) return JBXL_ARGS_ERROR;
03319 if (rb->buf==NULL) return JBXL_TOOLS_BUF_ERROR;
03320 if (rb->datasz+sz>rb->bufsz) {
03321 rb->state = JBXL_ERROR;
03322 return JBXL_TOOLS_BUFSZ_ERROR;
03323 }
03324
03325 if (rb->epoint+sz<=rb->bufsz) {
03326 memcpy(&(rb->buf[rb->epoint]), pp, sz);
03327 rb->epoint = rb->epoint + sz;
03328 if (rb->epoint==rb->bufsz) rb->epoint = 0;
03329 }
03330 else {
03331 memcpy(&(rb->buf[rb->epoint]), pp, rb->bufsz-rb->epoint);
03332 memcpy(rb->buf, &(pp[rb->bufsz-rb->epoint]), sz-(rb->bufsz-rb->epoint));
03333 rb->epoint = rb->epoint + sz - rb->bufsz;
03334 }
03335
03336 rb->datasz += sz;
03337 return sz;
03338 }
03339
03340
03341
03355 unsigned char* get_ringBuffer(ringBuffer* rb, int sz)
03356 {
03357 unsigned char* pp;
03358
03359 if (rb==NULL) return NULL;
03360 if (rb->buf==NULL) return NULL;
03361 if (sz>rb->datasz) return NULL;
03362
03363 pp = (unsigned char*)malloc(sz + 1);
03364 if (pp==NULL) return NULL;
03365 memset(pp, 0, sz + 1);
03366
03367 if (rb->spoint+sz<=rb->bufsz) {
03368 memcpy(pp, &(rb->buf[rb->spoint]), sz);
03369 rb->spoint = rb->spoint + sz;
03370 if (rb->spoint==rb->bufsz) rb->spoint = 0;
03371 }
03372 else {
03373 memcpy(pp, &(rb->buf[rb->spoint]), rb->bufsz-rb->spoint);
03374 memcpy(&(pp[rb->bufsz-rb->spoint]), rb->buf, sz-(rb->bufsz-rb->spoint));
03375 rb->spoint = rb->spoint + sz - rb->bufsz;
03376 }
03377
03378 rb->datasz -= sz;
03379 return pp;
03380 }
03381
03382
03383
03397 int seek_ringBuffer(ringBuffer* rb, int sz)
03398 {
03399 if (rb==NULL) return FALSE;
03400 if (rb->buf==NULL) return FALSE;
03401 if (sz>rb->datasz) return FALSE;
03402
03403 if (rb->spoint+sz>=rb->bufsz) {
03404 rb->spoint = rb->spoint + sz - rb->bufsz;
03405 }
03406 else if (rb->spoint+sz<0) {
03407 rb->spoint = rb->bufsz + rb->spoint + sz;
03408 }
03409 else {
03410 rb->spoint = rb->spoint + sz;
03411 }
03412
03413 rb->datasz -= sz;
03414 return TRUE;
03415 }
03416
03417
03418
03429 unsigned char* ref_ringBuffer(ringBuffer* rb, int pos)
03430 {
03431 unsigned char* pp;
03432
03433 if (rb==NULL) return NULL;
03434 if (rb->buf==NULL) return NULL;
03435 if (pos>rb->datasz) return NULL;
03436
03437 int sz = rb->spoint + pos;
03438 pp = rb->buf + sz;
03439 if (sz >= rb->bufsz) pp -= rb->bufsz;
03440
03441 return pp;
03442 }
03443
03444
03445
03446
03448
03449
03450
03466 int put_mstream(mstream* sb, unsigned char* mesg)
03467 {
03468 int i, n, m, cc, np=0, len;
03469
03470 if (sb==NULL) return JBXL_ARGS_ERROR;
03471 sb->state = JBXL_NORMAL;
03472 if (mesg==NULL) return JBXL_ARGS_ERROR;
03473 if (sb->buf==NULL) return JBXL_TOOLS_BUF_ERROR;
03474
03475 len = (int)strlen((const char*)mesg);
03476 for (i=0, n=0, m=0; i<len; i++) {
03477 if (mesg[i]==CHAR_LF || (mesg[i]==CHAR_CR && mesg[i+1]!=CHAR_LF)) {
03478 if (m==0) m = i;
03479 n++;
03480 }
03481 }
03482 if (sb->datano==0 && n>=1) np = (sb->epoint + m + 1) % sb->bufsz;
03483
03484 cc = put_ringBuffer(sb, mesg, len);
03485 if (cc>=0) {
03486 if (sb->datano==0 && n>=1) sb->npoint = np;
03487 sb->datano += n;
03488 }
03489
03490 if (cc<0) sb->state = JBXL_ERROR;
03491 return cc;
03492 }
03493
03494
03495
03508 unsigned char* get_mstream(mstream* sb)
03509 {
03510 int n, len;
03511 unsigned char* pp;
03512
03513 if (sb==NULL) return NULL;
03514 sb->state = JBXL_NORMAL;
03515 if (sb->buf==NULL) return NULL;
03516 if (sb->datano==0) return NULL;
03517
03518 len = sb->npoint - sb->spoint;
03519 if (len==0) return NULL;
03520 else if (len<0) len += sb->bufsz;
03521
03522 pp = get_ringBuffer(sb, len);
03523 if (pp==NULL) {
03524 sb->state = JBXL_ERROR;
03525 return NULL;
03526 }
03527 chomp((char*)pp);
03528
03529 sb->datano += -1;
03530 sb->spoint = sb->npoint;
03531
03532 if (sb->datano>=1) {
03533 int m;
03534 n = sb->spoint;
03535 while (n!=sb->epoint) {
03536 m = (n + 1) % sb->bufsz;
03537 if (sb->buf[n]==CHAR_LF || (sb->buf[n]==CHAR_CR && sb->buf[m]!=CHAR_LF)) {
03538 sb->npoint = m;
03539 break;
03540 }
03541 n = m;
03542 }
03543 }
03544
03545 return pp;
03546 }
03547
03548
03549
03569 unsigned char* fgets_mstream(unsigned char* mesg, mstream* sb)
03570 {
03571 int state = JBXL_NORMAL;
03572 unsigned char* pp;
03573
03574 if (sb==NULL) return NULL;
03575 if (sb->buf==NULL) {
03576 *sb = make_mstream(RECVBUFSZ);
03577 if (sb->buf==NULL) return NULL;
03578 }
03579
03580 if (mesg!=NULL) put_mstream(sb, mesg);
03581 if (sb->state<0) state = sb->state;
03582
03583 if (sb->datano==0) {
03584 sb->state = JBXL_NODATA;
03585 return NULL;
03586 }
03587 pp = get_mstream(sb);
03588
03589 if (sb->state>=0 && state<0) sb->state = state;
03590 return pp;
03591 }
03592
03593
03594
03595
03597
03598
03607 unsigned char* uuid2guid(unsigned char* p)
03608 {
03609 unsigned char* guid;
03610
03611 if (p==NULL) return NULL;
03612
03613 guid = (unsigned char*)malloc(LGUID);
03614 if (guid==NULL) return NULL;
03615
03616 snprintf((char*)guid, 37, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
03617 p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8],p[9],p[10],p[11],p[12],p[13],p[14],p[15]);
03618
03619 return guid;
03620 }
03621
03622
03623
03633 unsigned char* guid2uuid(unsigned char* p)
03634 {
03635 int i, j;
03636 unsigned char* uuid;
03637
03638 if (p==NULL) return NULL;
03639
03640 uuid = (unsigned char*)malloc(16);
03641 if (uuid==NULL) return NULL;
03642
03643 i = j = 0;
03644 while (p[i]!='\0' && j<16) {
03645 if (p[i]!='-' && p[i+1]!='\0') {
03646 unsigned char hb, lb;
03647
03648 if (p[i]>='0' && p[i]<='9') hb = p[i] - '0';
03649 else if (p[i]>='a' && p[i]<='f') hb = p[i] - 'a' + 10;
03650 else if (p[i]>='A' && p[i]<='F') hb = p[i] - 'A' + 10;
03651 else hb = '\0';
03652
03653 if (p[i+1]>='0' && p[i+1]<='9') lb = p[i+1] - '0';
03654 else if (p[i+1]>='a' && p[i+1]<='f') lb = p[i+1] - 'a' + 10;
03655 else if (p[i+1]>='A' && p[i+1]<='F') lb = p[i+1] - 'A' + 10;
03656 else lb = '\0';
03657
03658 uuid[j] = (hb<<4) + lb;
03659 i++;
03660 j++;
03661 }
03662 i++;
03663 }
03664
03665 return uuid;
03666 }
03667
03668
03669
03670
03672
03673
03674 #ifndef WIN32
03675
03681 unsigned long int get_used_memory(void)
03682 {
03683 struct sysinfo info;
03684 sysinfo(&info);
03685
03686
03687 unsigned long int mem = info.totalram - info.freeram - info.bufferram - info.sharedram;
03688 return mem*info.mem_unit/1024;
03689 }
03690
03691
03697 unsigned long int get_free_memory(void)
03698 {
03699 struct sysinfo info;
03700 sysinfo(&info);
03701
03702 unsigned long int mem = info.freeram;
03703 return mem*info.mem_unit/1024;
03704 }
03705
03706 #endif
03707
03708
03709
03710
03712
03713
03714 #ifndef WIN32
03715
03716 #ifdef SIGCHLD
03717
03729 void set_sigterm_child(void (*handler)(int))
03730 {
03731 struct sigaction sa;
03732
03733 memset(&sa, 0, sizeof(sa));
03734 if (handler!=NULL) sa.sa_handler = handler;
03735 else sa.sa_handler = sigterm_child;
03736
03737 sa.sa_flags = SA_NOCLDSTOP | SA_RESTART;
03738 sigemptyset(&sa.sa_mask);
03739 sigaddset(&sa.sa_mask, SIGINT);
03740 sigaddset(&sa.sa_mask, SIGHUP);
03741 sigaddset(&sa.sa_mask, SIGTERM);
03742 sigaction(SIGCHLD, &sa, NULL);
03743 }
03744
03745
03746
03754 void sigterm_child(int signal)
03755 {
03756 UNUSED(signal);
03757
03758 pid_t pid = 0;
03759 int ret;
03760
03761
03762
03763
03764 do {
03765 pid = waitpid(-1, &ret, WNOHANG);
03766 } while(pid>0);
03767 }
03768
03769
03775 void ignore_sigterm_child()
03776 {
03777 struct sigaction sa;
03778
03779 memset(&sa, 0, sizeof(sa));
03780 sa.sa_handler = SIG_IGN;
03781 sa.sa_flags = 0;
03782 sigemptyset(&sa.sa_mask);
03783 sigaction(SIGCHLD, &sa, NULL);
03784 }
03785
03786
03787
03797 void set_sigsegv_handler(void (*handler)(int))
03798 {
03799 struct sigaction sa;
03800
03801 memset(&sa, 0, sizeof(sa));
03802 if (handler!=NULL) sa.sa_handler = handler;
03803 else sa.sa_handler = trap_segmentation_falt;
03804
03805 sa.sa_flags = 0;
03806 sigemptyset(&sa.sa_mask);
03807 sigaction(SIGSEGV, &sa, NULL);
03808 }
03809
03810
03811
03819 void trap_segmentation_falt(int signal)
03820 {
03821 PRINT_MESG("****************************************************************\n");
03822 PRINT_MESG("* Segmentation Falt in [%d] !!!!!\n", getpid());
03823 PRINT_MESG("****************************************************************\n");
03824
03825 exit(signal);
03826 }
03827
03828
03829 #endif // SIGCHLD
03830
03831 #endif // NOT WIN32
03832
03833
03834
03836
03837
03838
03839 #ifdef WIN32
03840
03841
03842
03843
03844
03845
03846
03847
03848
03849
03850
03851
03852
03853
03854
03855 #endif // WIN32
03856
03857
03858
03859
03861
03862
03863
03864 FILE* FP_LogFile = NULL;
03865 FILE* FP_ErrFile = NULL;
03866
03867
03873 void open_logfile(void)
03874 {
03875 if (FP_LogFile!=NULL) return;
03876
03877 FP_LogFile = fopen(JBXL_LOG_FILE, "a");
03878 return;
03879 }
03880
03881
03882
03888 void close_logfile(void)
03889 {
03890 if (FP_LogFile==NULL) return;
03891
03892 fclose(FP_LogFile);
03893 FP_LogFile = NULL;
03894
03895 return;
03896 }
03897
03898
03899
03905 void print_logfile(const char* fmt, ...)
03906 {
03907 char* nfmt;
03908 int len;
03909 int slfopn = FALSE;
03910
03911
03912 if (FP_LogFile==NULL) {
03913 FP_LogFile = fopen(JBXL_LOG_FILE, "a");
03914 if (FP_LogFile==NULL) return;
03915 slfopn = TRUE;
03916 }
03917
03918 va_list args;
03919 va_start(args, fmt);
03920
03921 len = (int)strlen(fmt);
03922 nfmt = (char*)malloc(len + 2);
03923 if (nfmt==NULL) return;
03924
03925 strncpy(nfmt, fmt, len);
03926 nfmt[len] = '\n';
03927 nfmt[len+1] = '\0';
03928
03929 vfprintf(FP_LogFile, nfmt, args);
03930 fflush(FP_LogFile);
03931 free(nfmt);
03932
03933 va_end(args);
03934
03935
03936 if (slfopn && FP_LogFile!=NULL) {
03937 fclose(FP_LogFile);
03938 FP_LogFile = NULL;
03939 }
03940
03941 return;
03942 }
03943
03944
03945
03951 void open_errfile(void)
03952 {
03953 if (FP_ErrFile!=NULL) return;
03954
03955 FP_LogFile = fopen(JBXL_ERR_FILE, "a");
03956 return;
03957 }
03958
03959
03960
03966 void close_errfile(void)
03967 {
03968 if (FP_ErrFile==NULL) return;
03969
03970 fclose(FP_ErrFile);
03971 FP_ErrFile = NULL;
03972
03973 return;
03974 }
03975
03976
03977
03983 void print_errfile(const char* fmt, ...)
03984 {
03985 char* nfmt;
03986 int len;
03987 int slfopn = FALSE;
03988
03989
03990 if (FP_ErrFile==NULL) {
03991 FP_ErrFile = fopen(JBXL_ERR_FILE, "a");
03992 if (FP_ErrFile==NULL) return;
03993 slfopn = TRUE;
03994 }
03995
03996 va_list args;
03997 va_start(args, fmt);
03998
03999 len = (int)strlen(fmt);
04000 nfmt = (char*)malloc(len + 2);
04001 if (nfmt==NULL) return;
04002
04003 strncpy(nfmt, fmt, len);
04004 nfmt[len] = '\n';
04005 nfmt[len+1] = '\0';
04006
04007 vfprintf(FP_ErrFile, nfmt, args);
04008 fflush(FP_ErrFile);
04009 free(nfmt);
04010
04011 va_end(args);
04012
04013
04014 if (slfopn && FP_ErrFile!=NULL) {
04015 fclose(FP_ErrFile);
04016 FP_ErrFile = NULL;
04017 }
04018
04019 return;
04020 }
04021
04022
04031 void print_message(const char* fmt, ...)
04032 {
04033 char* nfmt;
04034 int len;
04035
04036 va_list args;
04037 va_start(args, fmt);
04038
04039 len = (int)strlen(fmt);
04040 nfmt = (char*)malloc(len + 1);
04041 if (nfmt==NULL) return;
04042
04043 strncpy(nfmt, fmt, len);
04044 nfmt[len] = '\0';
04045
04046 vfprintf(stderr, nfmt, args);
04047 fflush(stderr);
04048 free(nfmt);
04049
04050 va_end(args);
04051
04052 return;
04053 }
04054
04055
04056
04066 void fprint_message(FILE* fp, const char* fmt, ...)
04067 {
04068 char* nfmt;
04069 int len;
04070
04071 va_list args;
04072 va_start(args, fmt);
04073
04074 len = (int)strlen(fmt);
04075 nfmt = (char*)malloc(len + 1);
04076 if (nfmt==NULL) return;
04077
04078 strncpy(nfmt, fmt, len);
04079 nfmt[len] = '\0';
04080
04081 vfprintf(fp, nfmt, args);
04082 fflush(fp);
04083 free(nfmt);
04084
04085 va_end(args);
04086
04087 return;
04088 }
04089
04090
04091
04103 void print_escape(const char* fmt, char* mesg)
04104 {
04105 char* pp;
04106
04107 if (fmt==NULL || mesg==NULL) return;
04108
04109 pp = change_esc(mesg);
04110 if (pp==NULL) return;
04111
04112 PRINT_MESG(fmt, pp);
04113 free(pp);
04114 }
04115
04116
04117
04131 void fprint_escape(FILE* fp, char* fmt, char* mesg)
04132 {
04133 char* pp;
04134
04135 if (fmt==NULL || mesg==NULL) return;
04136
04137 pp = change_esc(mesg);
04138 if (pp==NULL) return;
04139
04140 fprint_message(fp, fmt, pp);
04141 free(pp);
04142 }
04143
04144
04145
04157 void fdump(FILE* fp, unsigned char* mesg, int n)
04158 {
04159 int i, j, mod, len;
04160 char ascii[16];
04161
04162 if (fp==NULL) fp = stderr;
04163
04164 if (mesg==NULL) {
04165 fprintf(fp, "(Dump Data is NULL)\n");
04166 return;
04167 }
04168
04169 if (n<0) len = (int)strlen((const char*)mesg);
04170 else len = n;
04171
04172 memset(ascii, 0x2e, 16);
04173 for (i=0, j=0; i<len; i++) {
04174 fprintf(fp, "%02x ", mesg[i]);
04175 if (mesg[i]>=0x20 && mesg[i]<=0x7e) ascii[j] = mesg[i];
04176 j++;
04177 if (j==16) {
04178 fprintf(fp, " ");
04179 for (j=0; j<16; j++) {
04180 fprintf(fp, "%c ", ascii[j]);
04181 }
04182 fprintf(fp, "\n");
04183 memset(ascii, 0x2e, 16);
04184 j = 0;
04185 }
04186 }
04187
04188 mod = len%16;
04189 if (mod>0) {
04190 for (i=0; i<17-mod; i++) fprintf(fp, " ");
04191 for (i=0; i<mod; i++) fprintf(fp, "%c ", ascii[i]);
04192 }
04193 fprintf(fp, "\n");
04194 }
04195
04196
04197
04209 void print_16x(FILE* fp, unsigned char* mesg, int n)
04210 {
04211 int i, len;
04212
04213 if (fp==NULL) fp = stderr;
04214
04215 if (n<0) len = (int)strlen((const char*)mesg);
04216 else len = n;
04217
04218 for (i=0; i<len; i++) {
04219 fprintf(fp, "%02x", mesg[i]);
04220 }
04221 fprintf(fp, "\n");
04222 }
04223
04224