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   * | 
