JunkBox_Lib  1.10.2
tools.c
Go to the documentation of this file.
1 
8 #ifdef CPLUSPLUS
9  #undef CPLUSPLUS
10 #endif
11 
12 
13 #include "tools.h"
14 #include "jbxl_state.h"
15 
16 
17 int DebugMode = OFF;
19 
22 
23 unsigned long int UsedMemoryBase = 0;
24 
25 //
26 unsigned char LocalIPNum[4] = {0x7f, 0x00, 0x00, 0x01};
27 unsigned char LocalIPNum6[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
28 
29 
31 //
32 
33 // case of C++, isNull() is inline
34 
35 #ifndef CPLUSPLUS
36 
51 int isNull(void* p)
52 {
53  if (p==NULL) return TRUE;
54 
55 #ifdef WIN32
56  if (p==WIN_DD_NULL) return TRUE;
57 #endif
58 
59  return FALSE;
60 }
61 
62 #endif
63 
64 
66 //
67 
81 {
82  unsigned char x[] = {0x01, 0x00};
83 
84  if (HostEndian==LITTLE_ENDIAN) return TRUE;
85 
86  else if (HostEndian==BIG_ENDIAN) return FALSE;
87 
88  else {
89  unsigned short* xx = (unsigned short*)x;
90  if (*xx==1) {
92  return TRUE;
93  }
94  else {
96  return FALSE;
97  }
98  }
99 }
100 
101 
114 int is_big_endian(void)
115 {
116  unsigned char x[] = {0x00, 0x01};
117 
118  if (HostEndian==BIG_ENDIAN) return TRUE;
119 
120  else if (HostEndian==LITTLE_ENDIAN) return FALSE;
121 
122  else {
123  unsigned short* xx = (unsigned short*)x;
124  if (*xx==1) {
126  return TRUE;
127  }
128  else {
130  return FALSE;
131  }
132  }
133 }
134 
135 
143 void check_endian(void)
144 {
146 }
147 
148 
156 double double_from_little_endian(void* ptr)
157 {
158  double ret = *((double*)ptr);
159 
161  if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 8);
162  return ret;
163 }
164 
165 
174 float float_from_little_endian(void* ptr)
175 {
176  float ret = *((float*)ptr);
177 
179  if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 4);
180  return ret;
181 }
182 
183 
193 {
194  int ret = *((int*)ptr);
195 
197  if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 4);
198  return ret;
199 }
200 
201 
210 unsigned int uint_from_little_endian(void* ptr)
211 {
212  unsigned int ret = *((unsigned int*)ptr);
213 
215  if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 4);
216  return ret;
217 }
218 
219 
228 short short_from_little_endian(void* ptr)
229 {
230  short ret = *((short*)ptr);
231 
233  if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 2);
234  return ret;
235 }
236 
237 
246 unsigned short ushort_from_little_endian(void* ptr)
247 {
248  unsigned short ret = *((unsigned short*)ptr);
249 
251  if (HostEndian==BIG_ENDIAN) reverse_str((uByte*)(&ret), 2);
252  return ret;
253 }
254 
255 
264 double double_from_big_endian(void* ptr)
265 {
266  double ret = *((double*)ptr);
267 
269  if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 8);
270  return ret;
271 }
272 
273 
282 float float_from_big_endian(void* ptr)
283 {
284  float ret = *((float*)ptr);
285 
287  if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 4);
288  return ret;
289 }
290 
291 
300 int int_from_big_endian(void* ptr)
301 {
302  int ret = *((int*)ptr);
303 
305  if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 4);
306  return ret;
307 }
308 
309 
318 unsigned int uint_from_big_endian(void* ptr)
319 {
320  int ret = *((unsigned int*)ptr);
321 
323  if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 4);
324  return ret;
325 }
326 
327 
336 short short_from_big_endian(void* ptr)
337 {
338  short ret = *((short*)ptr);
339 
341  if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 2);
342  return ret;
343 }
344 
345 
354 unsigned short ushort_from_big_endian(void* ptr)
355 {
356  unsigned short ret = *((unsigned short*)ptr);
357 
359  if (HostEndian==LITTLE_ENDIAN) reverse_str((uByte*)(&ret), 2);
360  return ret;
361 }
362 
363 
365 // Time
366 
367 //char _Local_Time[64]; ///< 作業用(ローカルタイム)
368 
369 
386 /*
387 char* get_localtime(char c1, char c2, char c3, char c4)
388 {
389  struct tm* pt;
390  time_t tm;
391 
392  tm = time(NULL);
393  pt = localtime(&tm);
394 
395  snprintf(_Local_Time, 63, "%04d%c%02d%c%02d%c%02d%c%02d%c%02d%c",
396  pt->tm_year+1900, c1, pt->tm_mon+1, c1, pt->tm_mday, c2,
397  pt->tm_hour, c3, pt->tm_min, c3, pt->tm_sec, c4);
398 
399  return _Local_Time;
400 }
401 */
402 
403 
414 /*
415 char* get_localtime_ts(char c1, char c2, char c3, char c4)
416 {
417  struct tm* pt;
418  time_t tm;
419  char* local_tm = NULL;
420 
421  local_tm = (char*)malloc(64);
422  if (local_tm==NULL) return NULL;
423  memset(local_tm, 0, 64);
424 
425  tm = time(NULL);
426  pt = localtime(&tm);
427 
428  snprintf(local_tm, 63, "%04d%c%02d%c%02d%c%02d%c%02d%c%02d%c",
429  pt->tm_year+1900, c1, pt->tm_mon+1, c1, pt->tm_mday, c2,
430  pt->tm_hour, c3, pt->tm_min, c3, pt->tm_sec, c4);
431 
432  return local_tm;
433 }
434 */
435 
436 
437 // 要 free
438 // char* ltime = get_local_timestamp(time(0), "%Y/%m/%dT%H:%M:%SZ")
439 //
440 char* get_local_timestamp(time_t date, const char* format)
441 {
442  char* buf = (char*)malloc(64);
443  memset(buf, 0, 64);
444 
445  //struct tm tm = *gmtime(&date);
446  struct tm tm = *localtime(&date);
447  strftime(buf, 63, format, &tm);
448 
449  return buf;
450 }
451 
452 
453 // 要 free
454 char* get_gmt_timestamp(time_t date, const char* format)
455 {
456  char* buf = (char*)malloc(64);
457  memset(buf, 0, 64);
458 
459  struct tm tm = *gmtime(&date);
460  //struct tm tm = *localtime(&date);
461  strftime(buf, 63, format, &tm);
462 
463  return buf;
464 }
465 
466 
468 
484 char* get_line(char* buf, int n)
485 {
486  int i, j, pos, cnt;
487  char* ret = NULL;
488 
489  if (buf==NULL) return NULL;
490 
491  for(i=0,j=0; j<n-1; j++) {
492  while (buf[i]!=CHAR_LF && buf[i]!=CHAR_CR && buf[i]!='\0') i++;
493  while (buf[i]==CHAR_LF || buf[i]==CHAR_CR) i++;
494  }
495  if (buf[i]=='\0') return NULL;
496 
497  pos = i;
498  while (buf[i]!=CHAR_LF && buf[i]!=CHAR_CR && buf[i]!='\0') i++;
499  cnt = i - pos;
500 
501  if (cnt>=0) {
502  ret = (char*)malloc(cnt+1);
503  if (ret==NULL) return NULL;
504 
505  for(i=0; i<cnt; i++) ret[i] = buf[pos+i];
506  ret[cnt] = '\0';
507  }
508  return ret;
509 }
510 
511 
529 char* get_seq_data(char* buf, int* ptr)
530 {
531  int pos, cnt;
532  char* ret = NULL;
533 
534  if (buf==NULL || buf[*ptr]=='\0') return NULL;
535 
536  pos = *ptr;
537  while (buf[*ptr]!=CHAR_LF && buf[*ptr]!=CHAR_CR && buf[*ptr]!='\0') (*ptr)++;
538  cnt = *ptr - pos;
539 
540  if (cnt>=0) {
541  ret = (char*)malloc(cnt+1);
542  if (ret==NULL) return NULL;
543 
544  int i;
545  for(i=0; i<cnt; i++) ret[i] = buf[pos+i];
546  ret[cnt] = '\0';
547  }
548 
549  while (buf[*ptr]==CHAR_LF || buf[*ptr]==CHAR_CR) (*ptr)++;
550  return ret;
551 }
552 
553 
567 char* awk(char* buf, char cc, int n)
568 {
569  int i, j, pos, cnt;
570  char* item = NULL;
571 
572  if (buf==NULL) return NULL;
573 
574  for(i=0,j=0; j<n-1; j++) {
575  while (buf[i]!='\0' && buf[i]!=cc) i++;
576  if (buf[i]==cc) i++;
577  }
578  if (buf[i]=='\0') return NULL;
579 
580  pos = i;
581  while (buf[i]!='\0' && buf[i]!=cc) i++;
582  cnt = i - pos;
583 
584  item = (char*)malloc(cnt+1);
585  if (item==NULL) return NULL;
586 
587  for (i=0; i<cnt; i++) item[i] = buf[pos+i];
588  item[cnt] = '\0';
589 
590  return item;
591 }
592 
593 
609 char* cawk(char* buf, char cc, int n)
610 {
611  int i, j, pos, cnt;
612  char* item = NULL;
613 
614  if (buf==NULL) return NULL;
615 
616  for(i=0,j=0; j<n-1; j++) {
617  while (buf[i]!='\0' && buf[i]!=cc) i++;
618  while (buf[i]!='\0' && buf[i]==cc) i++;
619  }
620  if (buf[i]=='\0') return NULL;
621 
622  pos = i;
623  while (buf[i]!='\0' && buf[i]!=cc) i++;
624  cnt = i - pos;
625 
626  item = (char*)malloc(cnt+1);
627  if (item==NULL) return NULL;
628 
629  for (i=0; i<cnt; i++) item[i] = buf[pos+i];
630  item[cnt] = '\0';
631 
632  return item;
633 }
634 
635 
650 int bincmp(unsigned char* b1, unsigned char* b2, int n)
651 {
652  int i;
653 
654  if (b1==NULL || b2==NULL) return 1;
655 
656  for (i=0; i<n; i++) {
657  if (b1[i]!=b2[i]) return 1;
658  }
659 
660  return 0;
661 }
662 
663 
674 int strnrvscmp(const char* s1, const char* s2, int n)
675 {
676  int j1, j2;
677 
678  if (s1==NULL || s2==NULL) return 1;
679 
680  j1 = (int)strlen(s1) - 1;
681  j2 = (int)strlen(s2) - 1;
682 
683  while (n>0 && j1>=0 && j2>=0) {
684  if (s1[j1--] != s2[j2--]) return 1;
685  n--;
686  }
687 
688  if (n==0) return 0;
689  else return 1;
690 }
691 
692 
703 int strncaservscmp(const char* s1, const char* s2, int n)
704 {
705  int j1, j2;
706 
707  if (s1==NULL || s2==NULL) return 1;
708 
709  j1 = (int)strlen(s1) - 1;
710  j2 = (int)strlen(s2) - 1;
711 
712  while (n>0 && j1>=0 && j2>=0) {
713  if (toupper(s1[j1--]) != toupper(s2[j2--])) return 1;
714  n--;
715  }
716 
717  if (n==0) return 0;
718  else return 1;
719 }
720 
721 
736 char* strstrcase(const char* buf, const char* nd)
737 {
738  char* pp;
739  char* pb;
740  char* pn;
741 
742  if (buf==NULL || nd==NULL) return NULL;
743 
744  pb = (char*)malloc(strlen(buf)+1);
745  if (pb==NULL) return NULL;
746  memcpy(pb, buf, (int)strlen(buf)+1);
747 
748  pn = (char*)malloc(strlen(nd)+1);
749  if (pn==NULL) {
750  free(pb);
751  return NULL;
752  }
753  memcpy(pn, nd, (int)strlen(nd)+1);
754 
755  upper_string(pb);
756  upper_string(pn);
757 
758  pp = strstr(pb, pn);
759  if (pp!=NULL) {
760  pp = (pp - pb) + (char*)buf;
761  }
762  free(pb);
763  free(pn);
764 
765  return pp;
766 }
767 
768 
784 int ex_strncmp(const char* dat, const char* key, int len)
785 {
786  if (dat==NULL || key==NULL) return FALSE;
787 
788  if (len==0) {
789  if (!strcmp(dat, key)) return TRUE;
790  }
791  else if (len>0) {
792  if (!strncmp(dat, key, len)) return TRUE;
793  }
794  else if (len<0) {
795  int sz;
796  if (len==-1) sz = (int)strlen(dat);
797  else sz = (int)strlen(key);
798  if (!strncmp(dat, key, sz)) return TRUE;
799  }
800 
801  return FALSE;
802 }
803 
804 
820 int ex_strncasecmp(const char* dat, const char* key, int len)
821 {
822  if (dat==NULL || key==NULL) return FALSE;
823 
824  if (len==0) {
825  if (!strcasecmp(dat, key)) return TRUE;
826  }
827  else if (len>0) {
828  if (!strncasecmp(dat, key, len)) return TRUE;
829  }
830  else if (len<0) {
831  int sz;
832  if (len==-1) sz = (int)strlen(dat);
833  else sz = (int)strlen(key);
834  if (!strncasecmp(dat, key, sz)) return TRUE;
835  }
836 
837  return FALSE;
838 }
839 
840 
856 int ex_strnrvscmp(const char* dat, const char* key, int len)
857 {
858  if (dat==NULL || key==NULL) return FALSE;
859 
860  if (len==0) {
861  if (!strcmp(dat, key)) return TRUE;
862  }
863  else if (len>0) {
864  if (!strnrvscmp(dat, key, len)) return TRUE;
865  }
866  else if (len<0) {
867  int sz;
868  if (len==-1) sz = (int)strlen(dat);
869  else sz = (int)strlen(key);
870  if (!strnrvscmp(dat, key, sz)) return TRUE;
871  }
872 
873  return FALSE;
874 }
875 
876 
892 int ex_strncaservscmp(const char* dat, const char* key, int len)
893 {
894  if (dat==NULL || key==NULL) return FALSE;
895 
896  if (len==0) {
897  if (!strcasecmp(dat, key)) return TRUE;
898  }
899  else if (len>0) {
900  if (!strncaservscmp(dat, key, len)) return TRUE;
901  }
902  else if (len<0) {
903  int sz;
904  if (len==-1) sz = (int)strlen(dat);
905  else sz = (int)strlen(key);
906  if (!strncaservscmp(dat, key, sz)) return TRUE;
907  }
908 
909  return FALSE;
910 }
911 
912 
921 char* chomp(char* buf)
922 {
923  int i, len;
924 
925  if (buf==NULL) return NULL;
926 
927  len = (int)strlen(buf);
928  for (i=0; i<len; i++) {
929  if (buf[i]==CHAR_LF || buf[i]==CHAR_CR) {
930  buf[i] = '\0';
931  return buf;
932  }
933  }
934  return buf;
935 }
936 
937 
948 char* skip_chars(char* pp, const char* check)
949 {
950  int n, sqf = 0, dqf = 0;
951 
952  n = (int)strlen(check);
953 
954  while (*pp!='\0') {
955  while (*pp=='\\') pp += 2;
956  //
957  if (*pp!='\0') {
958  if (!sqf && *pp=='\"') dqf = 1 - dqf;
959  else if (!dqf && *pp=='\'') sqf = 1 - sqf;
960 
961  else if (!sqf && !dqf) {
962  int i;
963  for (i=0; i<n; i++) {
964  if (*pp==check[i]) return pp;
965  }
966  }
967  pp++;
968  }
969  }
970 
971  return NULL;
972 }
973 
974 
985 char* skip_char(char* pp, char cc)
986 {
987  int sqf = 0, dqf = 0;
988 
989  while (*pp!='\0') {
990  while (*pp=='\\') pp += 2;
991  //
992  if (*pp!='\0') {
993  if (!sqf && *pp=='\"') dqf = 1 - dqf;
994  else if (!dqf && *pp=='\'') sqf = 1 - sqf;
995  else if (!sqf && !dqf && *pp==cc) return pp;
996  pp++;
997  }
998  }
999 
1000  return pp;
1001 }
1002 
1003 
1022 char* skip_char_pair(char* pp, char pair, char end)
1023 {
1024  int cnt = 0, sqf = 0, dqf = 0;
1025 
1026  if (*pp==pair) {
1027  cnt = 1;
1028  pp++;
1029  }
1030 
1031  while (*pp!='\0') {
1032  while (*pp=='\\') pp += 2;
1033  //
1034  if (*pp!='\0') {
1035  if (!sqf && *pp=='\"') dqf = 1 - dqf;
1036  else if (!dqf && *pp=='\'') sqf = 1 - sqf;
1037 
1038  else if (!sqf && !dqf) {
1039  if (*pp==end) cnt--;
1040  else if (*pp==pair) cnt++;
1041  if (cnt==0) return pp;
1042  }
1043  pp++;
1044  }
1045  }
1046 
1047  return pp;
1048 }
1049 
1050 
1060 char* skip_string_end(char* pp)
1061 {
1062  char ch = *pp;
1063 
1064  if (*pp=='\"' || *pp=='\'') {
1065  pp++;
1066  //
1067  while (*pp!='\0') {
1068  while (*pp=='\\') pp += 2;
1069  //
1070  if (*pp!='\0') {
1071  if (*pp==ch) return pp;
1072  }
1073  pp++;
1074  }
1075  }
1076  return pp;
1077 }
1078 
1079 
1092 char* pack_head_tail_char(char* mesg, char cc)
1093 {
1094  int sz;
1095  char* ps;
1096  char* pe;
1097  char* pp;
1098 
1099  if (mesg==NULL) return NULL;
1100 
1101  ps = mesg;
1102  while(*ps==cc || *ps==CHAR_TAB || *ps==CHAR_LF || *ps==CHAR_CR) ps++;
1103  pe = ps;
1104  while(*pe!='\0') pe++;
1105  pe--;
1106  while(*pe==cc || *pe==CHAR_TAB || *pe==CHAR_LF || *pe==CHAR_CR) pe--;
1107 
1108  sz = (int)(pe - ps) + 1;
1109  pp = (char*)malloc((size_t)(sz + 1));
1110  memcpy(pp, ps, sz);
1111  pp[sz] = '\0';
1112 
1113  return pp;
1114 }
1115 
1116 
1131 /*
1132 char* pack_char(char* mesg, char cc)
1133 {
1134  return pack_char_len(mesg, cc, -1);
1135 }
1136 */
1137 
1138 
1154 char* pack_char_len(char* mesg, char cc, int len)
1155 {
1156  int i, j;
1157  int sf = OFF; // 連続 cc 用のフラグ
1158  int ff = ON; // 先頭の cc を無視するためのフラグ
1159  char* pp;
1160 
1161  if (mesg==NULL) return NULL;
1162 
1163  if (len==0) return NULL;
1164  if (len<0) len = (int)strlen(mesg);
1165  pp = (char*)malloc(len+1);
1166  if (pp==NULL) return NULL;
1167  memset(pp, 0, len+1);
1168 
1169  i = j = 0;
1170  while(mesg[i]!='\0' && i<len) {
1171  if (mesg[i]==CHAR_TAB) mesg[i] = ' ';
1172  if (mesg[i]!=CHAR_CR && mesg[i]!=CHAR_LF) { // CR LF を読み飛ばす.
1173  if (mesg[i]==cc) {
1174  if (sf==OFF) {
1175  sf = ON;
1176  if (ff==ON) ff = OFF;
1177  else pp[j++] = mesg[i];
1178  }
1179  }
1180  else {
1181  sf = ff = OFF;
1182  pp[j++] = mesg[i];
1183  }
1184  }
1185  i++;
1186  }
1187  pp[j] = '\0';
1188 
1189  // 末尾の cc を削除
1190  i = (int)strlen(pp) - 1;
1191  while(i>=0) {
1192  if (pp[i]==cc) i--;
1193  else break;
1194  }
1195  pp[i+1] = '\0';
1196 
1197  return pp;
1198 }
1199 
1200 
1210 char* change_esc(char* mesg)
1211 {
1212  int i, j;
1213  char* pp;
1214 
1215  if (mesg==NULL) return NULL;
1216 
1217  pp = (char*)malloc((strlen(mesg)+1)*2);
1218  if (pp==NULL) return NULL;
1219  memset(pp, 0, (strlen(mesg)+1)*2);
1220 
1221  i = j = 0;
1222  while(mesg[i]!='\0') {
1223  if (mesg[i]==CHAR_CR) {
1224  pp[j++] = '\\';
1225  pp[j++] = 'r';
1226  }
1227  else if (mesg[i]==CHAR_LF) {
1228  pp[j++] = '\\';
1229  pp[j++] = 'n';
1230  }
1231  else {
1232  pp[j++] = mesg[i];
1233  }
1234  i++;
1235  }
1236  pp[j] = '\0';
1237 
1238  return pp;
1239 }
1240 
1241 
1252 void replace_char(unsigned char* buf, int len, unsigned char frm, unsigned char toc)
1253 {
1254  if (buf==NULL) return;
1255  if (len<=0) len = (int)strlen((char*)buf) + 1;
1256 
1257  int i;
1258  for (i=0; i<len; i++) {
1259  if (buf[i]==frm) buf[i] = toc;
1260  }
1261 
1262  return;
1263 }
1264 
1265 
1282 char* replace_str(char* buf, int len, const char* frm, const char* tos)
1283 {
1284  char* wrk = NULL;
1285  int i, j, k, slen, flen, tlen;
1286 
1287  if (buf==NULL || frm==NULL || tos==NULL) return NULL;
1288  if (len<=0) len = (int)strlen(buf) + 1;
1289 
1290  wrk = (char*)malloc(len);
1291  if (wrk==NULL) return NULL;
1292  memset(wrk, 0, len);
1293 
1294  slen = (int)strlen(buf);
1295  flen = (int)strlen(frm);
1296  tlen = (int)strlen(tos);
1297 
1298  i = j = 0;
1299  while (i<slen && j<len) {
1300  if (!strncmp((const char*)(buf+i), frm, flen)){
1301  for (k=0; k<tlen; k++) {
1302  wrk[j+k] = tos[k];
1303  }
1304  i += flen;
1305  j += tlen;
1306  }
1307  else {
1308  wrk[j++] = buf[i++];
1309  }
1310  }
1311 
1312  //
1313  if (j>=len) {
1314  free(wrk);
1315  return NULL;
1316  }
1317 
1318  wrk[j] = '\0';
1319  for (k=0; k<=j; k++) buf[k] = wrk[k];
1320  free(wrk);
1321 
1322  return buf;
1323 }
1324 
1325 
1338 char* cut_str(char* buf, int ls, int le)
1339 {
1340  int i, len;
1341  char* ret;
1342 
1343  if (buf==NULL) return NULL;
1344 
1345  ls = Max(ls, 0);
1346  le = Min(le, (int)strlen((const char*)buf));
1347  len = le - ls + 1;
1348  if (len<=0) return NULL;
1349 
1350  ret = (char*)malloc(len+1);
1351  if (ret==NULL) return NULL;
1352  memset(ret, 0, len+1);
1353 
1354  for (i=0; i<len; i++) ret[i] = buf[i+ls];
1355 
1356  return ret;
1357 }
1358 
1359 
1368 char* dup_str(char* buf)
1369 {
1370  int len;
1371  char* ret;
1372 
1373  if (buf==NULL) return NULL;
1374 
1375  len = (int)strlen(buf);
1376  ret = (char*)malloc(len+1);
1377  if (ret==NULL) return NULL;
1378 
1379  memcpy(ret, buf, len);
1380  ret[len] = '\0';
1381 
1382  return ret;
1383 }
1384 
1385 
1394 int is_number(unsigned char* str)
1395 {
1396  if (str==NULL) return 0;
1397  int i, len = (int)strlen((char*)str);
1398 
1399  int cnt = 0;
1400  for (i=0; i<len; i++) {
1401  if (str[i]=='.') cnt += 1;
1402  else if (str[i]<'0' || str[i]>'9') return 0;
1403  }
1404  if (cnt>1) return 0;
1405  else if (cnt>0) return 2;
1406  return 1;
1407 }
1408 
1409 
1410 static char _ToSTR[LDATA];
1411 
1420 char* itostr(int n)
1421 {
1422  memset(_ToSTR, 0, LDATA);
1423  snprintf(_ToSTR, LDATA-1, "%d", n);
1424  return _ToSTR;
1425 }
1426 
1427 
1436 char* ltostr(long int n)
1437 {
1438  memset(_ToSTR, 0, LDATA);
1439  snprintf(_ToSTR, LDATA-1, "%ld", n);
1440  return _ToSTR;
1441 }
1442 
1443 
1452 char* ultostr(unsigned long int n)
1453 {
1454  memset(_ToSTR, 0, LDATA);
1455  snprintf(_ToSTR, LDATA-1, "%lu", n);
1456  return _ToSTR;
1457 }
1458 
1459 
1468 char* lltostr(long long int n)
1469 {
1470  memset(_ToSTR, 0, LDATA);
1471  snprintf(_ToSTR, LDATA-1, "%lld", n);
1472  return _ToSTR;
1473 }
1474 
1475 
1484 char* ulltostr(unsigned long long int n)
1485 {
1486  memset(_ToSTR, 0, LDATA);
1487  snprintf(_ToSTR, LDATA-1, "%llu", n);
1488  return _ToSTR;
1489 }
1490 
1491 
1500 char* ftostr(float n)
1501 {
1502  memset(_ToSTR, 0, LDATA);
1503  snprintf(_ToSTR, LDATA-1, "%f", n);
1504  return _ToSTR;
1505 }
1506 
1507 
1516 char* dtostr(double n)
1517 {
1518  memset(_ToSTR, 0, LDATA);
1519  snprintf(_ToSTR, LDATA-1, "%f", n);
1520  return _ToSTR;
1521 }
1522 
1523 
1532 char* itostr_ts(int n)
1533 {
1534  char* str = NULL;
1535  str = (char*)malloc(LDATA);
1536  if (str==NULL) return NULL;
1537 
1538  memset(str, 0, LDATA);
1539  snprintf(str, LDATA-1, "%d", n);
1540  return str;
1541 }
1542 
1543 
1552 char* ltostr_ts(long int n)
1553 {
1554  char* str = NULL;
1555  str = (char*)malloc(LDATA);
1556  if (str==NULL) return NULL;
1557 
1558  memset(str, 0, LDATA);
1559  snprintf(str, LDATA-1, "%ld", n);
1560  return str;
1561 }
1562 
1563 
1572 char* ultostr_ts(unsigned long int n)
1573 {
1574  char* str = NULL;
1575  str = (char*)malloc(LDATA);
1576  if (str==NULL) return NULL;
1577 
1578  memset(str, 0, LDATA);
1579  snprintf(str, LDATA-1, "%lu", n);
1580  return str;
1581 }
1582 
1583 
1592 char* lltostr_ts(long long int n)
1593 {
1594  char* str = NULL;
1595  str = (char*)malloc(LDATA);
1596  if (str==NULL) return NULL;
1597 
1598  memset(str, 0, LDATA);
1599  snprintf(str, LDATA-1, "%lld", n);
1600  return str;
1601 }
1602 
1603 
1612 char* ulltostr_ts(unsigned long long int n)
1613 {
1614  char* str = NULL;
1615  str = (char*)malloc(LDATA);
1616  if (str==NULL) return NULL;
1617 
1618  memset(str, 0, LDATA);
1619  snprintf(str, LDATA-1, "%llu", n);
1620  return str;
1621 }
1622 
1623 
1632 char* ftostr_ts(float n)
1633 {
1634  char* str = NULL;
1635  str = (char*)malloc(LDATA);
1636  if (str==NULL) return NULL;
1637 
1638  memset(str, 0, LDATA);
1639  snprintf(str, LDATA-1, "%f", n);
1640  return str;
1641 }
1642 
1643 
1652 char* dtostr_ts(double n)
1653 {
1654  char* str = NULL;
1655  str = (char*)malloc(LDATA);
1656  if (str==NULL) return NULL;
1657 
1658  memset(str, 0, LDATA);
1659  snprintf(str, LDATA-1, "%f", n);
1660  return str;
1661 }
1662 
1663 
1673 int count_lines(const char* buf)
1674 {
1675  int i = 0;
1676  int line = 0;
1677 
1678  if (buf==NULL) return 0;
1679  line++;
1680 
1681  while(buf[i]!='\0') {
1682  if (buf[i]==CHAR_CR) {
1683  line++;
1684  if (buf[i+1]==CHAR_LF) i++;
1685  }
1686  else if (buf[i]==CHAR_LF) {
1687  line++;
1688  }
1689  i++;
1690  }
1691 
1692  return line;
1693 }
1694 
1695 
1706 int hexstr2i(const char* str)
1707 {
1708  int i, ret = 0;
1709  if (str==NULL) return ret;
1710 
1711  int len = (int)strlen(str);
1712 
1713  for (i=0; i<len; i++) {
1714  if (str[i]>='0' && str[i]<='9') {
1715  ret = ret*16;
1716  ret += (int)(str[i] - '0');
1717  }
1718  else if (str[i]>='A' && str[i]<='F') {
1719  ret = ret*16;
1720  ret += (int)(str[i] - 'A') + 10;
1721  }
1722  else if (str[i]>='a' && str[i]<='f') {
1723  ret = ret*16;
1724  ret += (int)(str[i] - 'a') + 10;
1725  }
1726  else if (str[i]!=' ') {
1727  break;
1728  }
1729  }
1730 
1731  return ret;
1732 }
1733 
1735 
1736 #ifndef WIN32
1737 
1747 void init_rand(void)
1748 {
1749  FILE* fp;
1750  unsigned int seed;
1751  size_t sz;
1752  UNUSED(sz);
1753 
1754  fp = fopen("/dev/urandom", "rb");
1755  if (fp==NULL) {
1756  srand(time(NULL));
1757  return;
1758  }
1759  sz = fread(&seed, sizeof(unsigned int), 1, fp);
1760  fclose(fp);
1761 
1762  srand(seed);
1763 }
1764 
1765 #endif
1766 
1767 
1777 char* randstr(int n)
1778 {
1779  char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
1780  char* pass;
1781  int i, sz;
1782 
1783  if (n<=0) return NULL;
1784  pass = (char*)malloc(n+1);
1785  if (pass==NULL) return pass;
1786 
1787  sz = (int)strlen(base);
1788  for (i=0; i<n; i++) pass[i] = base[rand()%sz];
1789  pass[n] = '\0';
1790 
1791  return pass;
1792 }
1793 
1794 
1804 unsigned char* randbit(int n)
1805 {
1806  int i, sz;
1807  unsigned char* bin;
1808 
1809  sz = (n+7)/8;
1810  bin = (unsigned char*)malloc(sz);
1811  if (bin==NULL) return NULL;
1812 
1813  memset(bin, 0, sz);
1814  for (i=0; i<n; i++) setBit(bin, i, rand()%2);
1815 
1816  return bin;
1817 }
1818 
1819 
1821 
1822 //
1823 // 64bit 変換
1824 unsigned long long int ntohull(unsigned long long int s)
1825 {
1826  if (is_little_endian()) {
1827  long long int d;
1828  uByte* src = (uByte*)&s;
1829  uByte* dst = (uByte*)&d;
1830  dst[0] = src[7];
1831  dst[1] = src[6];
1832  dst[2] = src[5];
1833  dst[3] = src[4];
1834  dst[4] = src[3];
1835  dst[5] = src[2];
1836  dst[6] = src[1];
1837  dst[7] = src[0];
1838  return d;
1839  }
1840  return s;
1841 }
1842 
1843 
1854 void swap_byte(void* p, int s, int c)
1855 {
1856  int i;
1857  uByte* u = (uByte*)p;
1858  for (i=0; i<s; i+=c) reverse_str(&u[i], c);
1859 }
1860 
1861 
1862 
1872 short swaps(unsigned short p)
1873 {
1874  short r;
1875  uByte* t;
1876  uByte* f;
1877 
1878  t = (uByte*)&r;
1879  f = (uByte*)&p;
1880  t[0] = f[1];
1881  t[1] = f[0];
1882 
1883  return r;
1884 }
1885 
1886 
1896 int swapl(unsigned int p)
1897 {
1898  int r;
1899  uByte* t;
1900  uByte* f;
1901 
1902  t = (uByte*)&r;
1903  f = (uByte*)&p;
1904  t[0] = f[3];
1905  t[1] = f[2];
1906  t[2] = f[1];
1907  t[3] = f[0];
1908 
1909  return r;
1910 }
1911 
1912 
1923 long long int swapd(unsigned long long int p)
1924 {
1925  long long int r;
1926  uByte* t;
1927  uByte* f;
1928 
1929  t = (uByte*)&r;
1930  f = (uByte*)&p;
1931  t[0] = f[7];
1932  t[1] = f[6];
1933  t[2] = f[5];
1934  t[3] = f[4];
1935  t[4] = f[3];
1936  t[5] = f[2];
1937  t[6] = f[1];
1938  t[7] = f[0];
1939 
1940  return r;
1941 }
1942 
1943 
1952 void reverse_str(uByte* p, int s)
1953 {
1954  int i;
1955  uByte c;
1956 
1957  if (s<=0) s = (int)strlen((const char*)p);
1958 
1959  for (i=0; i<s/2; i++) {
1960  c = p[s-1-i];
1961  p[s-1-i] = p[i];
1962  p[i] = c;
1963  }
1964 }
1965 
1966 
1967 
1969 
1985 int file_from_to(const char* src, const char* dst, const char* mode)
1986 {
1987  long int sz;
1988  unsigned char* buf;
1989  FILE* fp;
1990  size_t rs;
1991  UNUSED(rs);
1992 
1993  sz = file_size(src);
1994  if (sz<0) return JBXL_FILE_EXIST_ERROR;
1995  buf = (unsigned char*)malloc(sz);
1996  if (buf==NULL) return JBXL_MALLOC_ERROR;
1997  memset(buf, 0, sz);
1998 
1999  fp = fopen(src, "rb");
2000  if (fp==NULL) {
2001  free(buf);
2002  return JBXL_FILE_OPEN_ERROR;
2003  }
2004  rs = fread(buf, sz, 1, fp);
2005  fclose(fp);
2006 
2007  fp = fopen(dst, mode);
2008  if (fp==NULL) {
2009  free(buf);
2010  return JBXL_FILE_DESTOPEN_ERROR;
2011  }
2012  fwrite(buf, sz, 1, fp);
2013  fclose(fp);
2014 
2015  free(buf);
2016  return sz;
2017 }
2018 
2019 
2035 int fp_from_to(FILE* src, FILE* dst, long int sz)
2036 {
2037  unsigned char* buf;
2038  size_t rs;
2039  UNUSED(rs);
2040 
2041  if (sz<=0) return JBXL_ARGS_ERROR;
2042  if (src==NULL) return JBXL_FILE_OPEN_ERROR;
2043  if (dst==NULL) return JBXL_FILE_DESTOPEN_ERROR;
2044 
2045  buf = (unsigned char*)malloc(sz);
2046  if (buf==NULL) return JBXL_MALLOC_ERROR;
2047  memset(buf, 0, sz);
2048 
2049  rs = fread(buf, sz, 1, src);
2050  sz = (int)fwrite(buf, sz, 1, dst);
2051 
2052  free(buf);
2053  return sz;
2054 }
2055 
2056 
2066 char* get_file_name(const char* str)
2067 {
2068  if (str==NULL) return NULL;
2069 
2070 #ifdef WIN32
2071  char cc = '\\';
2072 #else
2073  char cc = '/';
2074 #endif
2075 
2076  int len = (int)strlen(str);
2077  int sz = 0;
2078  while (sz<len && str[len-1-sz]!=cc) sz++;
2079  char* fnm = (char*)str + len - sz;
2080 
2081  return fnm;
2082 }
2083 
2084 
2094 char* del_file_name(const char* str)
2095 {
2096  if (str==NULL) return NULL;
2097 
2098 #ifdef WIN32
2099  char cc = '\\';
2100 #else
2101  char cc = '/';
2102 #endif
2103 
2104  char* path = (char*)str;
2105  int len = (int)strlen(str);
2106  if (len==1) {
2107  if (path[0]==cc) return path;
2108  else return NULL;
2109  }
2110 
2111  int sz = len - 1;
2112  while (sz>=0 && str[sz]!=cc) sz--;
2113 
2114  if (sz<0) {
2115  path[0] = '.';
2116  path[1] = cc;
2117  path[2] = '\0';
2118  }
2119  else {
2120  path[sz+1] = '\0';
2121  }
2122 
2123  return path;
2124 }
2125 
2126 
2137 /*
2138 char* make_file_path(const char* str)
2139 {
2140  if (str==NULL || str[0]=='\0') return NULL;
2141 
2142  int len = (int)strlen(str);
2143  char* path = (char*)malloc(len+1);
2144  memcpy(path, str, len+1);
2145 
2146 #ifdef WIN32
2147  char cc = '\\';
2148 #else
2149  char cc = '/';
2150 #endif
2151 
2152  if (len==1) {
2153  if (path[0]==cc) return path;
2154  else {
2155  free(path);
2156  return NULL;
2157  }
2158  }
2159 
2160  int sz = len - 1;
2161  while (sz>=0 && path[sz]!=cc) sz--;
2162 
2163  if (sz<0) {
2164  if (len>=2) {
2165  path[0] = '.';
2166  path[1] = cc;
2167  path[2] = '\0';
2168  }
2169  else {
2170  free(path);
2171  path = NULL;
2172  }
2173  }
2174  else {
2175  path[sz+1] = '\0';
2176  }
2177 
2178  return path;
2179 }
2180 */
2181 
2182 
2191 char* get_file_path(const char* str)
2192 {
2193  if (str==NULL || str[0]=='\0') return NULL;
2194 
2195  int len = (int)strlen(str);
2196  char* path = (char*)malloc(len + 1);
2197  memcpy(path, str, len + 1);
2198 
2199  char cc1 = '\\';
2200  char cc2 = '/';
2201 
2202  int sz = len - 1;
2203  while (sz>=0 && path[sz]!=cc1 && path[sz]!=cc2) sz--;
2204 
2205  if (sz<0) {
2206  free(path);
2207  path = NULL;
2208  }
2209  else {
2210  path[sz+1] = '\0';
2211  }
2212 
2213  return path;
2214 }
2215 
2216 
2225 char* get_file_extension(const char* str)
2226 {
2227  int sz, len;
2228  char* ext;
2229 
2230  if (str==NULL) return NULL;
2231 
2232  char pd = '.';
2233  char cc1 = '\\';
2234  char cc2 = '/';
2235 
2236  len = (int)strlen(str);
2237  sz = 0;
2238  while (sz<len && str[len-1-sz]!=cc1 && str[len-1-sz]!=cc2 && str[len-1-sz]!=pd) sz++;
2239 
2240  if (str[len-1-sz]!=pd) return NULL;
2241  ext = (char*)str + len - sz;
2242 
2243  return ext;
2244 }
2245 
2246 
2256 char* del_file_extension(const char* str)
2257 {
2258  if (str==NULL) return NULL;
2259 
2260  char cc = '.';
2261  char* path = (char*)str;
2262 
2263  int len = (int)strlen(path);
2264  int sz = len - 1;
2265  while (sz>=0 && path[sz]!=cc) sz--;
2266 
2267  if (sz<1) return path;
2268  path[sz] = '\0';
2269 
2270  return path;
2271 }
2272 
2273 
2282 char* cut_file_extension(const char* str)
2283 {
2284  if (str==NULL) return NULL;
2285 
2286  char cc = '.';
2287  int len = (int)strlen(str);
2288  char* path = (char*)malloc(len+1);
2289  memcpy(path, str, len+1);
2290 
2291  int sz = len - 1;
2292  while (sz>=0 && path[sz]!=cc) sz--;
2293 
2294  if (sz<1) return path;
2295  path[sz] = '\0';
2296 
2297  return path;
2298 }
2299 
2300 
2309 unsigned long int file_size(const char* fn)
2310 {
2311  if (fn==NULL) return -1;
2312 
2313  struct stat stbuf;
2314  stat(fn, &stbuf);
2315 
2316 #ifdef WIN32
2317  return stbuf.st_size;
2318 #else
2319  if (S_ISREG(stbuf.st_mode)) return stbuf.st_size;
2320  else return -2;
2321 #endif
2322 }
2323 
2324 
2337 int file_exist(const char* fn)
2338 {
2339  FILE* fp;
2340 
2341  if (fn==NULL) return FALSE;
2342 
2343  if ((fp=fopen(fn,"rb"))==NULL) {
2344  return FALSE;
2345  }
2346  fclose(fp);
2347  return TRUE;
2348 }
2349 
2350 
2366 FILE* file_chmod_open(const char* fn, const char* fm, mode_t mode)
2367 {
2368  FILE* fp;
2369 
2370  if (!file_exist(fn)) {
2371  if ((fp=fopen(fn,"wb"))==NULL) return NULL;
2372  fclose(fp);
2373  }
2374 
2375 #ifndef WIN32
2376  fp = NULL;
2377  if (chmod(fn, mode)) return fp;
2378 #endif
2379 
2380  fp = fopen(fn, fm);
2381  return fp;
2382 }
2383 
2384 
2397 char* temp_filename(const char* dir, int flen)
2398 {
2399  FILE* fp;
2400  int i, dlen=0;
2401  char nostr = '\0';
2402  char* fname;
2403  char* fnbin;
2404  char* fnb64;
2405  size_t rs;
2406  UNUSED(rs);
2407 
2408  if (dir==NULL) dir = &nostr;
2409  dlen = (int)strlen(dir);
2410  if (flen<=0) flen = 15;
2411 
2412  fname = (char*)malloc(dlen+flen+1);
2413  if (fname==NULL) return NULL;
2414  memset(fname, 0, dlen+flen+1);
2415 
2416  fnbin = (char*)malloc(flen);
2417  if (fnbin==NULL) {
2418  free(fname);
2419  return NULL;
2420  }
2421  memset(fnbin, 0, flen);
2422 
2423  fnb64 = NULL;
2424  fp = fopen("/dev/urandom", "rb");
2425 
2426  do {
2427  if (fp!=NULL) {
2428  rs = fread(fnbin, flen, 1, fp);
2429  fnb64 = (char*)encode_base64((unsigned char*)fnbin, flen);
2430  if (fnb64!=NULL) fnb64[flen] = '\0';
2431  }
2432  if (fnb64==NULL) fnb64 = randstr(flen);
2433 
2434  for (i=0; i<flen; i++) {
2435  if (fnb64[i]=='/') fnb64[i] = 'x';
2436  if (fnb64[i]=='+') fnb64[i] = 'X';
2437  }
2438 
2439  memset (fname, 0, dlen+flen+1);
2440  strncpy(fname, dir, dlen);
2441  strncat(fname, fnb64, flen);
2442  free(fnb64);
2443  } while(file_exist(fname));
2444 
2445  if (fp!=NULL) fclose(fp);
2446  free(fnbin);
2447  return fname;
2448 }
2449 
2450 
2460 unsigned char* read_file(const char* fname, long unsigned int* size)
2461 {
2462  size_t rs;
2463  UNUSED(rs);
2464 
2465  if (size==NULL) return NULL;
2466 
2467  *size = file_size(fname);
2468  if (*size<=0) return NULL;
2469 
2470  unsigned char* buf = (unsigned char*)malloc(*size);
2471  if (buf==NULL) return NULL;
2472  memset(buf, 0, *size);
2473 
2474  FILE* fp = fopen(fname, "rb");
2475  if (fp==NULL) {
2476  free(buf);
2477  return NULL;
2478  }
2479 
2480  rs = fread(buf, *size, 1, fp);
2481  fclose(fp);
2482 
2483  return buf;
2484 }
2485 
2486 
2497 long unsigned int write_file(const char* fname, unsigned char* buf, long unsigned int size)
2498 {
2499  if (size==0) return 0;
2500 
2501  FILE* fp = fopen(fname, "wb");
2502  if (fp==NULL) return 0;
2503 
2504  size = (long unsigned int)fwrite(buf, size, 1, fp);
2505  fclose(fp);
2506 
2507  return size;
2508 }
2509 
2510 
2511 int mkdirp(const char* path, mode_t mode)
2512 {
2513  if (path==NULL) return JBXL_ARGS_ERROR;
2514 
2515  long unsigned int lpath = (long unsigned int)strlen(path);
2516  char* file_name = (char*)malloc(lpath + 1);
2517  memcpy(file_name, path, lpath);
2518  file_name[lpath] = '\0';
2519  //
2520  long unsigned int size = 0;
2521  int mark = 1;
2522 #ifdef WIN32
2523  if (file_name[1]==':') mark = 2; // ex.) "D:/abc/xyz"
2524 #endif
2525 
2526  char* wrk = (char*)malloc(lpath + 1);
2527  while (size < lpath) {
2528  memcpy(wrk, file_name, lpath + 1);
2529  int dirs = 0;
2530  long unsigned int ptr = 0;
2531  for (ptr=0; ptr<=lpath; ptr++) {
2532  if (wrk[ptr]=='/') dirs++;
2533  if (mark==dirs) {
2534  wrk[ptr] = '\0';
2535  struct stat stbuf;
2536  int ret = stat(wrk, &stbuf);
2537  if (ret>=0) {
2538  if (!(stbuf.st_mode & S_IFDIR)) {
2539  return JBXL_FILE_EXIST_ERROR;
2540  }
2541  break;
2542  }
2543  ret = mkdir(wrk, mode);
2544  if (ret<0) return JBXL_DIR_MAKE_ERROR;
2545  break;
2546  }
2547  size = ptr;
2548  }
2549  mark++;
2550  }
2551  free(wrk);
2552  return JBXL_NORMAL;
2553 }
2554 
2555 
2565 char* double_bs(char* str)
2566 {
2567  int i, j;
2568  int len, bsn=0;
2569  char* buf;
2570 
2571  len = (int)strlen(str);
2572  for (i=0; i<len; i++) if (str[i]=='\\') bsn++;
2573  buf = (char*)malloc(len+bsn+1);
2574  if (buf==NULL) return NULL;
2575  memset(buf, 0, len+bsn+1);
2576 
2577  for (i=0,j=0; i<len; i++) {
2578  buf[j++] = str[i];
2579  if (str[i]=='\\') buf[j++] = '\\';
2580  }
2581  buf[j] = '\0';
2582 
2583  return buf;
2584 }
2585 
2586 
2599 char* numbering_name(const char* fmt, int n)
2600 {
2601  int len;
2602  char fname[LNAME], *fo;
2603 
2604  memset(fname, 0, LNAME);
2605  snprintf(fname, LNAME-1, fmt, n);
2606  len = (int)strlen(fname);
2607 
2608  fo = (char*)malloc(len+1);
2609  if (fo==NULL) return NULL;
2610 
2611  memset(fo, 0, len+1);
2612  strncpy(fo, fname, len);
2613  return fo;
2614 }
2615 
2616 
2617 
2619 
2630 void kanji_convert(unsigned char* mesg)
2631 {
2632  if (KanjiCode==CODE_SJIS) {
2633  kanji_convert_euc2sjis(mesg);
2634  }
2635 }
2636 
2637 
2645 void kanji_convert_euc2sjis(unsigned char* mesg)
2646 {
2647  int i = 0;
2648  while(mesg[i]!='\0' && mesg[i+1]!='\0'){
2649  if (mesg[i]>=0xa1 && mesg[i]<=0xfe){ // EUC
2650  euc2sjis(&mesg[i], &mesg[i+1]);
2651  i = i + 2;
2652  }
2653  else i++;
2654  }
2655 }
2656 
2657 
2665 void kanji_convert_sjis2euc(unsigned char* mesg)
2666 {
2667  int i = 0;
2668  while(mesg[i]!='\0' && mesg[i+1]!='\0'){
2669  // if文が変則的なのは,コンパイラで警告が出るため (GCC) 3.3.2 20031218
2670  if ((mesg[i]>=0x81 && mesg[i]<=0x9f) ||
2671  (mesg[i]>=0xe0 && mesg[i]<=0xfe) || mesg[i]==0xff) { // SJIS
2672  sjis2euc(&mesg[i], &mesg[i+1]);
2673  i = i + 2;
2674  }
2675  else i++;
2676  }
2677 }
2678 
2679 
2688 void euc2sjis(unsigned char *c1, unsigned char *c2)
2689 {
2690  if (*c1%2==0) *c2 -= 0x02;
2691  else{
2692  *c2 -= 0x61;
2693  if (*c2>0x7e) (*c2)++;
2694  }
2695 
2696  if (*c1<0xdf) {
2697  (*c1)++;
2698  *c1 /= 2;
2699  *c1 += 0x30;
2700  }
2701  else {
2702  (*c1)++;
2703  *c1 /= 2;
2704  *c1 += 0x70;
2705  }
2706 }
2707 
2708 
2717 void sjis2euc(unsigned char *c1, unsigned char *c2)
2718 {
2719  if (*c2<0x9f) {
2720  if (*c1 < 0xa0) {
2721  *c1 -= 0x81;
2722  *c1 *= 2;
2723  *c1 += 0xa1;
2724  }
2725 
2726  else {
2727  *c1 -= 0xe0;
2728  *c1 *= 2;
2729  *c1 += 0xdf;
2730  }
2731  if (*c2>0x7f) (*c2)--;
2732  *c2 += 0x61;
2733  }
2734  else {
2735  if (*c1<0xa0) {
2736  *c1 -= 0x81;
2737  *c1 *= 2;
2738  *c1 += 0xa2;
2739  }
2740  else {
2741  *c1 -= 0xe0;
2742  *c1 *= 2;
2743  *c1 += 0xe0;
2744  }
2745  *c2 += 2;
2746  }
2747 }
2748 
2749 
2757 void upper_string(char* str)
2758 {
2759  int i;
2760  for (i=0; i<(int)strlen((const char*)str); i++) {
2761  if (str[i]>='a' && str[i]<='z') str[i] += 'A' - 'a';
2762  }
2763 }
2764 
2765 
2787 unsigned char* decode_base64(unsigned char* buf, int* sz)
2788 {
2789  int i, j, cc=0, bas, lt, ln;
2790  unsigned char* dcd;
2791 
2792  lt = 0;
2793  ln = (int)strlen((const char*)buf);
2794  while (buf[lt]!='=' && lt<ln) {
2795  lt++;
2796  if (lt==ln) break;
2797  }
2798 
2799  int len = lt/4*3 + (lt%4)*3/4;
2800  if (sz!=NULL) *sz = len;
2801 
2802  dcd = (unsigned char*)malloc(len+1);
2803  if (dcd==NULL) return NULL;
2804  memset(dcd, 0, len+1);
2805 
2806  for (i=0; i<lt; i++) {
2807  if (buf[i]>='A' && buf[i]<='Z') cc = buf[i] - 'A';
2808  else if (buf[i]>='a' && buf[i]<='z') cc = buf[i] - 'a' + 26;
2809  else if (buf[i]>='0' && buf[i]<='9') cc = buf[i] - '0' + 52;
2810  else if (buf[i]=='+') cc = 62;
2811  else if (buf[i]=='/') cc = 63;
2812 
2813  if (cc<64) {
2814  bas = 32;
2815  for (j=0; j<6; j++) {
2816  setBit(dcd, i*6+j, cc/bas);
2817  cc = cc%bas;
2818  bas = bas/2;
2819  }
2820  }
2821  }
2822  return dcd;
2823 }
2824 
2825 
2849 unsigned char* encode_base64(unsigned char* buf, int sz)
2850 {
2851  unsigned char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
2852  unsigned char bas;
2853  int i, j, len;
2854  unsigned char* ecd;
2855 
2856  if (buf==NULL) return NULL;
2857  if (sz<0) len = (int)strlen((const char*)buf);
2858  else len = sz;
2859  if (len<=0) return NULL;
2860 
2861  sz = ((len+2)/3)*4;
2862  ecd = (unsigned char*)malloc(sz+1);
2863  if (ecd==NULL) return NULL;
2864  memset(ecd, 0, sz+1);
2865 
2866  for (i=0; i<sz; i++) {
2867  bas = 0x00;
2868  if (len*8 > i*6) {
2869  for (j=0; j<6; j++) {
2870  if (len*8 > i*6+j) setBit(&bas, j+2, getBit(buf, i*6+j));
2871  //else setBit(&bas, j+2, 0);
2872  }
2873  ecd[i] = base[(int)bas];
2874  }
2875  else {
2876  ecd[i] = '=';
2877  }
2878  }
2879  return ecd;
2880 }
2881 
2882 
2888 unsigned char* decode_base64_filename(unsigned char* buf, int* sz, unsigned char cc)
2889 {
2890  if (cc==0x00) cc = '-';
2891 
2892  int i, len = (int)strlen((char*)buf);
2893  for (i=0; i<len; i++) {
2894  if (buf[i]==cc) buf[i] = '/';
2895  }
2896 
2897  unsigned char* dec = decode_base64(buf, sz);
2898 
2899  return dec;
2900 }
2901 
2902 
2908 unsigned char* encode_base64_filename(unsigned char* buf, int sz, unsigned char cc)
2909 {
2910  if (cc==0x00) cc = '-';
2911 
2912  unsigned char* enc = encode_base64(buf, sz);
2913 
2914  int i, len = (int)strlen((char*)enc);
2915  for (i=0; i<len; i++) {
2916  if (enc[i]=='/') enc[i] = cc;
2917  }
2918 
2919  return enc;
2920 }
2921 
2922 
2933 unsigned char* decode_urlenc(unsigned char* buf, int* sz)
2934 {
2935  int i, j, len;
2936  unsigned char* dec;
2937 
2938  if (buf==NULL) return NULL;
2939 
2940  len = (int)strlen((const char*)buf) + 1;
2941  dec = (unsigned char*)malloc(len);
2942  if (dec==NULL) return NULL;
2943  memset(dec, 0, len);
2944 
2945  i = j = 0;
2946  while (buf[i]!='\0') {
2947  if (buf[i]=='%') {
2948  if (buf[i+1]=='\0') return dec;
2949  if (buf[i+2]=='\0') return dec;
2950  dec[j++] = decode_hex(buf[i+1], buf[i+2]);
2951  i += 2;
2952  }
2953  else {
2954  if (buf[i]=='+') dec[j++] = ' ';
2955  else dec[j++] = buf[i];
2956  }
2957  i++;
2958  }
2959 
2960  *sz = j;
2961  return dec;
2962 }
2963 
2964 
2965 
2980 unsigned char* encode_urlenc(unsigned char* buf, int sz)
2981 {
2982  int i, j, len;
2983  unsigned char* enc;
2984 
2985  if (buf==NULL) return NULL;
2986 
2987  if (sz<0) sz = (int)strlen((const char*)buf);
2988  len = sz*3 + 1;
2989  enc = (unsigned char*)malloc(len);
2990  if (enc==NULL) return NULL;
2991  memset(enc, 0, len);
2992 
2993  for(i=0, j=0; i<sz; i++) {
2994  if (buf[i]==' ') { // 半角スペース
2995  enc[j++] = '+';
2996  }
2997  else if ((buf[i]>=0x30 && buf[i]<=0x39) || // 0-9
2998  (buf[i]>=0x41 && buf[i]<=0x5a) || // A-Z
2999  (buf[i]>=0x61 && buf[i]<=0x7a) || // a-z
3000  buf[i]=='-' || buf[i]=='.' || buf[i]=='_'){ // - . _
3001  enc[j++] = buf[i];
3002  }
3003  else {
3004  unsigned char* asc = encode_hex(buf[i]);
3005  if (asc==NULL) {
3006  free(enc);
3007  return NULL;
3008  }
3009  enc[j++] = '%';
3010  enc[j++] = asc[0];
3011  enc[j++] = asc[1];
3012  free(asc);
3013  }
3014  }
3015 
3016  return enc;
3017 }
3018 
3019 
3030 unsigned char* decode_quoted_printable(unsigned char* buf, int* sz)
3031 {
3032  int i, j, len;
3033  unsigned char* dec;
3034 
3035  len = (int)strlen((const char*)buf) + 1;
3036  dec = (unsigned char*)malloc(len);
3037  if (dec==NULL) return NULL;
3038  memset(dec, 0, len);
3039 
3040  i = j = 0;
3041  while (buf[i]!='\0') {
3042  if (buf[i]=='=') {
3043  if (buf[i+1]=='\0') return dec;
3044  if (buf[i+2]=='\0') return dec;
3045  dec[j++] = decode_hex(buf[i+1], buf[i+2]);
3046  i += 2;
3047  }
3048  else {
3049  if (buf[i]=='_') dec[j++] = ' '; // RFC2047
3050  else dec[j++] = buf[i];
3051  }
3052  i++;
3053  }
3054 
3055  *sz = j;
3056  return dec;
3057 }
3058 
3059 
3075 unsigned char* encode_quoted_printable(unsigned char* buf, int sz)
3076 {
3077  int i, j, len;
3078  unsigned char* enc;
3079 
3080  if (sz<0) sz = (int)strlen((const char*)buf);
3081  len = sz*3 + 1;
3082  enc = (unsigned char*)malloc(len);
3083  if (enc==NULL) return NULL;
3084  memset(enc, 0, len);
3085 
3086  for (i=0, j=0; i<sz; i++) {
3087  if (buf[i]=='=') { // 0x3d
3088  enc[j++] = '=';
3089  enc[j++] = '3';
3090  enc[j++] = 'D';
3091  }
3092  else if (buf[i]=='_') { // 0x5f
3093  enc[j++] = '=';
3094  enc[j++] = '5';
3095  enc[j++] = 'F';
3096  }
3097  else if (buf[i]==' ') { // 0x20 RFC2047
3098  enc[j++] = '_';
3099  }
3100  else if (buf[i]<=0x1f || buf[i]>=0x7f) {
3101  unsigned char* asc = encode_hex(buf[i]);
3102  if (asc==NULL) {
3103  free(enc);
3104  return NULL;
3105  }
3106  enc[j++] = '=';
3107  enc[j++] = asc[0];
3108  enc[j++] = asc[1];
3109  free(asc);
3110  }
3111  else {
3112  enc[j++] = buf[i];
3113  }
3114  }
3115 
3116  return enc;
3117 }
3118 
3119 
3139 unsigned char* encode_hex(unsigned char cc)
3140 {
3141  unsigned char* ret;
3142  unsigned char pp1, pp2;
3143  unsigned char base[] = "0123456789ABCDEF";
3144 
3145  ret = (unsigned char*)malloc(3);
3146  if (ret==NULL) return NULL;
3147 
3148  pp1 = cc >> 4;
3149  pp2 = cc & 0x0f;
3150 
3151  ret[0] = base[pp1];
3152  ret[1] = base[pp2];
3153  ret[2] = '\0';
3154 
3155  return ret;
3156 }
3157 
3158 
3172 unsigned char decode_hex(unsigned char pp1, unsigned char pp2)
3173 {
3174  unsigned char ret;
3175 
3176  if (pp1>=0x30 && pp1<=0x39) pp1 -= 0x30; // 0-9
3177  else if (pp1>=0x41 && pp1<=0x46) pp1 -= 0x37; // A-F
3178  else if (pp1>=0x61 && pp1<=0x66) pp1 -= 0x57; // a-f
3179  else pp1 = 0x00;
3180 
3181  if (pp2>=0x30 && pp2<=0x39) pp2 -= 0x30; // 0-9
3182  else if (pp2>=0x41 && pp2<=0x46) pp2 -= 0x37; // A-F
3183  else if (pp2>=0x41 && pp2<=0x46) pp2 -= 0x57; // a-f
3184  else pp1 = 0x00;
3185 
3186  ret = (pp1<<4) + pp2;
3187  return ret;
3188 }
3189 
3190 
3191 
3193 // バイト型 リングバッファ
3194 //
3195 
3206 {
3207  ringBuffer* rb;
3208 
3209  rb = (ringBuffer*)malloc(sizeof(ringBuffer));
3210  if (rb==NULL) return NULL;
3211  memset(rb, 0, sizeof(ringBuffer));
3212  rb->state = JBXL_NORMAL;
3213 
3214  if (sz>0) {
3215  rb->buf = (unsigned char*)malloc(sz);
3216  if (rb->buf==NULL) return rb;
3217  memset(rb->buf, 0, sz);
3218  rb->bufsz = sz;
3219  }
3220  return rb;
3221 }
3222 
3223 
3234 {
3235  if (rb!=NULL && *rb!=NULL) {
3236  freeNull((*rb)->buf);
3237  free(*rb);
3238  *rb = NULL;
3239  }
3240 }
3241 
3242 
3252 {
3253  ringBuffer rb;
3254 
3255  memset(&rb, 0, sizeof(ringBuffer));
3256  rb.state = JBXL_NORMAL;
3257 
3258  return rb;
3259 }
3260 
3261 
3272 {
3273  ringBuffer rb;
3274 
3275  memset(&rb, 0, sizeof(ringBuffer));
3276 
3277  if (sz>0) {
3278  rb.buf = (unsigned char*)malloc(sz);
3279  if (rb.buf==NULL) return rb;
3280  memset(rb.buf, 0, sz);
3281  rb.bufsz = sz;
3282  rb.state = JBXL_NORMAL;
3283  }
3284 
3285  return rb;
3286 }
3287 
3288 
3297 {
3298  if (rb!=NULL) {
3299  freeNull(rb->buf);
3300  memset(rb, 0, sizeof(ringBuffer));
3301  rb->state = JBXL_NORMAL;
3302  }
3303 }
3304 
3305 
3314 {
3315  if (rb!=NULL) {
3316  int sz = rb->bufsz;
3317  unsigned char* ptr = rb->buf;
3318  memset(rb->buf, 0, rb->bufsz);
3319  memset(rb, 0, sizeof(ringBuffer));
3320  rb->buf = ptr;
3321  rb->state = JBXL_NORMAL;
3322  rb->bufsz = sz;
3323  }
3324 }
3325 
3326 
3342 int put_ringBuffer(ringBuffer* rb, unsigned char* pp, int sz)
3343 {
3344  if (rb==NULL) return JBXL_ARGS_ERROR;
3345  rb->state = JBXL_NORMAL;
3346 
3347  if (pp==NULL) return JBXL_ARGS_ERROR;
3348  if (rb->buf==NULL) return JBXL_TOOLS_BUF_ERROR;
3349  if (rb->datasz+sz>rb->bufsz) {
3350  rb->state = JBXL_ERROR;
3351  return JBXL_TOOLS_BUFSZ_ERROR;
3352  }
3353 
3354  if (rb->epoint+sz<=rb->bufsz) {
3355  memcpy(&(rb->buf[rb->epoint]), pp, sz);
3356  rb->epoint = rb->epoint + sz;
3357  if (rb->epoint==rb->bufsz) rb->epoint = 0;
3358  }
3359  else {
3360  memcpy(&(rb->buf[rb->epoint]), pp, rb->bufsz-rb->epoint);
3361  memcpy(rb->buf, &(pp[rb->bufsz-rb->epoint]), sz-(rb->bufsz-rb->epoint));
3362  rb->epoint = rb->epoint + sz - rb->bufsz;
3363  }
3364 
3365  rb->datasz += sz;
3366  return sz;
3367 }
3368 
3369 
3383 unsigned char* get_ringBuffer(ringBuffer* rb, int sz)
3384 {
3385  unsigned char* pp;
3386 
3387  if (rb==NULL) return NULL;
3388  if (rb->buf==NULL) return NULL;
3389  if (sz>rb->datasz) return NULL;
3390 
3391  pp = (unsigned char*)malloc(sz+1);
3392  if (pp==NULL) return NULL;
3393  memset(pp, 0, sz+1);
3394 
3395  if (rb->spoint+sz<=rb->bufsz) {
3396  memcpy(pp, &(rb->buf[rb->spoint]), sz);
3397  rb->spoint = rb->spoint + sz;
3398  if (rb->spoint==rb->bufsz) rb->spoint = 0;
3399  }
3400  else {
3401  memcpy(pp, &(rb->buf[rb->spoint]), rb->bufsz-rb->spoint);
3402  memcpy(&(pp[rb->bufsz-rb->spoint]), rb->buf, sz-(rb->bufsz-rb->spoint));
3403  rb->spoint = rb->spoint + sz - rb->bufsz;
3404  }
3405 
3406  rb->datasz -= sz;
3407  return pp;
3408 }
3409 
3410 
3424 int seek_ringBuffer(ringBuffer* rb, int sz)
3425 {
3426  if (rb==NULL) return FALSE;
3427  if (rb->buf==NULL) return FALSE;
3428  if (sz>rb->datasz) return FALSE;
3429 
3430  if (rb->spoint+sz>=rb->bufsz) {
3431  rb->spoint = rb->spoint + sz - rb->bufsz;
3432  }
3433  else if (rb->spoint+sz<0) {
3434  rb->spoint = rb->bufsz + rb->spoint + sz;
3435  }
3436  else {
3437  rb->spoint = rb->spoint + sz;
3438  }
3439 
3440  rb->datasz -= sz;
3441  return TRUE;
3442 }
3443 
3444 
3455 unsigned char* ref_ringBuffer(ringBuffer* rb, int pos)
3456 {
3457  unsigned char* pp;
3458 
3459  if (rb==NULL) return NULL;
3460  if (rb->buf==NULL) return NULL;
3461  if (pos>rb->datasz) return NULL;
3462 
3463  int sz = rb->spoint + pos;
3464  pp = rb->buf + sz;
3465  if (sz >= rb->bufsz) pp -= rb->bufsz;
3466 
3467  return pp;
3468 }
3469 
3470 
3471 
3473 // バイト型 メッセージストリームバッファ
3474 //
3475 
3491 int put_mstream(mstream* sb, unsigned char* mesg)
3492 {
3493  int i, n, m, cc, np=0, len;
3494 
3495  if (sb==NULL) return JBXL_ARGS_ERROR;
3496  sb->state = JBXL_NORMAL;
3497  if (mesg==NULL) return JBXL_ARGS_ERROR;
3498  if (sb->buf==NULL) return JBXL_TOOLS_BUF_ERROR;
3499 
3500  len = (int)strlen((const char*)mesg);
3501  for (i=0, n=0, m=0; i<len; i++) {
3502  if (mesg[i]==CHAR_LF || (mesg[i]==CHAR_CR && mesg[i+1]!=CHAR_LF)) {
3503  if (m==0) m = i;
3504  n++;
3505  }
3506  }
3507  if (sb->datano==0 && n>=1) np = (sb->epoint + m + 1) % sb->bufsz;
3508 
3509  cc = put_ringBuffer(sb, mesg, len);
3510  if (cc>=0) {
3511  if (sb->datano==0 && n>=1) sb->npoint = np;
3512  sb->datano += n;
3513  }
3514 
3515  if (cc<0) sb->state = JBXL_ERROR;
3516  return cc;
3517 }
3518 
3519 
3532 unsigned char* get_mstream(mstream* sb)
3533 {
3534  int n, len;
3535  unsigned char* pp;
3536 
3537  if (sb==NULL) return NULL;
3538  sb->state = JBXL_NORMAL;
3539  if (sb->buf==NULL) return NULL;
3540  if (sb->datano==0) return NULL;
3541 
3542  len = sb->npoint - sb->spoint;
3543  if (len==0) return NULL;
3544  else if (len<0) len += sb->bufsz;
3545 
3546  pp = get_ringBuffer(sb, len);
3547  if (pp==NULL) {
3548  sb->state = JBXL_ERROR;
3549  return NULL;
3550  }
3551  chomp((char*)pp);
3552 
3553  sb->datano += -1;
3554  sb->spoint = sb->npoint;
3555 
3556  if (sb->datano>=1) {
3557  int m;
3558  n = sb->spoint;
3559  while (n!=sb->epoint) {
3560  m = (n + 1) % sb->bufsz;
3561  if (sb->buf[n]==CHAR_LF || (sb->buf[n]==CHAR_CR && sb->buf[m]!=CHAR_LF)) {
3562  sb->npoint = m;
3563  break;
3564  }
3565  n = m;
3566  }
3567  }
3568 
3569  return pp;
3570 }
3571 
3572 
3592 unsigned char* fgets_mstream(unsigned char* mesg, mstream* sb)
3593 {
3594  int state = JBXL_NORMAL;
3595  unsigned char* pp;
3596 
3597  if (sb==NULL) return NULL;
3598  if (sb->buf==NULL) {
3599  *sb = make_mstream(RECVBUFSZ);
3600  if (sb->buf==NULL) return NULL;
3601  }
3602 
3603  if (mesg!=NULL) put_mstream(sb, mesg);
3604  if (sb->state<0) state = sb->state;
3605 
3606  if (sb->datano==0) {
3607  sb->state = JBXL_NODATA;
3608  return NULL;
3609  }
3610  pp = get_mstream(sb);
3611 
3612  if (sb->state>=0 && state<0) sb->state = state;
3613  return pp;
3614 }
3615 
3616 
3617 
3619 //
3620 
3629 unsigned char* uuid2guid(unsigned char* p)
3630 {
3631  unsigned char* guid;
3632 
3633  if (p==NULL) return NULL;
3634 
3635  guid = (unsigned char*)malloc(LGUID); // 40 = 32+4+1(\0) + α
3636  if (guid==NULL) return NULL;
3637  memset(guid, 0, LGUID);
3638 
3639  snprintf((char*)guid, 37, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
3640  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]);
3641 
3642  return guid;
3643 }
3644 
3645 
3655 unsigned char* guid2uuid(unsigned char* p)
3656 {
3657  int i, j;
3658  unsigned char* uuid;
3659 
3660  if (p==NULL) return NULL;
3661 
3662  uuid = (unsigned char*)malloc(16);
3663  if (uuid==NULL) return NULL;
3664  memset(uuid, 0, 16);
3665 
3666  i = j = 0;
3667  while (p[i]!='\0' && j<16) {
3668  if (p[i]!='-' && p[i+1]!='\0') {
3669  unsigned char hb, lb;
3670 
3671  if (p[i]>='0' && p[i]<='9') hb = p[i] - '0';
3672  else if (p[i]>='a' && p[i]<='f') hb = p[i] - 'a' + 10;
3673  else if (p[i]>='A' && p[i]<='F') hb = p[i] - 'A' + 10;
3674  else hb = '\0';
3675 
3676  if (p[i+1]>='0' && p[i+1]<='9') lb = p[i+1] - '0';
3677  else if (p[i+1]>='a' && p[i+1]<='f') lb = p[i+1] - 'a' + 10;
3678  else if (p[i+1]>='A' && p[i+1]<='F') lb = p[i+1] - 'A' + 10;
3679  else lb = '\0';
3680 
3681  uuid[j] = (hb<<4) + lb;
3682  i++;
3683  j++;
3684  }
3685  i++;
3686  }
3687 
3688  return uuid;
3689 }
3690 
3691 
3692 
3694 //
3695 
3696 #ifndef WIN32
3697 
3703 unsigned long int get_used_memory(void)
3704 {
3705  struct sysinfo info;
3706  sysinfo(&info);
3707 
3708  // キャッシュサイズが引けていない.
3709  unsigned long int mem = info.totalram - info.freeram - info.bufferram - info.sharedram;
3710  return mem*info.mem_unit/1024;
3711 }
3712 
3713 
3719 unsigned long int get_free_memory(void)
3720 {
3721  struct sysinfo info;
3722  sysinfo(&info);
3723 
3724  unsigned long int mem = info.freeram;
3725  return mem*info.mem_unit/1024;
3726 }
3727 
3728 
3730 {
3732 }
3733 
3734 
3735 unsigned long int memory_check(void)
3736 {
3737  return get_used_memory() - UsedMemoryBase;
3738 }
3739 
3740 
3741 #endif
3742 
3743 
3744 
3746 // シグナル処理
3747 //
3748 #ifndef WIN32
3749 
3750 #ifdef SIGCHLD
3751 
3763 void set_sigterm_child(void (*handler)(int))
3764 {
3765  struct sigaction sa;
3766 
3767  memset(&sa, 0, sizeof(sa));
3768  if (handler!=NULL) sa.sa_handler = handler;
3769  else sa.sa_handler = sigterm_child;
3770 
3771  sa.sa_flags = SA_NOCLDSTOP | SA_RESTART;
3772  sigemptyset(&sa.sa_mask);
3773  sigaddset(&sa.sa_mask, SIGINT); // SIGCHLD 処理中は SIGINT をブロック
3774  sigaddset(&sa.sa_mask, SIGHUP); // SIGCHLD 処理中は SIGHUP をブロック
3775  sigaddset(&sa.sa_mask, SIGTERM); // SIGCHLD 処理中は SIGTERM をブロック
3776  sigaction(SIGCHLD, &sa, NULL);
3777 }
3778 
3779 
3787 void sigterm_child(int signal)
3788 {
3789  UNUSED(signal);
3790 
3791  pid_t pid = 0;
3792  int ret;
3793 
3794  //DEBUG_MODE PRINT_MESG("%d is waiting for children. signal = %d\n", getpid(), signal);
3795  //signal = 0; // dummy for warning of compiler
3796 
3797  do { // チャイルドプロセスの終了を待つ
3798  pid = waitpid(-1, &ret, WNOHANG);
3799  } while(pid>0);
3800 }
3801 
3802 
3809 {
3810  struct sigaction sa;
3811 
3812  memset(&sa, 0, sizeof(sa));
3813  sa.sa_handler = SIG_IGN;
3814  sa.sa_flags = 0;
3815  sigemptyset(&sa.sa_mask);
3816  sigaction(SIGCHLD, &sa, NULL);
3817 }
3818 
3819 
3829 void set_sigsegv_handler(void (*handler)(int))
3830 {
3831  struct sigaction sa;
3832 
3833  memset(&sa, 0, sizeof(sa));
3834  if (handler!=NULL) sa.sa_handler = handler;
3835  else sa.sa_handler = trap_segmentation_falt;
3836 
3837  sa.sa_flags = 0;
3838  sigemptyset(&sa.sa_mask);
3839  sigaction(SIGSEGV, &sa, NULL);
3840 }
3841 
3842 
3850 void trap_segmentation_falt(int signal)
3851 {
3852  PRINT_MESG("****************************************************************\n");
3853  PRINT_MESG("* Segmentation Falt in [%d] !!!!!\n", getpid());
3854  PRINT_MESG("****************************************************************\n");
3855 
3856  exit(signal);
3857 }
3858 
3859 
3860 #endif // SIGCHLD
3861 
3862 #endif // NOT WIN32
3863 
3864 
3866 // for MS Windows
3867 //
3868 
3869 #ifdef WIN32
3870 
3871 /* see common.h
3872 
3873 void bzero(char* p, unsigned int n)
3874 {
3875  for (unsigned int i=0; i<n; i++) *(p++) = 0x00;
3876 }
3877 
3878 
3879 void bcopy(char* f, char* t, unsigned int n)
3880 {
3881  for (unsigned int i=0; i<n; i++) *(t++) = *(f++);
3882 }
3883 */
3884 
3885 #endif // WIN32
3886 
3887 
3888 
3890 // 入出力&DEBUG
3891 //
3892 
3893 FILE* FP_LogFile = NULL;
3894 FILE* FP_ErrFile = NULL;
3895 
3896 
3902 void open_logfile(void)
3903 {
3904  if (FP_LogFile!=NULL) return;
3905 
3906  FP_LogFile = fopen(JBXL_LOG_FILE, "a");
3907  return;
3908 }
3909 
3910 
3916 void close_logfile(void)
3917 {
3918  if (FP_LogFile==NULL) return;
3919 
3920  fclose(FP_LogFile);
3921  FP_LogFile = NULL;
3922 
3923  return;
3924 }
3925 
3926 
3932 void print_logfile(const char* fmt, ...)
3933 {
3934  char* nfmt;
3935  int len;
3936  int slfopn = FALSE;
3937 
3938  //
3939  if (FP_LogFile==NULL) {
3940  FP_LogFile = fopen(JBXL_LOG_FILE, "a");
3941  if (FP_LogFile==NULL) return;
3942  slfopn = TRUE;
3943  }
3944 
3945  va_list args;
3946  va_start(args, fmt);
3947 
3948  len = (int)strlen(fmt);
3949  nfmt = (char*)malloc(len + 2);
3950  if (nfmt==NULL) return;
3951 
3952  strncpy(nfmt, fmt, len);
3953  nfmt[len] = '\n';
3954  nfmt[len+1] = '\0';
3955 
3956  vfprintf(FP_LogFile, nfmt, args);
3957  fflush(FP_LogFile);
3958  free(nfmt);
3959 
3960  va_end(args);
3961 
3962  //
3963  if (slfopn && FP_LogFile!=NULL) {
3964  fclose(FP_LogFile);
3965  FP_LogFile = NULL;
3966  }
3967 
3968  return;
3969 }
3970 
3971 
3977 void open_errfile(void)
3978 {
3979  if (FP_ErrFile!=NULL) return;
3980 
3981  FP_LogFile = fopen(JBXL_ERR_FILE, "a");
3982  return;
3983 }
3984 
3985 
3991 void close_errfile(void)
3992 {
3993  if (FP_ErrFile==NULL) return;
3994 
3995  fclose(FP_ErrFile);
3996  FP_ErrFile = NULL;
3997 
3998  return;
3999 }
4000 
4001 
4007 void print_errfile(const char* fmt, ...)
4008 {
4009  char* nfmt;
4010  int len;
4011  int slfopn = FALSE;
4012 
4013  //
4014  if (FP_ErrFile==NULL) {
4015  FP_ErrFile = fopen(JBXL_ERR_FILE, "a");
4016  if (FP_ErrFile==NULL) return;
4017  slfopn = TRUE;
4018  }
4019 
4020  va_list args;
4021  va_start(args, fmt);
4022 
4023  len = (int)strlen(fmt);
4024  nfmt = (char*)malloc(len + 2);
4025  if (nfmt==NULL) return;
4026 
4027  strncpy(nfmt, fmt, len);
4028  nfmt[len] = '\n';
4029  nfmt[len+1] = '\0';
4030 
4031  vfprintf(FP_ErrFile, nfmt, args);
4032  fflush(FP_ErrFile);
4033  free(nfmt);
4034 
4035  va_end(args);
4036 
4037  //
4038  if (slfopn && FP_ErrFile!=NULL) {
4039  fclose(FP_ErrFile);
4040  FP_ErrFile = NULL;
4041  }
4042 
4043  return;
4044 }
4045 
4046 
4055 void print_message(const char* fmt, ...)
4056 {
4057  char* nfmt;
4058  int len;
4059 
4060  va_list args;
4061  va_start(args, fmt);
4062 
4063  len = (int)strlen(fmt);
4064  nfmt = (char*)malloc(len + 1);
4065  if (nfmt==NULL) return;
4066 
4067  strncpy(nfmt, fmt, len);
4068  nfmt[len] = '\0';
4069 
4070  vfprintf(stderr, nfmt, args);
4071  fflush(stderr);
4072  free(nfmt);
4073 
4074  va_end(args);
4075 
4076  return;
4077 }
4078 
4079 
4089 void fprint_message(FILE* fp, const char* fmt, ...)
4090 {
4091  char* nfmt;
4092  int len;
4093 
4094  va_list args;
4095  va_start(args, fmt);
4096 
4097  len = (int)strlen(fmt);
4098  nfmt = (char*)malloc(len + 1);
4099  if (nfmt==NULL) return;
4100 
4101  strncpy(nfmt, fmt, len);
4102  nfmt[len] = '\0';
4103 
4104  vfprintf(fp, nfmt, args);
4105  fflush(fp);
4106  free(nfmt);
4107 
4108  va_end(args);
4109 
4110  return;
4111 }
4112 
4113 
4125 void print_escape(const char* fmt, char* mesg)
4126 {
4127  char* pp;
4128 
4129  if (fmt==NULL || mesg==NULL) return;
4130 
4131  pp = change_esc(mesg);
4132  if (pp==NULL) return;
4133 
4134  PRINT_MESG(fmt, pp);
4135  free(pp);
4136 }
4137 
4138 
4152 void fprint_escape(FILE* fp, char* fmt, char* mesg)
4153 {
4154  char* pp;
4155 
4156  if (fmt==NULL || mesg==NULL) return;
4157 
4158  pp = change_esc(mesg);
4159  if (pp==NULL) return;
4160 
4161  fprint_message(fp, fmt, pp);
4162  free(pp);
4163 }
4164 
4165 
4177 void fdump(FILE* fp, unsigned char* mesg, int n)
4178 {
4179  int i, j, mod, len;
4180  char ascii[16];
4181 
4182  if (fp==NULL) fp = stderr;
4183 
4184  if (mesg==NULL) {
4185  fprintf(fp, "(Dump Data is NULL)\n");
4186  return;
4187  }
4188 
4189  if (n<0) len = (int)strlen((const char*)mesg);
4190  else len = n;
4191 
4192  memset(ascii, 0x2e, 16);
4193  for (i=0, j=0; i<len; i++) {
4194  fprintf(fp, "%02x ", mesg[i]);
4195  if (mesg[i]>=0x20 && mesg[i]<=0x7e) ascii[j] = mesg[i];
4196  j++;
4197  if (j==16) {
4198  fprintf(fp, " ");
4199  for (j=0; j<16; j++) {
4200  fprintf(fp, "%c ", ascii[j]);
4201  }
4202  fprintf(fp, "\n");
4203  memset(ascii, 0x2e, 16);
4204  j = 0;
4205  }
4206  }
4207 
4208  mod = len%16;
4209  if (mod>0) {
4210  for (i=0; i<17-mod; i++) fprintf(fp, " ");
4211  for (i=0; i<mod; i++) fprintf(fp, "%c ", ascii[i]);
4212  }
4213  fprintf(fp, "\n");
4214 }
4215 
4216 
4228 void print_16x(FILE* fp, unsigned char* mesg, int n)
4229 {
4230  int i, len;
4231 
4232  if (fp==NULL) fp = stderr;
4233 
4234  if (n<0) len = (int)strlen((const char*)mesg);
4235  else len = n;
4236 
4237  for (i=0; i<len; i++) {
4238  fprintf(fp, "%02x", mesg[i]);
4239  }
4240  fprintf(fp, "\n");
4241 }
4242 
4243 
4244 
4246 // グラフィック
4247 //
4248 
4250 
4252 {
4253  memset(_GraphicFileExtension, 0, L_OCT);
4254 
4255  uWord file = tex & 0x00f0;
4256  if (file==JBXL_TEXTURE_JPEG) memcpy(_GraphicFileExtension, ".jpeg", 5);
4257  else if (file==JBXL_TEXTURE_TIFF) memcpy(_GraphicFileExtension, ".tiff", 5);
4258  else if (file==JBXL_TEXTURE_PNG) memcpy(_GraphicFileExtension, ".png", 4);
4259  else if (file==JBXL_TEXTURE_TGA) memcpy(_GraphicFileExtension, ".tga", 4);
4260  else if (file==JBXL_TEXTURE_JP2K) memcpy(_GraphicFileExtension, ".jp2", 4);
4261  else if (file==JBXL_TEXTURE_RAS) memcpy(_GraphicFileExtension, ".ras", 4);
4262 
4263  return _GraphicFileExtension;
4264 }
4265 
4266 
#define LNAME
Definition: common.h:153
#define Min(x, y)
Definition: common.h:250
#define OFF
Definition: common.h:231
#define LGUID
16*2 + 4(-) + 1('\0') = 37 以上の 4の倍数
Definition: common.h:159
unsigned short uWord
2Byte
Definition: common.h:334
#define setBit(x, n, i)
Definition: common.h:259
#define Max(x, y)
Definition: common.h:247
#define JBXL_TEXTURE_PNG
0x0040
Definition: common.h:324
#define RECVBUFSZ
256K
Definition: common.h:134
#define JBXL_TEXTURE_TGA
0x0050
Definition: common.h:325
#define UNUSED(x)
Definition: common.h:264
#define JBXL_TEXTURE_TIFF
0x0030
Definition: common.h:323
#define TRUE
Definition: common.h:226
#define FALSE
Definition: common.h:223
#define JBXL_TEXTURE_RAS
0x0070 SUN RASTER 8bit
Definition: common.h:327
#define L_OCT
Definition: common.h:168
unsigned char uByte
1Byte
Definition: common.h:332
#define ON
Definition: common.h:230
#define LDATA
Definition: common.h:151
#define JBXL_TEXTURE_JP2K
0x0060
Definition: common.h:326
#define JBXL_TEXTURE_JPEG
0x0020
Definition: common.h:321
#define getBit(x, n)
Definition: common.h:258
void line(WSGraph vp, int x1, int y1, int x2, int y2, int cc)
Definition: graph.c:462
JunkBox_Lib 状態ヘッダ
#define JBXL_FILE_EXIST_ERROR
ファイルが存在しない(シンボリックリンクもダメ).または既に存在する.
Definition: jbxl_state.h:48
#define JBXL_ERROR
エラー
Definition: jbxl_state.h:34
#define JBXL_ARGS_ERROR
不正な引数(NULLなど)
Definition: jbxl_state.h:42
#define JBXL_TOOLS_BUFSZ_ERROR
バッファ(データ格納)部の大きさが足りない
Definition: jbxl_state.h:57
#define JBXL_DIR_MAKE_ERROR
ディレクトリ作成エラー
Definition: jbxl_state.h:53
#define JBXL_NORMAL
正常
Definition: jbxl_state.h:32
#define JBXL_NODATA
有効なデータが無い
Definition: jbxl_state.h:35
#define JBXL_FILE_DESTOPEN_ERROR
ディスティネーションファイルのオープン失敗
Definition: jbxl_state.h:50
#define JBXL_MALLOC_ERROR
メモリ確保エラー
Definition: jbxl_state.h:41
#define JBXL_FILE_OPEN_ERROR
ファイルオープン エラー
Definition: jbxl_state.h:44
#define JBXL_TOOLS_BUF_ERROR
バッファ(データ格納)部の領域がない
Definition: jbxl_state.h:56
unsigned char ** buf
Definition: jpeg_tool.h:96
unsigned char unsigned long * len
Definition: jpeg_tool.h:96
int bufsz
バッファ部のサイズ
Definition: tools.h:157
int datasz
保存されているデータの全体の長さ
Definition: tools.h:160
int state
リングバッファの状態
Definition: tools.h:163
unsigned char * buf
バッファ
Definition: tools.h:156
int spoint
バッファデータの開始点
Definition: tools.h:158
int epoint
バッファデータの終点+1 (データの追加点)
Definition: tools.h:159
static char _ToSTR[LDATA]
作業用(文字変換)
Definition: tools.c:1410
char * del_file_name(const char *str)
フルパスを書き換えてファイル名部分を削除する.free() してはいけない.
Definition: tools.c:2094
int put_mstream(mstream *sb, unsigned char *mesg)
メッセージ(文字列)ストリーム sb へメッセージ(の一部)を格納する
Definition: tools.c:3491
unsigned int uint_from_little_endian(void *ptr)
Definition: tools.c:210
double double_from_big_endian(void *ptr)
Definition: tools.c:264
char * ultostr_ts(unsigned long int n)
Definition: tools.c:1572
int file_exist(const char *fn)
ファイルの存在を検査する.
Definition: tools.c:2337
unsigned char * read_file(const char *fname, long unsigned int *size)
ファイルからデータを読み込む
Definition: tools.c:2460
void trap_segmentation_falt(int signal)
セグメンテーションエラー時にデフォルトで呼び出される関数.
Definition: tools.c:3850
unsigned char * decode_quoted_printable(unsigned char *buf, int *sz)
buf を quoted printableからデコードする.要 free()
Definition: tools.c:3030
void sjis2euc(unsigned char *c1, unsigned char *c2)
SJIS -> EUC.
Definition: tools.c:2717
unsigned short ushort_from_little_endian(void *ptr)
Definition: tools.c:246
unsigned long long int ntohull(unsigned long long int s)
Definition: tools.c:1824
char * awk(char *buf, char cc, int n)
ccを区切り記号として, strのバッファ内の n番目の項目を返す.要 free()
Definition: tools.c:567
int strnrvscmp(const char *s1, const char *s2, int n)
文字列 s1と s2を後ろから n文字比較する.一致するなら 0
Definition: tools.c:674
char * randstr(int n)
ランダムに A-Za-z0-9 までの文字を n文字生成する.
Definition: tools.c:1777
char * get_seq_data(char *buf, int *ptr)
文字型データbufのバッファ内の 行データをシーケンシャルに取り出す.
Definition: tools.c:529
char * get_local_timestamp(time_t date, const char *format)
要 free()
Definition: tools.c:440
unsigned char * guid2uuid(unsigned char *p)
guid を uuid に変換する.要 free()
Definition: tools.c:3655
unsigned long int file_size(const char *fn)
ファイルの大きさを返す.
Definition: tools.c:2309
ringBuffer init_ringBuffer()
リングバッファを初期化する.
Definition: tools.c:3251
unsigned char decode_hex(unsigned char pp1, unsigned char pp2)
16進コードをキャラクタに変換する.O-9,A-F以外が指定された場合は0とみなす. 内容を書き換える.
Definition: tools.c:3172
unsigned char * ref_ringBuffer(ringBuffer *rb, int pos)
spoint 地点から pos番目のデータへの参照.posは 0から数える.spoint は変化しない.
Definition: tools.c:3455
char * change_esc(char *mesg)
文字列中の CR, LF を \r, \n に変換する.要 free()
Definition: tools.c:1210
int fp_from_to(FILE *src, FILE *dst, long int sz)
ファイル sを dにコピーする.
Definition: tools.c:2035
char * skip_string_end(char *pp)
次の文字列を一つスキップする.最期のクォーテーションの位置を返す.
Definition: tools.c:1060
unsigned char * decode_urlenc(unsigned char *buf, int *sz)
buf を URLエンコードからデコードする.要 free()
Definition: tools.c:2933
void print_logfile(const char *fmt,...)
デフォルトのログファイルにデータを書き込む
Definition: tools.c:3932
void close_errfile(void)
デフォルトのエラーファイルをクローズする
Definition: tools.c:3991
short short_from_big_endian(void *ptr)
Definition: tools.c:336
void open_logfile(void)
デフォルトのログファイルをオープンする
Definition: tools.c:3902
void open_errfile(void)
デフォルトのエラーファイルをオープンする
Definition: tools.c:3977
char * double_bs(char *str)
文字列中の \ を \\に置き換えた文字列を返す.要 free()
Definition: tools.c:2565
void sigterm_child(int signal)
child プロセス終了時の処理
Definition: tools.c:3787
void free_ringBuffer(ringBuffer *rb)
リングバッファを解放する.make_ringBuffer() と対.
Definition: tools.c:3296
void print_message(const char *fmt,...)
バッファリングなしのメッセージ出力(stderr)
Definition: tools.c:4055
char * dtostr(double n)
double を文字に変換する.free() は不要
Definition: tools.c:1516
char * get_file_name(const char *str)
フルパスからファイル名へのポインタを取り出す.free() してはいけない.
Definition: tools.c:2066
unsigned char LocalIPNum6[16]
::1 のバイナリ
Definition: tools.c:27
static char _GraphicFileExtension[L_OCT]
Definition: tools.c:4249
char * cut_str(char *buf, int ls, int le)
buf[ls]〜buf[le] を切り出す.要 free()
Definition: tools.c:1338
int bincmp(unsigned char *b1, unsigned char *b2, int n)
バイナリデータを n Byte比べる.一致するなら 0
Definition: tools.c:650
char * strstrcase(const char *buf, const char *nd)
文字列 bufの中に文字列 ndがあるかどうかをチェックする.大文字小文字は区別しない.
Definition: tools.c:736
void kanji_convert_sjis2euc(unsigned char *mesg)
SJISをEUCに変換する.
Definition: tools.c:2665
void swap_byte(void *p, int s, int c)
sの長さのpのバイト順序をbバイト毎に逆順にする.
Definition: tools.c:1854
char * itostr(int n)
int を文字に変換する.free() は不要
Definition: tools.c:1420
unsigned long int memory_check(void)
Definition: tools.c:3735
int file_from_to(const char *src, const char *dst, const char *mode)
modeに従って,ファイル sを dにコピーする.
Definition: tools.c:1985
int ex_strncmp(const char *dat, const char *key, int len)
文字列 s1とs2を拡張比較する.一致するなら TRUE
Definition: tools.c:784
long unsigned int write_file(const char *fname, unsigned char *buf, long unsigned int size)
ファイルにデータを書き込む
Definition: tools.c:2497
void fprint_escape(FILE *fp, char *fmt, char *mesg)
Definition: tools.c:4152
char * ftostr(float n)
float を文字に変換する.free() は不要
Definition: tools.c:1500
void ignore_sigterm_child()
以後 child プロセスの終了を無視する.
Definition: tools.c:3808
int ex_strnrvscmp(const char *dat, const char *key, int len)
文字列 s1とs2を後ろから拡張比較する.一致するなら TRUE
Definition: tools.c:856
int is_number(unsigned char *str)
数字かどうか判定する(簡易版).整数(1) と小数点付き数字(2) のみ.
Definition: tools.c:1394
char * del_file_extension(const char *str)
フルパスを書き換えて拡張子を削除する.free() してはいけない.
Definition: tools.c:2256
char * ltostr(long int n)
long int を文字に変換する.free() は不要
Definition: tools.c:1436
int seek_ringBuffer(ringBuffer *rb, int sz)
リングバッファのデータポインタを seek する.
Definition: tools.c:3424
int UnitTestMode
ユニット単体でのテストを行う場合に使用する.デフォルトは OFF.
Definition: tools.c:18
char * lltostr(long long int n)
long long int を文字に変換する.free() は不要
Definition: tools.c:1468
float float_from_big_endian(void *ptr)
Definition: tools.c:282
void close_logfile(void)
デフォルトのログファイルをクローズする
Definition: tools.c:3916
int ex_strncasecmp(const char *dat, const char *key, int len)
文字列 s1とs2を拡張比較する.大文字小文字を区別しない.一致するなら TRUE
Definition: tools.c:820
int int_from_little_endian(void *ptr)
Definition: tools.c:192
unsigned char * encode_base64_filename(unsigned char *buf, int sz, unsigned char cc)
バイナリデータ bufを Base64で encodeしてファイル名を作る.ただし '/' は cc として扱う.要 free()
Definition: tools.c:2908
unsigned char * encode_quoted_printable(unsigned char *buf, int sz)
バイナリデータ bufを quoted printable にエンコードする.要 free()
Definition: tools.c:3075
int put_ringBuffer(ringBuffer *rb, unsigned char *pp, int sz)
リングバッファにデータを格納する.
Definition: tools.c:3342
void fprint_message(FILE *fp, const char *fmt,...)
バッファリングなしのメッセージ出力
Definition: tools.c:4089
void init_rand(void)
/dev/urandom からデータで乱数の系列を初期化する
Definition: tools.c:1747
unsigned long int get_free_memory(void)
未使用のメモリサイズを得る.
Definition: tools.c:3719
unsigned char * get_mstream(mstream *sb)
メッセージ(文字列)ストリーム sb から次のメッセージを取り出す.改行コードは削除される.
Definition: tools.c:3532
ringBuffer make_ringBuffer(int sz)
バッファ部が存在するリングバッファを作り出す.
Definition: tools.c:3271
char * get_file_extension(const char *str)
フルパスからファイル名の拡張子へのポインタを取り出す.free() してはいけない.
Definition: tools.c:2225
void reverse_str(uByte *p, int s)
バイト(octet)列を逆順にする.
Definition: tools.c:1952
char * skip_char(char *pp, char cc)
cc の文字までポインタをスキップさせる.ただし クォーテーション内は完全スキップ
Definition: tools.c:985
char * ultostr(unsigned long int n)
Definition: tools.c:1452
char * dup_str(char *buf)
文字列を複製する.要 free()
Definition: tools.c:1368
void set_sigsegv_handler(void(*handler)(int))
セグメンテーションエラー時のハンドラを設定
Definition: tools.c:3829
int ex_strncaservscmp(const char *dat, const char *key, int len)
文字列 s1とs2を後ろから拡張比較する.一致するなら TRUE
Definition: tools.c:892
char * ftostr_ts(float n)
float を文字に変換する.要 free()
Definition: tools.c:1632
void print_16x(FILE *fp, unsigned char *mesg, int n)
16進ダンプを吐き出す(1行)
Definition: tools.c:4228
unsigned long int UsedMemoryBase
メモリチェック用
Definition: tools.c:23
char * cut_file_extension(const char *str)
拡張子を削除したフパス名を生成する.strは変化しない.要 free().
Definition: tools.c:2282
void fdump(FILE *fp, unsigned char *mesg, int n)
16進ダンプを吐き出す
Definition: tools.c:4177
int int_from_big_endian(void *ptr)
Definition: tools.c:300
unsigned char * uuid2guid(unsigned char *p)
uuid を guid に変換する.要 free()
Definition: tools.c:3629
void clear_ringBuffer(ringBuffer *rb)
リングバッファのデータを削除する.
Definition: tools.c:3313
void memory_check_start(void)
Definition: tools.c:3729
unsigned char * encode_urlenc(unsigned char *buf, int sz)
バイナリデータ bufを URLエンコードする.要 free()
Definition: tools.c:2980
int KanjiCode
システムの漢字コード
Definition: tools.c:20
void kanji_convert(unsigned char *mesg)
大域変数 KnjiCodeに従って漢字コードを変換する.
Definition: tools.c:2630
char * pack_char_len(char *mesg, char cc, int len)
文字列の一部の先頭のcc(複数),終わりのcc(複数),CR, LF を削除.要 free()
Definition: tools.c:1154
unsigned long int get_used_memory(void)
使用中のメモリサイズを得る.
Definition: tools.c:3703
int HostEndian
システムの Endian
Definition: tools.c:21
void upper_string(char *str)
Definition: tools.c:2757
char * get_gmt_timestamp(time_t date, const char *format)
要 free()
Definition: tools.c:454
char * cawk(char *buf, char cc, int n)
連続するccを区切り記号として, strのバッファ内の n番目の項目を返す.要 free()
Definition: tools.c:609
unsigned char * get_ringBuffer(ringBuffer *rb, int sz)
リングバッファからデータを得る.要 free()
Definition: tools.c:3383
short swaps(unsigned short p)
16bit の上下8bitを入れ替える.
Definition: tools.c:1872
int strncaservscmp(const char *s1, const char *s2, int n)
文字列 s1と s2を後ろから n文字比較する.大文字小文字は区別しない.一致するなら 0
Definition: tools.c:703
unsigned char LocalIPNum[4]
127.0.0.1 のバイナリ
Definition: tools.c:26
void euc2sjis(unsigned char *c1, unsigned char *c2)
EUC -> SJIS.
Definition: tools.c:2688
FILE * file_chmod_open(const char *fn, const char *fm, mode_t mode)
ファイルの許可属性をmode へ変更した後,ファイルを fmモードでオープン
Definition: tools.c:2366
int mkdirp(const char *path, mode_t mode)
mkdir -p path 相当.
Definition: tools.c:2511
void print_escape(const char *fmt, char *mesg)
エスケープ文字を含むメッセージの出力(stderr)
Definition: tools.c:4125
char * pack_head_tail_char(char *mesg, char cc)
文字の先頭のcc(複数),TAB, CR, LF.終わりのcc(複数),TAB, CR, LF を削除.要 free()
Definition: tools.c:1092
char * replace_str(char *buf, int len, const char *frm, const char *tos)
文字列 buf中の frmを tosに書き換えたものを返す.free() してはいけない.
Definition: tools.c:1282
void del_ringBuffer(ringBuffer **rb)
リングバッファそのものを削除する.new_ringBuffer() と対.
Definition: tools.c:3233
char * ltostr_ts(long int n)
long int を文字に変換する.要 free()
Definition: tools.c:1552
char * skip_chars(char *pp, const char *check)
check[]中の何れかの文字までポインタをスキップさせる.ただし クォーテーション内は完全スキップ
Definition: tools.c:948
long long int swapd(unsigned long long int p)
Definition: tools.c:1923
unsigned char * fgets_mstream(unsigned char *mesg, mstream *sb)
メッセージストリームからメッセージを一行だけ取り出す.
Definition: tools.c:3592
FILE * FP_ErrFile
Definition: tools.c:3894
char * itostr_ts(int n)
int を文字に変換する.要 free()
Definition: tools.c:1532
FILE * FP_LogFile
Definition: tools.c:3893
char * skip_char_pair(char *pp, char pair, char end)
pair と end で閉じるまでポインタをスキップさせる.ただし クォーテーション内は完全スキップ
Definition: tools.c:1022
char * ulltostr(unsigned long long int n)
Definition: tools.c:1484
char * lltostr_ts(long long int n)
long long int を文字に変換する.要 free()
Definition: tools.c:1592
void replace_char(unsigned char *buf, int len, unsigned char frm, unsigned char toc)
データbuf 中のバイトデータ frm を tocに変更する.
Definition: tools.c:1252
void check_endian(void)
システムのエンディアンを判別して,大域変数 HostEndian に設定する
Definition: tools.c:143
int isNull(void *p)
Definition: tools.c:51
char * ulltostr_ts(unsigned long long int n)
Definition: tools.c:1612
int count_lines(const char *buf)
文字列データの行数を数える.行頭が '\0'の場合も1行と数える.
Definition: tools.c:1673
unsigned char * encode_hex(unsigned char cc)
キャラクタを16進コードの文字列に変換する.要 free()
Definition: tools.c:3139
int is_big_endian(void)
エンディアンの動的チェック
Definition: tools.c:114
short short_from_little_endian(void *ptr)
Definition: tools.c:228
char * get_line(char *buf, int n)
文字型データbufのバッファ内の n行目を取り出す.改行コードは削除される.要 free()
Definition: tools.c:484
unsigned char * decode_base64(unsigned char *buf, int *sz)
bufを base64からデコードする.要 free()
Definition: tools.c:2787
char * chomp(char *buf)
最初の改行コード以降を無効にする.
Definition: tools.c:921
int is_little_endian(void)
エンディアンの動的チェック
Definition: tools.c:80
unsigned int uint_from_big_endian(void *ptr)
Definition: tools.c:318
char * dtostr_ts(double n)
double を文字に変換する.要 free()
Definition: tools.c:1652
void print_errfile(const char *fmt,...)
デフォルトのエラーファイルにデータを書き込む
Definition: tools.c:4007
unsigned char * randbit(int n)
ランダムに n bitのバイナリを生成する.
Definition: tools.c:1804
void kanji_convert_euc2sjis(unsigned char *mesg)
EUCをSJISに変換する.
Definition: tools.c:2645
float float_from_little_endian(void *ptr)
Definition: tools.c:174
char * get_file_path(const char *str)
ファイル名を含むパスからパスのみを生成する.strは変化しない.要 free().
Definition: tools.c:2191
int DebugMode
ON の場合 ライブラリ全体がデバックモードであることを示す.デフォルトは OFF.
Definition: tools.c:17
void set_sigterm_child(void(*handler)(int))
child プロセス終了時の処理を設定.
Definition: tools.c:3763
unsigned char * decode_base64_filename(unsigned char *buf, int *sz, unsigned char cc)
bufを Base64で decodeしてバイナリデータを取り出す.ただし cc は '/' として扱う.要 free()
Definition: tools.c:2888
int swapl(unsigned int p)
32bit pを8bitづつ逆順にする
Definition: tools.c:1896
unsigned short ushort_from_big_endian(void *ptr)
Definition: tools.c:354
char * numbering_name(const char *fmt, int n)
フォーマット fmtに従って,nを含む文字列を作り出す.要 free()
Definition: tools.c:2599
char * get_graphic_extension(uWord tex)
Definition: tools.c:4251
char * temp_filename(const char *dir, int flen)
/dev/urandom を利用して作業用ファイルのランダムなファイル名を得る.
Definition: tools.c:2397
ringBuffer * new_ringBuffer(int sz)
リングバッファを生成する.
Definition: tools.c:3205
int hexstr2i(const char *str)
16進の文字列を整数に変換する.
Definition: tools.c:1706
double double_from_little_endian(void *ptr)
エンディアンによるデータ変換
Definition: tools.c:156
unsigned char * encode_base64(unsigned char *buf, int sz)
バイナリデータ bufを base64にエンコードする.要 free()
Definition: tools.c:2849
汎用ツールヘッダ
#define mstream
バイト型 メッセージストリーム
Definition: tools.h:167
#define BIG_ENDIAN
Definition: tools.h:92
#define JBXL_ERR_FILE
デフォルトのエラーファイル
Definition: tools.h:444
#define freeNull(p)
Definition: tools.h:201
#define CHAR_TAB
タブ
Definition: tools.h:80
#define LITTLE_ENDIAN
Definition: tools.h:91
#define JBXL_LOG_FILE
デフォルトのログファイル
Definition: tools.h:443
#define make_mstream(s)
make_ringBuffer()
Definition: tools.h:385
#define CHAR_CR
改行
Definition: tools.h:78
#define PRINT_MESG
環境依存用の出力関数.print_message()
Definition: tools.h:475
#define CHAR_LF
ラインフィード
Definition: tools.h:79
#define CODE_SJIS
Definition: tools.h:85
#define UNKNOWN_ENDIAN
Definition: tools.h:88
#define CODE_UTF8
Definition: tools.h:86