comp_err.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:7k
- /* Copyright (C) 2000 MySQL AB
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
- /* Saves all errmesg in a header file, updated by me, in a compact file */
- #include <my_global.h>
- #include <m_ctype.h>
- #include <my_sys.h>
- #include <m_string.h>
- #define MAXLENGTH 1000
- #define MAX_ROWS 1000
- #define MAX_FILES 10
- #define MAX_CHARSET_NAME 64
- int row_count;
- uint file_pos[MAX_ROWS],file_row_pos[MAX_FILES];
- my_string saved_row[MAX_ROWS];
- uchar file_head[]= { 254,254,2,1 };
- char charset_name[MAX_CHARSET_NAME];
- static void get_options(int *argc,char **argv[]);
- static int count_rows(FILE *from,pchar c, pchar c2);
- static int remember_rows(FILE *from,pchar c);
- static int copy_rows(FILE *to);
- /* Functions defined in this file */
- int main(int argc,char *argv[])
- {
- uint csnum= 0;
- int i,error,files,length;
- uchar head[32];
- FILE *from,*to;
- MY_INIT(argv[0]);
-
- get_options(&argc,&argv);
- error=1;
- row_count=files=0;
- to=0;
- for ( ; argc-- > 1 ; argv++)
- {
- file_row_pos[files++] = row_count;
- if ((from = fopen(*argv,"r")) == NULL)
- {
- fprintf(stderr,"Can't open file '%s'n",*argv);
- return(1);
- }
- VOID(count_rows(from,'"','{')); /* Calculate start-info */
- if (!charset_name[0])
- {
- fprintf(stderr,"Character set is not specified in '%s'n",*argv);
- fclose(from);
- goto end;
- }
- if (!(csnum= get_charset_number(charset_name, MY_CS_PRIMARY)))
- {
- fprintf(stderr,"Unknown character '%s' in '%s'n",charset_name, *argv);
- fclose(from);
- goto end;
- }
-
- if (remember_rows(from,'}') < 0) /* Remember rows */
- {
- fprintf(stderr,"Can't find textrows in '%s'n",*argv);
- fclose(from);
- goto end;
- }
- fclose(from);
- }
- if ((to=my_fopen(*argv,O_WRONLY | FILE_BINARY,MYF(0))) == NULL)
- {
- fprintf(stderr,"Can't create file '%s'n",*argv);
- return(1);
- }
- fseek(to,(long) (32+row_count*2),0);
- if (copy_rows(to))
- goto end;
- length=ftell(to)-32-row_count*2;
- bzero((gptr) head,32); /* Save Header & pointers */
- bmove((byte*) head,(byte*) file_head,4);
- head[4]=files;
- int2store(head+6,length);
- int2store(head+8,row_count);
- for (i=0 ; i<files ; i++)
- {
- int2store(head+10+i+i,file_row_pos[i]);
- }
- head[30]= csnum;
-
- fseek(to,0l,0);
- if (fwrite(head,1,32,to) != 32)
- goto end;
- for (i=0 ; i<row_count ; i++)
- {
- int2store(head,file_pos[i]);
- if (fwrite(head,1,2,to) != 2)
- goto end;
- }
- error=0;
- printf("Found %d messages in language file %sn",row_count,*argv);
- end:
- if (to)
- fclose(to);
- if (error)
- fprintf(stderr,"Can't update messagefile %s, errno: %dn",*argv,errno);
- exit(error);
- return(0);
- } /* main */
- /* Read options */
- static void get_options(register int *argc,register char **argv[])
- {
- int help=0;
- char *pos,*progname;
- progname= (*argv)[0];
- while (--*argc >0 && *(pos = *(++*argv)) == '-' ) {
- while (*++pos)
- switch(*pos) {
- case '#':
- DBUG_PUSH (++pos);
- *(pos--) = ' '; /* Skippa argument */
- break;
- case 'V':
- printf("%s (Compile errormessage) Ver 1.3n",progname);
- break;
- case 'C':
- charsets_dir= pos+1;
- *(pos--)= ' ';
- break;
- case 'I':
- case '?':
- printf(" %s (Compile errormessage) Ver 1.3n",progname);
- 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");
- printf("Usage: %s [-?] [-I] [-V] fromfile[s] tofilen",progname);
- puts("Options: -Info -Versionn");
- help=1;
- break;
- default:
- fprintf(stderr,"illegal option: -%cn",*pos);
- fprintf(stderr,"legal options: -?IVn");
- break;
- }
- }
- if (*argc < 2)
- {
- if (!help)
- printf("Usage: %s [-?] [-I] [-V] fromfile[s] tofilen",progname);
- exit(-1);
- }
- return;
- } /* get_options */
- /* Count rows in from-file until row that start with char is found */
- static int count_rows(FILE *from, pchar c, pchar c2)
- {
- int count;
- long pos;
- char rad[MAXLENGTH];
- DBUG_ENTER("count_rows");
- pos=ftell(from); count=0;
-
- charset_name[0]= ' ';
- while (fgets(rad,MAXLENGTH,from) != NULL)
- {
- if (!strncmp(rad,"character-set=",14))
- {
- char *b= rad+14, *e;
- for (e=b ; e[0] && e-b < MAX_CHARSET_NAME &&
- e[0] != ' ' && e[0] != 'r' &&
- e[0] != 'n' && e[0] != 't' ; e++);
- e[0]= ' ';
- strcpy(charset_name, b);
- }
- if (rad[0] == c || rad[0] == c2)
- break;
- count++;
- pos=ftell(from);
- }
- fseek(from,pos,0); /* Position to beginning of last row */
- DBUG_PRINT("exit",("count: %d",count));
- DBUG_RETURN(count);
- } /* count_rows */
- /* Read rows and remember them until row that start with char */
- /* Converts row as a C-compiler would convert a textstring */
- static int remember_rows(FILE* from, pchar c)
- {
- int i,nr,start_count,found_end;
- char row[MAXLENGTH],*pos;
- DBUG_ENTER("remember_rows");
- start_count=row_count; found_end=0;
- while (fgets(row,MAXLENGTH,from) != NULL)
- {
- if (row[0] == c)
- {
- found_end=1;
- break;
- }
- for (pos=row ; *pos ;)
- {
- if (*pos == '\')
- {
- switch (*++pos) {
- case '\':
- case '"':
- VOID(strmov(pos-1,pos));
- break;
- case 'n':
- pos[-1]='n';
- VOID(strmov(pos,pos+1));
- break;
- default:
- if (*pos >= '0' && *pos <'8')
- {
- nr=0;
- for (i=0 ; i<3 && (*pos >= '0' && *pos <'8' ) ; i++)
- nr=nr*8+ (*(pos++) -'0');
- pos-=i;
- pos[-1]=nr;
- VOID(strmov(pos,pos+i));
- }
- else if (*pos)
- VOID(strmov(pos-1,pos)); /* Remove '' */
- }
- }
- else pos++;
- }
- while (pos >row+1 && *pos != '"')
- pos--;
- if (!(saved_row[row_count] = (my_string) my_malloc((uint) (pos-row),
- MYF(MY_WME))))
- DBUG_RETURN(-1);
- *pos=0;
- VOID(strmov(saved_row[row_count],row+1));
- row_count++;
- }
- if (row_count-start_count == 0 && ! found_end)
- DBUG_RETURN(-1); /* Found nothing */
- DBUG_RETURN(row_count-start_count);
- } /* remember_rows */
- /* Copy rows from memory to file and remember position */
- static int copy_rows(FILE *to)
- {
- int row_nr;
- long start_pos;
- DBUG_ENTER("copy_rows");
- start_pos=ftell(to);
- for (row_nr =0 ; row_nr < row_count; row_nr++)
- {
- file_pos[row_nr]= (int) (ftell(to)-start_pos);
- if (fputs(saved_row[row_nr],to) == EOF || fputc(' ',to) == EOF)
- {
- fprintf(stderr,"Can't write to outputfilen");
- DBUG_RETURN(1);
- }
- my_free((gptr) saved_row[row_nr],MYF(0));
- }
- DBUG_RETURN(0);
- } /* copy_rows */