util.c
上传用户:qys8201
上传日期:2021-12-11
资源大小:978k
文件大小:14k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #define _UTIL_C_
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <sys/time.h>
  5. #include <sys/stat.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <unistd.h>
  12. #include <dirent.h>
  13. #include <netdb.h>
  14. #include <errno.h>
  15. #include <ctype.h>
  16. #include "main.h"
  17. #include "util.h"
  18. #define min( x,y ) ({typeof(x) __x=(x),__y=(y);(__x < __y) ? __x : __y; })
  19. #define max( x,y ) ({typeof(x) __x=(x),__y=(y);(__x < __y) ? __y : __x; })
  20. #define IS_2BYTEWORD( _a_ ) ( (char)(0x80) <= (_a_) && (_a_) <= (char)(0xFF) )
  21. #define PRIME 211
  22. int hashpjw ( char* s )
  23. {
  24.     char *p;
  25.     unsigned int h= 0 ,g;
  26.     for( p = s ; *p ; p ++ ){
  27.         h = ( h<< 4 ) + (*p);
  28.         if( (g = h & 0xf0000000) != 0){
  29.             h = h ^ (g>>24);
  30.             h = h ^ g;
  31.         }
  32.     }
  33.     return h % PRIME;
  34. }
  35. int getHash ( char* s )
  36. {
  37.     int i;
  38.     int h=0;
  39.     for(i=0;; i++){
  40.         if( s[i] == 0 ){
  41.             break;
  42.         }
  43.         h += s[i];
  44.     }
  45.     return h;
  46. }
  47. void easyGetTokenFromString( char *src,int count,char*output,int len )
  48. {
  49.     int i;
  50.     int counter = 0;
  51.     if( len <= 0 )return;
  52. #define ISSPACETAB( c )   ( (c) == ' ' || (c) == 't' )
  53.     for(i=0;;i++){
  54.         if( src[i]==''){
  55.             output[0] = '';
  56.             return;
  57.         }
  58.         if( i > 0 && ! ISSPACETAB( src[i-1] ) &&
  59.             ! ISSPACETAB(  src[i] ) ){
  60.             continue;
  61.         }
  62.         if( ! ISSPACETAB( src[i]) ){
  63.             counter++;
  64.             if( counter == count){
  65.                 int j;
  66.                 for(j=0;j<len-1;j++){
  67.                     if( src[i+j] == '' ||
  68.                         ISSPACETAB( src[i+j] ) ){
  69.                         break;
  70.                     }
  71.                     output[j]=src[i+j];
  72.                 }
  73.                 output[j]='';
  74.                 return;
  75.             }
  76.         }
  77.     }
  78. }
  79. void prepareDirectories(char *base)
  80. {
  81.     int i;
  82.     char dname[1024];
  83.     for(i=0;i<256;i++){
  84.         int ret;
  85.         snprintf( dname , sizeof( dname ) , "%s/0x%x", base , i );
  86.         ret = mkdir( dname , 0755 );
  87.         if( ret <0 && errno != EEXIST ){
  88.             log( "mkdir error:%d %s: %sn", ret ,strerror(errno), dname );
  89.         }
  90.         if( ret == 0 ) log(".");
  91.     }
  92. }
  93. void remove_r( char *s )
  94. {
  95.     int i;
  96.     for(i=0;;i++){
  97.         if(s[i]=='r')s[i] =0;
  98.         if( s[i]==0)break;
  99.     }
  100. }
  101. void makeDirFilename( char *out , int outlen ,
  102.                   char *base , int dirchar , char *child )
  103. {
  104.     snprintf( out , outlen ,
  105.               "%s/0x%x/%s" , base ,
  106.               dirchar & 0xff , child );
  107. }
  108. int isFile( char *fn )
  109. {
  110.     FILE*fp=fopen(fn,"r");
  111.     if( fp){
  112.         fclose(fp);
  113.         return 1;
  114.     }
  115.     return 0;
  116. }
  117. int createFile( char *fn , char *line )
  118. {
  119.     FILE *fp = fopen( fn , "w" );
  120.     if( fp== NULL ){
  121.         return -1;
  122.     } else {
  123.         fprintf( fp , "%s" , line );
  124.         fclose(fp);
  125.         return 0;
  126.     }
  127. }
  128. #define BOOL int
  129. #define FALSE 0
  130. #define TRUE  1
  131. typedef struct tagEscapeChar
  132. {
  133.     char     escapechar;
  134.     char     escapedchar;
  135. }EscapeChar;
  136. static EscapeChar   escapeChar[]=
  137. {
  138.     { 'n',   'n' },
  139.     { ',',    'c' },
  140.     { '|',    'z' },
  141.     { '\',   'y' },
  142. };
  143. char*   makeStringFromEscaped( char* src )
  144. {
  145.     int     i;
  146.     int     srclen = strlen( src );
  147.     int     searchindex=0;
  148.     for( i = 0 ; i < srclen ; i ++ ){
  149.      // for 2Byte Word
  150.      if( IS_2BYTEWORD( src[i] ) ){
  151.             src[searchindex++] = src[i++];
  152.             src[searchindex++] = src[i];
  153.      }else{
  154.         if( src[i] == '\' ){
  155.             int j;
  156.             /*  戚及  侬卞垫仁  */
  157.             i++;
  158.             for( j = 0; j<sizeof(escapeChar)/sizeof(escapeChar[0]); j++){
  159.                 if( escapeChar[j].escapedchar == src[i] ){
  160.                     /*  戚互巨旦弗□皿平乓仿分  */
  161.                     src[searchindex++] = escapeChar[j].escapechar;
  162.                     break;
  163.                 }
  164.             }
  165.             /*  巨仿□支仃升公及引引戊疋□仄化云仁  */
  166.             if(escapeChar[j].escapedchar != src[i])
  167.              src[searchindex++] = src[i];
  168.         }else{
  169.             src[searchindex++] = src[i];
  170.         }
  171.       }
  172.     }
  173.     src[searchindex] = '';
  174.     return src;
  175. }
  176. char *   makeEscapeString( char* src , char* dest, int sizeofdest)
  177. {
  178.     int         i;
  179.     int     srclen = strlen( src );
  180.     int     destindex=0;
  181.     for( i = 0 ; i < srclen ; i ++ ){
  182.         BOOL dirty=FALSE;
  183.         int     j;
  184.         char    escapechar='';
  185.         if( destindex + 1 >= sizeofdest ) break;
  186. if( IS_2BYTEWORD( src[i] ) ){
  187.         if( destindex + 2 >= sizeofdest ) break;
  188.             dest[destindex] = src[i];
  189.             dest[destindex+1] = src[i+1];
  190.             destindex += 2;
  191.             i ++;
  192.             continue;
  193. }
  194.         for( j = 0; j<sizeof(escapeChar)/sizeof(escapeChar[0]); j++){
  195.             if( src[i] == escapeChar[j].escapechar ){
  196.                 dirty=TRUE;
  197.                 escapechar= escapeChar[j].escapedchar;
  198.                 break;
  199.             }
  200. }
  201. if( dirty == TRUE ){
  202. if( destindex + 2 < sizeofdest ){
  203. dest[destindex] = '\';
  204. dest[destindex+1] = escapechar;
  205. destindex+=2;
  206. dirty=TRUE;
  207. continue;       /*  戚及  侬卞褡戈  */
  208. }else{
  209. dest[destindex] = '';
  210. return dest;
  211. }
  212. }else{
  213. dest[destindex] = src[i];
  214. destindex++;
  215. }
  216. }
  217.     dest[destindex] = '';
  218.     return dest;
  219. }
  220. char *   makeEscapeString1( char* src , char* dest, int sizeofdest)
  221. {
  222.     int         i;
  223.     int     srclen = strlen( src );
  224.     int     destindex=0;
  225.     for( i = 0 ; i < srclen ; i ++ ){
  226.         BOOL dirty=FALSE;
  227.         int     j;
  228.         char    escapechar='';
  229.         if( destindex + 1 >= sizeofdest )
  230.             /*  ''坌互箫曰卅中及匹仇仇匹蔽曰   */
  231.             break;
  232. /* // 蝈剩及ㄠ田奶玄  井升丹井毛民尼永弁
  233. if( IS_2BYTEWORD( src[i] ) ){
  234. // 蝈剩分[公及桦宁反ㄠ田奶玄芴坌卞褡引六月[
  235. // 凶分仄ㄠ田奶玄仄井卅中桦宁反公丹仄卅中
  236. // 公及引引ㄡ田奶玄鳖霜
  237.         if( destindex + 2 >= sizeofdest )break;
  238.             dest[destindex] = src[i];
  239.             dest[destindex+1] = src[i+1];
  240.             destindex += 2;
  241.             i ++;
  242.             continue;
  243. }
  244. */
  245.         for( j = 0; j<sizeof(escapeChar)/sizeof(escapeChar[0]); j++)
  246.             if( src[i] == escapeChar[j].escapechar ){
  247.                 dirty=TRUE;
  248.                 escapechar= escapeChar[j].escapedchar;
  249.                 break;
  250.             }
  251.         if( dirty == TRUE ){
  252.             /*  巨旦弗□皿允月  侬分    */
  253.             if( destindex + 2 < sizeofdest ){
  254.                 /*  +2 午中丹及反} '\' 午 'n'及仪分   */
  255.                 /*  酸曰  侬反蜗坌分    */
  256.                 dest[destindex] = '\';
  257.                 dest[destindex+1] = escapechar;
  258.                 destindex+=2;
  259.                 dirty=TRUE;
  260.                 continue;       /*  戚及  侬卞褡戈  */
  261.             }else{
  262.                 /*  酸曰田永白央互尕箫仄化中月  */
  263.                 dest[destindex] = '';
  264.                 return dest;
  265.             }
  266.         }else{
  267.             dest[destindex] = src[i];
  268.             destindex++;
  269.         }
  270.     }
  271.     dest[destindex] = '';
  272.     return dest;
  273. }
  274. #undef BOOL
  275. #undef FALSE
  276. #undef TRUE
  277. /* 赞中strcatsafe[田永白央互丐孔木月桦宁反窒手仄卅中[ */
  278. int
  279. strcatsafe( char *dest, int destlen , char *append )
  280. {
  281.     int dl = strlen( dest);
  282.     int al = strlen(append);
  283.     if( (dl + al) >= destlen ){
  284.         return -1;
  285.     } else {
  286.         strcat( dest, append );
  287.     }
  288. return 0;
  289. }
  290. char *chop( char *s )
  291. {
  292.     int l = strlen(s);
  293.     if( l >= 1 ){
  294.         s[l-1]=0;
  295.     }
  296.     return s;
  297. }
  298. // CoolFish: Family 2001/5/30
  299. /*void easyGetTokenFromBuf(char *src, char delim, int count, char *output, int len)
  300. {
  301.     int  i;
  302.     int  counter = 0;
  303.     int  wordflag = 0;
  304.     
  305.     if( len <= 0 ) return;
  306.     
  307.     #define ISSEPARATE( c )   ((c) == delim)
  308.     
  309.     for( i=0; ; i++){
  310.      if( src[i] == '' ){
  311.      output[0] = '';
  312.      return;
  313.      }
  314.      if(IS_2BYTEWORD(src[i])){
  315.      if( i>0 && wordflag == 1 ){
  316.      i++;
  317.      wordflag = 1;
  318.      continue;
  319.      }
  320.      if( i>0 && !ISSEPARATE(src[i-1]) && !ISSEPARATE(src[i])){
  321.      i++;
  322.      wordflag = 1;
  323.      continue;
  324.      }
  325.      wordflag = 1;
  326.      }else{
  327.      if( i>0 && wordflag ){
  328.      wordflag = 0;
  329.      continue;
  330.      }
  331.      if( i>0 && !ISSEPARATE(src[i-1]) && !ISSEPARATE(src[i])){
  332.      wordflag = 0; 
  333.      continue;
  334.      }
  335.      wordflag = 0;
  336.      }
  337.         if( !ISSEPARATE(src[i]) ){
  338.          counter++;
  339.          if( counter == count ){
  340.          int j;
  341.          for ( j=0; j<len-1; j++){
  342.          if( IS_2BYTEWORD( src[i+j] ) ){
  343.          output[j] = src[i+(j++)];
  344.          output[j] = src[i+j];
  345.          }else{
  346.          if( src[i+j]=='' || ISSEPARATE(src[i+j])){
  347.          break;
  348.          }
  349.          output[j] = src[i+j];
  350.          }
  351.         }
  352.         output[j] = '';
  353.         return;
  354. }
  355. if( wordflag )
  356. i++;
  357. if ( i==0)
  358. {
  359. if( IS_2BYTEWORD(src[i]) ){
  360. wordflag = 1;
  361. i++;
  362. }
  363. else
  364. {
  365. wordflag = 0;
  366. }
  367. }
  368. }
  369.     }
  370. }
  371. */
  372. char* strncpy2( char* dest, const char* src, size_t n )
  373. {
  374.     if( n > 0 ){
  375.         char*   d = dest;
  376.         const char*   s = src;
  377.         int i;
  378.         for( i=0; i<n ; i++ ){
  379.             if( *(s+i) == 0 ){
  380.                 /*  戊疋□仄云歹匀凶日 NULL   侬毛  木月   */
  381.                 *(d+i) = '';
  382.                 return dest;
  383.             }
  384.             if( *(s+i) & 0x80 ){
  385.                 *(d+i)  = *(s+i);
  386.                 i++;
  387.                 if( i>=n ){
  388.                     *(d+i-1)='';
  389.                     break;
  390.                 }
  391.                 *(d+i)  = *(s+i);
  392.             }else
  393.                 *(d+i) = *(s+i);
  394.         }
  395.     }
  396.     return dest;
  397. }
  398. void strncpysafe( char* dest , const size_t n ,
  399.                   const char* src ,const int length )
  400. {
  401.     /*
  402.      * src 井日 dest 卞 length 戊疋□允月
  403.      * strcpy, strncpy 匹反 dest 方曰 戊疋□允月汹互
  404.      *   五中凛卞裟少午,丢乒伉陆失弁本旦互粟月.
  405.      * 仇及楮醒匹反}strlen( src ) 午 length 及凝今中幻丹
  406.      * (  端卞戊疋□允月汹) 午 dest 及扔奶术毛  屯化}
  407.      * strcpysafe 午  元仪毛允月[
  408.      */
  409.     int Short;
  410.     Short = min( strlen( src ) , length );
  411.     /* NULL  侬 毛哔  仄凶  胜 */
  412.     if( n < Short + 1 ){
  413.         /*
  414.          * 田永白央互箫曰卅中及匹 n - 1(NULL  侬)
  415.          * 匹 strncpy 毛裟少
  416.          */
  417.         strncpy2( dest , src , n-1 );
  418.         dest[n-1]='';
  419.     }else if( n <= 0 ){
  420.         return;
  421.     }else{
  422.         /*
  423.          * 田永白央反蜗坌卞丐月及匹 Short 匹strncpy毛裟少
  424.          * 卅云 src 卞反 Short 及赢今  卞 NULL 互卅中及匹}
  425.          * dest 卞反 馨笛仄化云仁[
  426.          */
  427.         strncpy2( dest , src , Short );
  428.         dest[Short]= '';
  429.     }
  430. }
  431. void strcpysafe( char* dest ,size_t n ,const char* src )
  432. {
  433.     /*
  434.      * src 井日 dest 尺戊疋□允月.
  435.      * strcpy, strncpy 匹反 dest 方曰 戊疋□允月汹互
  436.      *   五中凛卞裟少午,丢乒伉陆失弁本旦互粟月.
  437.      * 仇木毛  什啃卞, strncpy 互丐月互 strlen( src ) 互 n 方曰
  438.      *   五中凛卞反, dest 及    互 NULL   侬午反卅日卅中.
  439.      *
  440.      * 仄凶互匀化 dest 及  五今方曰 src 及幻丹互赢中凛卞反
  441.      * n-1 匹 strncpy 毛允月. 凝今中凛反公及引引戊疋□允月
  442.      *
  443.      * n 互  及凛反云井仄仁卅月及匹  及凛反 窒手仄卅中[
  444.      *
  445.      */
  446.     // Nuke +1 (08/25): Danger if src=0
  447.     if (!src) {
  448.         *dest = '';
  449.         return;
  450.     }
  451.     if( n <= 0 )        /* 窒手仄卅中   */
  452.         return;
  453.     /*  仇及凛鳔匹} n >= 1 动晓互瑁烂  */
  454.     /*  NULL  侬毛哔  仄化  胜允月  */
  455.     else if( n < strlen( src ) + 1 ){
  456.         /*
  457.          * 田永白央互箫曰卅中及匹 n - 1(NULL  侬)
  458.          * 匹 strncpy 毛裟少
  459.          */
  460.         strncpy2( dest , src , n-1 );
  461.         dest[n-1]='';
  462.     }else
  463.         strcpy( dest , src );
  464. }
  465. char * ScanOneByte( char *src, char delim )
  466. {
  467. // Nuke
  468. if (!src) return NULL;
  469.         //   侬  互卅仁卅月引匹腹绸
  470.         for( ;src[0] != ''; src ++ ){
  471.           if( IS_2BYTEWORD( src[0] ) ){
  472.               // 蝈剩分[公及桦宁反ㄠ田奶玄芴坌卞褡引六月[
  473.               // 凶分仄ㄠ田奶玄仄井卅中桦宁反公丹仄卅中
  474.               if( src[1] != 0 ){
  475.                   src ++;
  476.               }
  477.               continue;
  478.           }
  479.           //   剩分匀凶[仇仇匹覆擂及  侬午  胜
  480.           if( src[0] == delim ){
  481.               return src;
  482.           }
  483.         }
  484.         // 伙□皿  仃凶日苇勾井日卅井匀凶[
  485.         return NULL;
  486. }
  487. int easyGetTokenFromBuf( char* src ,char* delim ,int count, char* output , int len )
  488. {//ttom this function all change,copy from the second
  489.     int i;          /* 伙□皿  醒 */
  490.     int length =0;  /* 潸曰请仄凶  侬  及赢今 */
  491.     int addlen=0;   /* 箫今木月赢今 */
  492.     int oneByteMode = 0; /* ㄠ田奶玄乒□玉井" */
  493.     if( strlen( delim ) == 1 ){ // 腹绸互ㄠ田奶玄卅日ㄠ田奶玄乒□玉卞允月
  494.         oneByteMode = 1;// 公及端ㄡ田奶玄  侬反民尼永弁仄卅中
  495.     }
  496.     for( i =  0 ; i < count ; i ++ ){
  497.          char* last;
  498.          src += addlen;/* 心勾井匀凶赢今毛箫允 */
  499.       
  500.          if( oneByteMode ){
  501.              // ㄠ田奶玄乒□玉分匀凶日仇切日匹腹绸
  502.              last = ScanOneByte( src, delim[0] );
  503.          }else{
  504.                  last  = strstr( src , delim );  /* 苇尥仃月 */
  505.          }
  506.          if( last == NULL ){
  507.             /*
  508.              * 心勾井日卅井匀凶及匹允屯化戊疋□仄化 return[
  509.             */
  510.             strcpysafe( output , len, src );
  511.             if( i == count - 1 )
  512.                 /*切斤丹升心勾井匀凶*/
  513.                 return 1;
  514.                                                                                                            
  515.                 /*心勾井日卅井匀凶*/
  516.              return 0;
  517.           }
  518.           
  519.           /*
  520.            * 心勾井匀凶赭午  赓及匏  及犒毛菲户月
  521.            * 勾引曰嗉濠日木化中月  侬  及赢今
  522.           */
  523.           length = last - src;
  524.                                            
  525.           /*
  526.            * 戚及伙□皿及啃卞心勾井匀凶赢今午 delim 及赢今毛箫仄化云仁
  527.           */
  528.           addlen= length + strlen( delim );
  529.        }
  530.        strncpysafe( output, len , src,length );
  531.        return 1;
  532. }