comp_err.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

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