util.c
上传用户:tany51
上传日期:2013-06-12
资源大小:1397k
文件大小:13k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 1998  Mark Baysinger (mbaysing@ucsd.edu)
  3.  * Copyright (C) 1998,1999,2000,2001  Ross Combs (rocombs@cs.nmsu.edu)
  4.  *
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License
  7.  * as published by the Free Software Foundation; either version 2
  8.  * of the License, or (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  */
  19. #include "common/setup_before.h"
  20. #include <stdio.h>
  21. #ifdef HAVE_STDDEF_H
  22. # include <stddef.h>
  23. #else
  24. # ifndef NULL
  25. #  define NULL ((void *)0)
  26. # endif
  27. #endif
  28. #ifdef STDC_HEADERS
  29. # include <stdlib.h>
  30. #else
  31. # ifdef HAVE_MALLOC_H
  32. #  include <malloc.h>
  33. # endif
  34. #endif
  35. #include "compat/strtoul.h"
  36. #ifdef HAVE_STRING_H
  37. # include <string.h>
  38. #else
  39. # ifdef HAVE_STRINGS_H
  40. #  include <strings.h>
  41. # endif
  42. #endif
  43. #include "compat/strcasecmp.h"
  44. #include "compat/strncasecmp.h"
  45. #include <ctype.h>
  46. #include "common/util.h"
  47. #include "common/setup_after.h"
  48. extern int strstart(char const * full, char const * part)
  49. {
  50.     size_t strlen_full, strlen_part;
  51.     if (!full || !part)
  52. return 1;
  53.     strlen_full = strlen(full);
  54.     strlen_part = strlen(part);
  55.     if (strlen_full<strlen_part)
  56. return 1;
  57.     /* If there is more than the command, make sure it is separated */
  58.     if (strlen_full>strlen_part && full[strlen_part]!=' ' && full[strlen_part]!='')
  59.         return 1;
  60.     return strncasecmp(full,part,strlen_part);
  61. }
  62. #define DEF_LEN 64
  63. #define INC_LEN 16
  64. extern char * file_get_line(FILE * fp)
  65. {
  66.     char *       line;
  67.     char *       newline;
  68.     unsigned int len=DEF_LEN;
  69.     unsigned int pos=0;
  70.     int          prev_char,curr_char;
  71.     
  72.     if (!(line = malloc(DEF_LEN)))
  73. return NULL;
  74.     
  75.     prev_char = '';
  76.     while ((curr_char = fgetc(fp))!=EOF)
  77.     {
  78. if (((char)curr_char)=='r')
  79.     continue; /* make DOS line endings look Unix-like */
  80. if (((char)curr_char)=='n')
  81. {
  82.     if (pos<1 || ((char)prev_char)!='\')
  83. break;
  84.     pos--; /* throw away the backslash */
  85.     prev_char = '';
  86.     continue;
  87. }
  88. prev_char = curr_char;
  89. line[pos++] = (char)curr_char;
  90. if ((pos+1)>=len)
  91. {
  92.     len += INC_LEN;
  93.     if (!(newline = realloc(line,len)))
  94.     {
  95. free(line);
  96. return NULL;
  97.     }
  98.     line = newline;
  99. }
  100.     }
  101.     
  102.     if (curr_char==EOF && pos<1) /* not even an empty line */
  103.     {
  104. free(line);
  105. return NULL;
  106.     }
  107.     
  108.     if (pos+1<len)
  109. if ((newline = realloc(line,pos+1))) /* bump the size back down to what we need */
  110.     line = newline; /* if it fails just ignore it */
  111.     
  112.     line[pos] = '';
  113.     
  114.     return line;
  115. }
  116. extern char * strreverse(char * str)
  117. {
  118.     unsigned int i;
  119.     unsigned int len;
  120.     char         temp;
  121.     
  122.     if (!str)
  123. return NULL;
  124.     
  125.     len = strlen(str);
  126.     
  127.     /* swap leftmost and rightmost chars until we hit center */
  128.     for (i=0; i<len/2; i++)
  129.     {
  130. temp         = str[i];
  131. str[i]       = str[len-1-i];
  132. str[len-1-i] = temp;
  133.     }
  134.     
  135.     return str;
  136. }
  137. extern int str_to_uint(char const * str, unsigned int * num)
  138. {
  139.     unsigned int pos;
  140.     unsigned int i;
  141.     unsigned int val;
  142.     unsigned int pval;
  143.     
  144.     if (!str || !num)
  145.         return -1;
  146.     for (pos=0; str[pos]==' ' || str[pos]=='t'; pos++);
  147.     if (str[pos]=='+')
  148.         pos++;
  149.     
  150.     val = 0;
  151.     for (i=pos; str[i]!=''; i++)
  152.     {
  153. pval = val;
  154.         val *= 10;
  155. if (val/10!=pval) /* check for overflow */
  156.     return -1;
  157. pval = val;
  158. switch (str[i])
  159. {
  160. case '0':
  161.     break;
  162. case '1':
  163.     val += 1;
  164.     break;
  165. case '2':
  166.     val += 2;
  167.     break;
  168. case '3':
  169.     val += 3;
  170.     break;
  171. case '4':
  172.     val += 4;
  173.     break;
  174. case '5':
  175.     val += 5;
  176.     break;
  177. case '6':
  178.     val += 6;
  179.     break;
  180. case '7':
  181.     val += 7;
  182.     break;
  183. case '8':
  184.     val += 8;
  185.     break;
  186. case '9':
  187.     val += 9;
  188.     break;
  189. default:
  190.     return -1;
  191. }
  192. if (val<pval) /* check for overflow */
  193.     return -1;
  194.     }
  195.     
  196.     *num = val;
  197.     return 0;
  198. }
  199. extern int str_to_ushort(char const * str, unsigned short * num)
  200. {
  201.     unsigned int   pos;
  202.     unsigned int   i;
  203.     unsigned short val;
  204.     unsigned short pval;
  205.     
  206.     if (!str || !num)
  207.         return -1;
  208.     for (pos=0; str[pos]==' ' || str[pos]=='t'; pos++);
  209.     if (str[pos]=='+')
  210.         pos++;
  211.     
  212.     val = 0;
  213.     for (i=pos; str[i]!=''; i++)
  214.     {
  215. pval = val;
  216.         val *= 10;
  217. if (val/10!=pval) /* check for overflow */
  218.     return -1;
  219. pval = val;
  220. switch (str[i])
  221. {
  222. case '0':
  223.     break;
  224. case '1':
  225.     val += 1;
  226.     break;
  227. case '2':
  228.     val += 2;
  229.     break;
  230. case '3':
  231.     val += 3;
  232.     break;
  233. case '4':
  234.     val += 4;
  235.     break;
  236. case '5':
  237.     val += 5;
  238.     break;
  239. case '6':
  240.     val += 6;
  241.     break;
  242. case '7':
  243.     val += 7;
  244.     break;
  245. case '8':
  246.     val += 8;
  247.     break;
  248. case '9':
  249.     val += 9;
  250.     break;
  251. default:
  252.     return -1;
  253. }
  254. if (val<pval) /* check for overflow */
  255.     return -1;
  256.     }
  257.     
  258.     *num = val;
  259.     return 0;
  260. }
  261. /* This routine assumes ASCII like control chars.
  262.    If len is zero, it will print all characters up to the first NUL,
  263.    otherwise it will print exactly that many characters. */
  264. int str_print_term(FILE * fp, char const * str, unsigned int len, int allow_nl)
  265. {
  266.     unsigned int i;
  267.     
  268.     if (!fp)
  269. return -1;
  270.     if (!str)
  271. return -1;
  272.     
  273.     if (len==0)
  274. len = strlen(str);
  275.     for (i=0; i<len; i++)
  276. if ((str[i]=='177' || (str[i]>='00' && str[i]<'40')) &&
  277.     (!allow_nl || (str[i]!='r' && str[i]!='n')))
  278.     fprintf(fp,"^%c",str[i]+64);
  279. else
  280.     fputc((int)str[i],fp);
  281.     
  282.     return 0;
  283. }
  284. extern int str_get_bool(char const * str)
  285. {
  286.     if (!str)
  287. return -1;
  288.     
  289.     if (strcasecmp(str,"true")==0 ||
  290. strcasecmp(str,"yes")==0 ||
  291. strcasecmp(str,"on")==0 ||
  292. strcmp(str,"1")==0)
  293. return 1;
  294.     
  295.     if (strcasecmp(str,"false")==0 ||
  296. strcasecmp(str,"no")==0 ||
  297. strcasecmp(str,"off")==0 ||
  298. strcmp(str,"0")==0)
  299. return 0;
  300.     
  301.     return -1;
  302. }
  303. extern char const * seconds_to_timestr(unsigned int totsecs)
  304. {
  305.     static char temp[256];
  306.     int         days;
  307.     int         hours;
  308.     int         minutes;
  309.     int         seconds;
  310.     
  311.     days    = totsecs/(24*60*60);
  312.     hours   = totsecs/(60*60) - days*24;
  313.     minutes = totsecs/60 - days*24*60 - hours*60;
  314.     seconds = totsecs - days*24*60*60 - hours*60*60 - minutes*60;
  315.     
  316.     if (days>0)
  317. sprintf(temp,"%d day%s %d hour%s %d minute%s %d second%s",
  318.                 days,days==1 ? "" : "s",
  319.                 hours,hours==1 ? "" : "s",
  320.                 minutes,minutes==1 ? "" : "s",
  321.                 seconds,seconds==1 ? "" : "s");
  322.     else if (hours>0)
  323. sprintf(temp,"%d hour%s %d minute%s %d second%s",
  324.                 hours,hours==1 ? "" : "s",
  325.                 minutes,minutes==1 ? "" : "s",
  326.                 seconds,seconds==1 ? "" : "s");
  327.     else if (minutes>0)
  328. sprintf(temp,"%d minute%s %d second%s",
  329.                 minutes,minutes==1 ? "" : "s",
  330.                 seconds,seconds==1 ? "" : "s");
  331.     else
  332. sprintf(temp,"%d second%s.",
  333.                 seconds,seconds==1 ? "" : "s");
  334.     
  335.     return temp;
  336. }
  337. extern int clockstr_to_seconds(char const * clockstr, unsigned int * totsecs)
  338. {
  339.     unsigned int i,j;
  340.     unsigned int temp;
  341.     
  342.     if (!clockstr)
  343. return -1;
  344.     if (!totsecs)
  345. return -1;
  346.     
  347.     for (i=j=temp=0; j<strlen(clockstr); j++)
  348.     {
  349. switch (clockstr[j])
  350. {
  351. case ':':
  352.     temp *= 60;
  353.     temp += strtoul(&clockstr[i],NULL,10);
  354.     i = j+1;
  355.     break;
  356. case '0':
  357. case '1':
  358. case '2':
  359. case '3':
  360. case '4':
  361. case '5':
  362. case '6':
  363. case '7':
  364. case '8':
  365. case '9':
  366.     break;
  367. default:
  368.     return -1;
  369. }
  370.     }
  371.     if (i<j)
  372.     {
  373. temp *= 60;
  374. temp += strtoul(&clockstr[i],NULL,10);
  375.     }
  376.     
  377.     *totsecs = temp;
  378.     return 0;
  379. }
  380. extern char * escape_fs_chars(char const * in, unsigned int len)
  381. {
  382.     char *       out;
  383.     unsigned int inpos;
  384.     unsigned int outpos;
  385.     
  386.     if (!in)
  387. return NULL;
  388.     if (!(out = malloc(len*3+1))) /* if all turn into %XX */
  389. return NULL;
  390.     
  391.     for (inpos=0,outpos=0; inpos<len; inpos++)
  392.     {
  393. if (in[inpos]=='' || in[inpos]=='%' || in[inpos]=='/' ||
  394.             in[inpos]=='\' || in[inpos]==':') /* FIXME: what other characters does Windows not allow? */
  395. {
  396.     out[outpos++] = '%';
  397.     /* always 00 through FF hex */
  398.     sprintf(&out[outpos],"%02X",(unsigned int)(unsigned char)in[inpos]);
  399.     outpos += 2;
  400. }
  401. else
  402.     out[outpos++] = in[inpos];
  403.     }
  404. /*  if outpos >= len*3+1 then the buffer was overflowed */
  405.     out[outpos] = '';
  406.     
  407.     return out;
  408. }
  409. extern char * escape_chars(char const * in, unsigned int len)
  410. {
  411.     char *       out;
  412.     unsigned int inpos;
  413.     unsigned int outpos;
  414.     
  415.     if (!in)
  416. return NULL;
  417.     if (!(out = malloc(len*4+1))) /* if all turn into xxx */
  418. return NULL;
  419.     
  420.     for (inpos=0,outpos=0; inpos<len; inpos++)
  421.     {
  422. if (in[inpos]=='\')
  423. {
  424.     out[outpos++] = '\';
  425.     out[outpos++] = '\';
  426. }
  427. else if (in[inpos]=='"')
  428. {
  429.     out[outpos++] = '\';
  430.     out[outpos++] = '"';
  431. }
  432.         else if (isascii((int)in[inpos]) && isprint((int)in[inpos]))
  433.     out[outpos++] = in[inpos];
  434.         else if (in[inpos]=='a')
  435. {
  436.     out[outpos++] = '\';
  437.     out[outpos++] = 'a';
  438. }
  439.         else if (in[inpos]=='b')
  440. {
  441.     out[outpos++] = '\';
  442.     out[outpos++] = 'b';
  443. }
  444.         else if (in[inpos]=='t')
  445. {
  446.     out[outpos++] = '\';
  447.     out[outpos++] = 't';
  448. }
  449.         else if (in[inpos]=='n')
  450. {
  451.     out[outpos++] = '\';
  452.     out[outpos++] = 'n';
  453. }
  454.         else if (in[inpos]=='v')
  455. {
  456.     out[outpos++] = '\';
  457.     out[outpos++] = 'v';
  458. }
  459.         else if (in[inpos]=='f')
  460. {
  461.     out[outpos++] = '\';
  462.     out[outpos++] = 'f';
  463. }
  464.         else if (in[inpos]=='r')
  465. {
  466.     out[outpos++] = '\';
  467.     out[outpos++] = 'r';
  468. }
  469. else
  470. {
  471.     out[outpos++] = '\';
  472.     /* always 001 through 377 octal */
  473.     sprintf(&out[outpos],"%03o",(unsigned int)(unsigned char)in[inpos]);
  474.     outpos += 3;
  475. }
  476.     }
  477. /*  if outpos >= len*4+1 then the buffer was overflowed */
  478.     out[outpos] = '';
  479.     
  480.     return out;
  481. }
  482. extern char * unescape_chars(char const * in)
  483. {
  484.     char *       out;
  485.     unsigned int inpos;
  486.     unsigned int outpos;
  487.     
  488.     if (!in)
  489. return NULL;
  490.     if (!(out = malloc(strlen(in)+1)))
  491. return NULL;
  492.     
  493.     for (inpos=0,outpos=0; inpos<strlen(in); inpos++)
  494.     {
  495.         if (in[inpos]!='\')
  496.     out[outpos++] = in[inpos];
  497.         else
  498.     switch (in[++inpos])
  499.     {
  500.     case '\':
  501. out[outpos++] = '\';
  502. break;
  503.     case '"':
  504. out[outpos++] = '"';
  505. break;
  506.     case 'a':
  507. out[outpos++] = 'a';
  508. break;
  509.     case 'b':
  510. out[outpos++] = 'b';
  511. break;
  512.     case 't':
  513. out[outpos++] = 't';
  514. break;
  515.     case 'n':
  516. out[outpos++] = 'n';
  517. break;
  518.     case 'v':
  519. out[outpos++] = 'v';
  520. break;
  521.     case 'f':
  522. out[outpos++] = 'f';
  523. break;
  524.     case 'r':
  525. out[outpos++] = 'r';
  526. break;
  527.     default:
  528.     {
  529. char         temp[4];
  530. unsigned int i;
  531. unsigned int num;
  532. for (i=0; i<3; i++)
  533. {
  534.     if (in[inpos]!='0' &&
  535.         in[inpos]!='1' &&
  536.         in[inpos]!='2' &&
  537.         in[inpos]!='3' &&
  538.         in[inpos]!='4' &&
  539.         in[inpos]!='5' &&
  540.         in[inpos]!='6' &&
  541.         in[inpos]!='7')
  542. break;
  543.     temp[i] = in[inpos++];
  544. }
  545. temp[i] = '';
  546. inpos--;
  547. num = strtoul(temp,NULL,8);
  548. if (i<3 || num<1 || num>255) /* bad escape (including 00), leave it as-is */
  549. {
  550.     out[outpos++] = '\';
  551.     strcpy(&out[outpos],temp);
  552.     outpos += strlen(temp);
  553. }
  554. else
  555.     out[outpos++] = (unsigned char)num;
  556.     }
  557. }
  558.     }
  559.     out[outpos] = '';
  560.     
  561.     return out;
  562. }
  563. extern void str_to_hex(char * target, char * data, int datalen)
  564. {
  565.     unsigned char c;
  566.     int  i;
  567.     for (i = 0; i < datalen; i++)
  568.     {
  569.         c = (data[i]) & 0xff;
  570. sprintf(target + i*3, "%02X    ", c);
  571. target[i*3+3] = '';
  572. /* fprintf(stderr, "str_to_hex %d | '%02x' '%s'n", i, c, target); */
  573.     }
  574. }
  575. extern int hex_to_str(char const * source, char * data, int datalen)
  576. {
  577.    /*
  578.     * TODO: We really need a more robust function here,
  579.     *       for now, I'll just use this hack for a quick evaluation
  580.     */
  581.     char byte;
  582.     char c;
  583.     int  i;
  584.   
  585.     for (i = 0; i < datalen; i++)
  586.     {
  587. byte  = 0;
  588.     
  589. /* fprintf(stderr, "hex_to_str %d | '%02x'", i, byte); */
  590. c = source [i*3 + 0];
  591. byte += 16 * ( c > '9' ? (c - 'A' + 10) : (c - '0'));
  592. /* fprintf(stderr, " | '%c' '%02x'", c, byte); */
  593. c = source [i*3 + 1];
  594. byte +=  1 * ( c > '9' ? (c - 'A' + 10) : (c - '0'));
  595. /* fprintf(stderr, " | '%c' '%02x'", c, byte); */
  596. /* fprintf(stderr, "n"); */
  597. data[i] = byte;
  598.     }
  599.     
  600.     /* fprintf(stderr, "finished, returning %d from '%s'n", i, source);  */
  601.     
  602.     return i;
  603. }