diff options
Diffstat (limited to 'src/backend/utils/init/miscinit.c')
-rw-r--r-- | src/backend/utils/init/miscinit.c | 146 |
1 files changed, 145 insertions, 1 deletions
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index fe26cdde864..9bc13907dc2 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.9 1998/01/25 04:07:00 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.10 1998/02/24 15:20:16 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -51,6 +51,11 @@ extern char *DatabaseName; extern char *UserName; extern char *DatabasePath; +#ifdef CYR_RECODE +unsigned char RecodeForwTable[128]; +unsigned char RecodeBackTable[128]; +#endif + /* * Define USE_ENVIRONMENT to get PGDATA, etc. from environment variables. @@ -258,6 +263,145 @@ SetDatabaseName(char *name) strcpy(DatabaseName, name); } +#ifdef CYR_RECODE +#define MAX_TOKEN 80 + +/* Some standard C libraries, including GNU, have an isblank() function. + Others, including Solaris, do not. So we have our own. +*/ +static bool +isblank(const char c) +{ + return (c == ' ' || c == 9 /* tab */ ); +} + +static void +next_token(FILE *fp, char *buf, const int bufsz) +{ +/*-------------------------------------------------------------------------- + Grab one token out of fp. Tokens are strings of non-blank + characters bounded by blank characters, beginning of line, and end + of line. Blank means space or tab. Return the token as *buf. + Leave file positioned to character immediately after the token or + EOF, whichever comes first. If no more tokens on line, return null + string as *buf and position file to beginning of next line or EOF, + whichever comes first. +--------------------------------------------------------------------------*/ + int c; + char *eb = buf + (bufsz - 1); + + /* Move over inital token-delimiting blanks */ + while (isblank(c = getc(fp))); + + if (c != '\n') + { + + /* + * build a token in buf of next characters up to EOF, eol, or + * blank. + */ + while (c != EOF && c != '\n' && !isblank(c)) + { + if (buf < eb) + *buf++ = c; + c = getc(fp); + + /* + * Put back the char right after the token (putting back EOF + * is ok) + */ + } + ungetc(c, fp); + } + *buf = '\0'; +} + +static void +read_through_eol(FILE *file) +{ + int c; + + do + c = getc(file); + while (c != '\n' && c != EOF); +} + +void SetCharSet() +{ + FILE *file; + char *p,c,eof=false; + char *map_file; + char buf[MAX_TOKEN]; + int i; + unsigned char FromChar,ToChar; + + for(i=0; i<128; i++) + { + RecodeForwTable[i] = i+128; + RecodeBackTable[i] = i+128; + } + + p = getenv("PG_RECODETABLE"); + if (p && *p != '\0') + { + map_file = (char *) malloc((strlen(DataDir) + + strlen(p)+2)*sizeof(char)); + sprintf(map_file, "%s/%s", DataDir, p); + file = fopen(map_file, "r"); + if (file == NULL) + return; + eof=false; + while (!eof) + { + c = getc(file); + ungetc(c, file); + if (c == EOF) + eof = true; + else + { + if (c == '#') + read_through_eol(file); + else + { + /* Read the FromChar */ + next_token(file, buf, sizeof(buf)); + if (buf[0] != '\0') + { + FromChar = strtoul(buf,0,0); + /* Read the ToChar */ + next_token(file, buf, sizeof(buf)); + if (buf[0] != '\0') + { + ToChar = strtoul(buf,0,0); + RecodeForwTable[FromChar-128] = ToChar; + RecodeBackTable[ToChar-128] = FromChar; + } + read_through_eol(file); + } + } + } + } + fclose(file); + free(map_file); + } +} + +char* convertstr(unsigned char *buff,int len,int dest) +{ + int i; + char *ch=buff; + for (i = 0; i < len; i++,buff++) + { + if (*buff >127) + if (dest) + *buff = RecodeForwTable[*buff-128]; + else + *buff = RecodeBackTable[*buff-128]; + } + return ch; +} +#endif + /* ---------------- * GetPgUserName and SetPgUserName * |