comp_err.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17. /* Saves all errmesg in a header file, updated by me, in a compact file  */
  18. #include <global.h>
  19. #include <m_ctype.h>
  20. #include <my_sys.h>
  21. #include <m_string.h>
  22. #define MAXLENGTH 1000
  23. #define MAX_ROWS  1000
  24. #define MAX_FILES 10
  25. int row_count;
  26. uint file_pos[MAX_ROWS],file_row_pos[MAX_FILES];
  27. my_string saved_row[MAX_ROWS];
  28. uchar   file_head[]= { 254,254,2,1 };
  29. static void get_options(int *argc,char **argv[]);
  30. static int count_rows(FILE *from,pchar c, pchar c2);
  31. static int remember_rows(FILE *from,pchar c);
  32. static int copy_rows(FILE *to);
  33. /* Functions defined in this file */
  34. int main(int argc,char *argv[])
  35. {
  36.   int i,error,files,length;
  37.   uchar head[32];
  38.   FILE *from,*to;
  39.   MY_INIT(argv[0]);
  40.   get_options(&argc,&argv);
  41.   error=1;
  42.   row_count=files=0;
  43.   to=0;
  44.   for ( ; argc-- > 1 ; argv++)
  45.   {
  46.     file_row_pos[files++] = row_count;
  47.     if ((from = fopen(*argv,"r")) == NULL)
  48.     {
  49.       fprintf(stderr,"Can't open file '%s'n",*argv);
  50.       return(1);
  51.     }
  52.     VOID(count_rows(from,'"','}')); /* Calculate start-info */
  53.     if (remember_rows(from,'}') < 0) /* Remember rows */
  54.     {
  55.       fprintf(stderr,"Can't find textrows in '%s'n",*argv);
  56.       fclose(from);
  57.       goto end;
  58.     }
  59.     fclose(from);
  60.   }
  61.   if ((to=my_fopen(*argv,O_WRONLY | FILE_BINARY,MYF(0))) == NULL)
  62.   {
  63.     fprintf(stderr,"Can't create file '%s'n",*argv);
  64.     return(1);
  65.   }
  66.   fseek(to,(long) (32+row_count*2),0);
  67.   if (copy_rows(to))
  68.     goto end;
  69.   length=ftell(to)-32-row_count*2;
  70.   bzero((gptr) head,32); /* Save Header & pointers */
  71.   bmove((byte*) head,(byte*) file_head,4);
  72.   head[4]=files;
  73.   int2store(head+6,length);
  74.   int2store(head+8,row_count);
  75.   for (i=0 ; i<files ; i++)
  76.   {
  77.     int2store(head+10+i+i,file_row_pos[i]);
  78.   }
  79.   fseek(to,0l,0);
  80.   if (fwrite(head,1,32,to) != 32)
  81.     goto end;
  82.   for (i=0 ; i<row_count ; i++)
  83.   {
  84.     int2store(head,file_pos[i]);
  85.     if (fwrite(head,1,2,to) != 2)
  86.       goto end;
  87.   }
  88.   error=0;
  89.   printf("Found %d messages in language file %sn",row_count,*argv);
  90.  end:
  91.   if (to)
  92.     fclose(to);
  93.   if (error)
  94.     fprintf(stderr,"Can't uppdate messagefile %s, errno: %dn",*argv,errno);
  95.   exit(error);
  96.   return(0);
  97. } /* main */
  98. /* Read options */
  99. static void get_options(argc,argv)
  100. register int *argc;
  101. register char **argv[];
  102. {
  103.   int help=0;
  104.   char *pos,*progname;
  105.   progname= (*argv)[0];
  106.   while (--*argc >0 && *(pos = *(++*argv)) == '-' ) {
  107.     while (*++pos)
  108.     switch(*pos) {
  109.     case '#':
  110.       DBUG_PUSH (++pos);
  111.       *(pos--) = ''; /* Skippa argument */
  112.       break;
  113.     case 'V':
  114.       printf("%s  (Compile errormessage)  Ver 1.3n",progname);
  115.       break;
  116.     case 'I':
  117.     case '?':
  118.       printf("         %s  (Compile errormessage)  Ver 1.3n",progname);
  119.       puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,nand you are welcome to modify and redistribute it under the GPL licensen");
  120.       printf("Usage:   %s [-?] [-I] [-V] fromfile[s] tofilen",progname);
  121.       puts("Options: -Info -Versionn");
  122.       help=1;
  123.       break;
  124.    default:
  125.      fprintf(stderr,"illegal option: -%cn",*pos);
  126.      fprintf(stderr,"legal options:  -?IVn");
  127.      break;
  128.     }
  129.   }
  130.   if (*argc < 2)
  131.   {
  132.     if (!help)
  133.       printf("Usage: %s [-?] [-I] [-V] fromfile[s] tofilen",progname);
  134.     exit(-1);
  135.   }
  136.   return;
  137. } /* get_options */
  138. /* Count rows in from-file until row that start with char is found */
  139. static int count_rows(from,c,c2)
  140. FILE *from;
  141. pchar c,c2;
  142. {
  143.   int count;
  144.   long pos;
  145.   char rad[MAXLENGTH];
  146.   DBUG_ENTER("count_rows");
  147.   pos=ftell(from); count=0;
  148.   while (fgets(rad,MAXLENGTH,from) != NULL)
  149.   {
  150.     if (rad[0] == c || rad[0] == c2)
  151.       break;
  152.     count++;
  153.     pos=ftell(from);
  154.   }
  155.   fseek(from,pos,0); /* Position to beginning of last row */
  156.   DBUG_PRINT("exit",("count: %d",count));
  157.   DBUG_RETURN(count);
  158. } /* count_rows */
  159. /* Read rows and remember them until row that start with char */
  160. /* Converts row as a C-compiler would convert a textstring */
  161. static int remember_rows(from,c)
  162. FILE *from;
  163. pchar c;
  164. {
  165.   int i,nr,start_count,found_end;
  166.   char row[MAXLENGTH],*pos;
  167.   DBUG_ENTER("remember_rows");
  168.   start_count=row_count; found_end=0;
  169.   while (fgets(row,MAXLENGTH,from) != NULL)
  170.   {
  171.     if (row[0] == c)
  172.     {
  173.       found_end=1;
  174.       break;
  175.     }
  176.     for (pos=row ; *pos ;)
  177.     {
  178.       if (*pos == '\')
  179.       {
  180. switch (*++pos) {
  181. case '\':
  182. case '"':
  183.   VOID(strmov(pos-1,pos));
  184.   break;
  185. case 'n':
  186.   pos[-1]='n';
  187.   VOID(strmov(pos,pos+1));
  188.   break;
  189. default:
  190.   if (*pos >= '0' && *pos <'8')
  191.   {
  192.     nr=0;
  193.     for (i=0 ; i<3 && (*pos >= '0' && *pos <'8' ) ; i++)
  194.       nr=nr*8+ (*(pos++) -'0');
  195.     pos-=i;
  196.     pos[-1]=nr;
  197.     VOID(strmov(pos,pos+i));
  198.   }
  199.   else if (*pos)
  200.     VOID(strmov(pos-1,pos)); /* Remove '' */
  201. }
  202.       }
  203.       else pos++;
  204.     }
  205.     while (pos >row+1 && *pos != '"')
  206.       pos--;
  207.     if (!(saved_row[row_count] = (my_string) my_malloc((uint) (pos-row),
  208.        MYF(MY_WME))))
  209.       DBUG_RETURN(-1);
  210.     *pos=0;
  211.     VOID(strmov(saved_row[row_count],row+1));
  212.     row_count++;
  213.   }
  214.   if (row_count-start_count == 0 && ! found_end)
  215.     DBUG_RETURN(-1); /* Found nothing */
  216.   DBUG_RETURN(row_count-start_count);
  217. } /* remember_rows */
  218. /* Copy rows from memory to file and remember position */
  219. static int copy_rows(to)
  220. FILE *to;
  221. {
  222.   int row_nr;
  223.   long start_pos;
  224.   DBUG_ENTER("copy_rows");
  225.   start_pos=ftell(to);
  226.   for (row_nr =0 ; row_nr < row_count; row_nr++)
  227.   {
  228.     file_pos[row_nr]= (int) (ftell(to)-start_pos);
  229.     if (fputs(saved_row[row_nr],to) == EOF || fputc('',to) == EOF)
  230.     {
  231.       fprintf(stderr,"Can't write to outputfilen");
  232.       DBUG_RETURN(1);
  233.     }
  234.     my_free((gptr) saved_row[row_nr],MYF(0));
  235.   }
  236.   DBUG_RETURN(0);
  237. } /* copy_rows */