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