*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.78 2001/11/12 04:29:23 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.79 2002/01/09 19:13:40 tgl Exp $
*
*-------------------------------------------------------------------------
*/
static void
-read_to_eol(FILE *file)
+read_through_eol(FILE *file)
{
int c;
if (comment_ptr != NULL)
{
/* Found a comment, so skip the rest of the line */
- read_to_eol(file);
+ read_through_eol(file);
next_line = NIL;
}
OrigCharset[MAX_TOKEN],
DestCharset[MAX_TOKEN],
HostCharset[MAX_TOKEN],
- c,
- eof = false,
*map_file;
- int key = 0,
+ int key,
ChIndex = 0,
+ c,
i,
bufsize;
-
struct CharsetItem *ChArray[MAX_CHARSETS];
*TableName = '\0';
map_file = (char *) palloc(bufsize);
snprintf(map_file, bufsize, "%s/%s", DataDir, CHARSET_FILE);
file = AllocateFile(map_file, PG_BINARY_R);
+ pfree(map_file);
if (file == NULL)
{
/* XXX should we log a complaint? */
return;
}
- while (!eof)
+ while ((c = getc(file)) != EOF)
{
- c = getc(file);
- ungetc(c, file);
- if (c == EOF)
- eof = true;
+ if (c == '#')
+ read_through_eol(file);
else
{
- if (c == '#')
- read_to_eol(file);
- else
+ /* Read the key */
+ ungetc(c, file);
+ next_token(file, buf, sizeof(buf));
+ if (buf[0] != '\0')
{
- /* Read the key */
- next_token(file, buf, sizeof(buf));
- if (buf[0] != '\0')
+ key = 0;
+ if (strcasecmp(buf, "HostCharset") == 0)
+ key = KEY_HOST;
+ if (strcasecmp(buf, "BaseCharset") == 0)
+ key = KEY_BASE;
+ if (strcasecmp(buf, "RecodeTable") == 0)
+ key = KEY_TABLE;
+ switch (key)
{
- if (strcasecmp(buf, "HostCharset") == 0)
- key = KEY_HOST;
- if (strcasecmp(buf, "BaseCharset") == 0)
- key = KEY_BASE;
- if (strcasecmp(buf, "RecodeTable") == 0)
- key = KEY_TABLE;
- switch (key)
- {
- case KEY_HOST:
- /* Read the host */
- next_token(file, buf, sizeof(buf));
- if (buf[0] != '\0')
+ case KEY_HOST:
+ /* Read the host */
+ next_token(file, buf, sizeof(buf));
+ if (buf[0] != '\0')
+ {
+ if (CharSetInRange(buf, host))
{
- if (CharSetInRange(buf, host))
- {
- /* Read the charset */
- next_token(file, buf, sizeof(buf));
- if (buf[0] != '\0')
- strcpy(HostCharset, buf);
- }
+ /* Read the charset */
+ next_token(file, buf, sizeof(buf));
+ if (buf[0] != '\0')
+ strcpy(HostCharset, buf);
}
- break;
- case KEY_BASE:
- /* Read the base charset */
- next_token(file, buf, sizeof(buf));
- if (buf[0] != '\0')
- strcpy(BaseCharset, buf);
- break;
- case KEY_TABLE:
- /* Read the original charset */
+ }
+ break;
+ case KEY_BASE:
+ /* Read the base charset */
+ next_token(file, buf, sizeof(buf));
+ if (buf[0] != '\0')
+ strcpy(BaseCharset, buf);
+ break;
+ case KEY_TABLE:
+ /* Read the original charset */
+ next_token(file, buf, sizeof(buf));
+ if (buf[0] != '\0')
+ {
+ strcpy(OrigCharset, buf);
+ /* Read the destination charset */
next_token(file, buf, sizeof(buf));
if (buf[0] != '\0')
{
- strcpy(OrigCharset, buf);
- /* Read the destination charset */
+ strcpy(DestCharset, buf);
+ /* Read the table filename */
next_token(file, buf, sizeof(buf));
if (buf[0] != '\0')
{
- strcpy(DestCharset, buf);
- /* Read the table filename */
- next_token(file, buf, sizeof(buf));
- if (buf[0] != '\0')
- {
- ChArray[ChIndex] =
- (struct CharsetItem *) palloc(sizeof(struct CharsetItem));
- strcpy(ChArray[ChIndex]->Orig, OrigCharset);
- strcpy(ChArray[ChIndex]->Dest, DestCharset);
- strcpy(ChArray[ChIndex]->Table, buf);
- ChIndex++;
- }
+ ChArray[ChIndex] =
+ (struct CharsetItem *) palloc(sizeof(struct CharsetItem));
+ strcpy(ChArray[ChIndex]->Orig, OrigCharset);
+ strcpy(ChArray[ChIndex]->Dest, DestCharset);
+ strcpy(ChArray[ChIndex]->Table, buf);
+ ChIndex++;
}
}
- break;
- }
- read_to_eol(file);
+ }
+ break;
}
+ read_through_eol(file);
}
}
}
FreeFile(file);
- pfree(map_file);
for (i = 0; i < ChIndex; i++)
{
- if (!strcasecmp(BaseCharset, ChArray[i]->Orig) &&
- !strcasecmp(HostCharset, ChArray[i]->Dest))
+ if (strcasecmp(BaseCharset, ChArray[i]->Orig) == 0 &&
+ strcasecmp(HostCharset, ChArray[i]->Dest) == 0)
strncpy(TableName, ChArray[i]->Table, 79);
- pfree((struct CharsetItem *) ChArray[i]);
+ pfree(ChArray[i]);
}
}
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.81 2001/10/25 05:49:51 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.82 2002/01/09 19:13:41 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#define MAX_TOKEN 80
-/* Some standard C libraries, including GNU, have an isblank() function.
- Others, including Solaris, do not. So we have our own.
-*/
+/*
+ * 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 */ ;
+ return c == ' ' || c == '\t';
}
+
+/*
+ * 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.
+ */
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)));
+ /* Move over initial token-delimiting blanks */
+ while ((c = getc(fp)) != EOF && isblank(c))
+ ;
- if (c != '\n')
+ if (c != EOF && c != '\n')
{
/*
* build a token in buf of next characters up to EOF, eol, or
- * blank.
+ * blank. If the token gets too long, we still parse it
+ * correctly, but the excess characters are not stored into *buf.
*/
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);
+
+ /*
+ * Put back the char right after the token (critical in case it is
+ * eol, since we need to detect end-of-line at next call).
+ */
+ if (c != EOF)
+ ungetc(c, fp);
}
*buf = '\0';
}
+
static void
read_through_eol(FILE *file)
{
int c;
- do
- c = getc(file);
- while (c != '\n' && c != EOF);
+ while ((c = getc(file)) != EOF && c != '\n')
+ ;
}
+
void
-SetCharSet()
+SetCharSet(void)
{
FILE *file;
- char *p,
- c,
- eof = false;
+ char *p;
char *map_file;
char buf[MAX_TOKEN];
- int i;
+ int i,
+ c;
unsigned char FromChar,
ToChar;
char ChTable[80];
if (p && *p != '\0')
{
- map_file = malloc(strlen(DataDir) + strlen(p) + 2);
- if (!map_file)
- elog(FATAL, "out of memory");
+ map_file = palloc(strlen(DataDir) + strlen(p) + 2);
sprintf(map_file, "%s/%s", DataDir, p);
file = AllocateFile(map_file, PG_BINARY_R);
+ pfree(map_file);
if (file == NULL)
- {
- free(map_file);
return;
- }
- eof = false;
- while (!eof)
+ while ((c = getc(file)) != EOF)
{
- c = getc(file);
- ungetc(c, file);
- if (c == EOF)
- eof = true;
+ if (c == '#')
+ read_through_eol(file);
else
{
- if (c == '#')
- read_through_eol(file);
- else
+ /* Read the FromChar */
+ ungetc(c, file);
+ next_token(file, buf, sizeof(buf));
+ if (buf[0] != '\0')
{
- /* Read the FromChar */
+ FromChar = strtoul(buf, 0, 0);
+ /* Read the ToChar */
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;
- }
+ ToChar = strtoul(buf, 0, 0);
+ RecodeForwTable[FromChar - 128] = ToChar;
+ RecodeBackTable[ToChar - 128] = FromChar;
read_through_eol(file);
}
}
}
}
FreeFile(file);
- free(map_file);
}
}