*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.4 1996/12/31 07:29:17 bryanh Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.5 1997/03/16 18:51:29 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
#include "libpq-fe.h"
+/* --------------------------------------------------------------------- */
/* pqGetc:
get a character from stream f
if debug is set, also echo the character fetched
*/
-int
-pqGetc(FILE* fin, FILE* debug)
+int pqGetc(FILE* fin, FILE* debug)
{
int c;
c = getc(fin);
+
if (debug && c != EOF)
fprintf(debug, "From backend> %c\n", c);
+
return c;
}
+/* --------------------------------------------------------------------- */
/* pqPutnchar:
send a string of exactly len length into stream f
returns 1 if there was an error, 0 otherwise.
*/
-int
-pqPutnchar(const char* s, int len, FILE *f, FILE *debug)
+int pqPutnchar(const char* s, int len, FILE *f, FILE *debug)
{
- int status;
-
if (f == NULL)
return 1;
- if (debug) fputs("To backend>", debug);
- while (len--) {
- status = fputc(*s,f);
- if (debug)
- fputc(*s,debug);
- s++;
- if (status == EOF)
+ if(debug)
+ fprintf(debug, "To backend> %s\n", s);
+
+ if(fwrite(s, 1, len, f) != len)
return 1;
- }
- if (debug) fputc('\n', debug);
+
return 0;
}
+/* --------------------------------------------------------------------- */
/* pqGetnchar:
get a string of exactly len length from stream f
*/
-int
-pqGetnchar(char* s, int len, FILE *f, FILE *debug)
+int pqGetnchar(char* s, int len, FILE *f, FILE *debug)
{
- int c;
+ int cnt;
if (f == NULL)
return 1;
- while (len-- && (c = getc(f)) != EOF)
- *s++ = c;
- *s = '\0';
+ cnt = fread(s, 1, len, f);
+ s[cnt] = '\0';
+ /* mjl: actually needs up to len+1 bytes, is this okay? XXX */
+
+ if (debug)
+ fprintf(debug, "From backend (%d)> %s\n", len, s);
- if (debug) {
- fprintf(debug, "From backend> %s\n", s);
- }
return 0;
}
+/* --------------------------------------------------------------------- */
/* pqGets:
get a string of up to length len from stream f
*/
-int
-pqGets(char* s, int len, FILE *f, FILE *debug)
+int pqGets(char* s, int len, FILE *f, FILE *debug)
{
int c;
+ const char *str = s;
if (f == NULL)
return 1;
while (len-- && (c = getc(f)) != EOF && c)
*s++ = c;
*s = '\0';
+ /* mjl: actually needs up to len+1 bytes, is this okay? XXX */
+
+ if (debug)
+ fprintf(debug, "From backend> \"%s\"\n", str);
- if (debug) {
- fprintf(debug, "From backend> %s\n", s);
- }
return 0;
}
-
+/* --------------------------------------------------------------------- */
/* pgPutInt
- send an integer of up to 4 bytesto the file stream
- do this one byte at at time.
- This insures that machines with different ENDIANness can talk to each other
- get a n-byte integer from the stream into result
+ send an integer of 2 or 4 bytes to the file stream, compensate
+ for host endianness.
returns 0 if successful, 1 otherwise
*/
-int
-pqPutInt(const int integer, int bytes, FILE* f, FILE *debug)
+int pqPutInt(const int integer, int bytes, FILE* f, FILE *debug)
{
- int i;
- int status;
-
- i = integer;
-
- if (bytes > 4)
- bytes = 4;
-
- while (bytes--) {
- status = fputc(i & 0xff, f);
- i >>= 8;
- if (status == EOF) {
- return 1;
- }
- }
- if (debug) fprintf(debug, "To backend (#)> %d\n", integer);
- return 0;
+ int retval = 0;
+
+ switch(bytes)
+ {
+ case 2:
+ retval = pqPutShort(integer, f);
+ break;
+ case 4:
+ retval = pqPutLong(integer, f);
+ break;
+ default:
+ fprintf(stderr, "** int size %d not supported\n", bytes);
+ retval = 1;
+ }
+
+ if (debug) fprintf(debug, "To backend (%d#)> %d\n", bytes, integer);
+
+ return retval;
}
+/* --------------------------------------------------------------------- */
/* pgGetInt
- reconstructs the integer one byte at a time.
- This insures that machines with different ENDIANness can talk to each other
- get a n-byte integer from the stream into result
+ read a 2 or 4 byte integer from the stream and swab it around
+ to compensate for different endianness
returns 0 if successful
*/
-int
-pqGetInt(int* result, int bytes, FILE* f, FILE *debug)
+int pqGetInt(int* result, int bytes, FILE* f, FILE *debug)
{
- int c;
- int p;
- int n;
-
- if (f == NULL)
- return 1;
+ int retval = 0;
- p = 0;
- n = 0;
- while (bytes && (c = getc(f)) != EOF)
+ switch(bytes)
{
- n |= (c & 0xff) << p;
- p += 8;
- bytes--;
+ case 2:
+ retval = pqGetShort(result, f);
+ break;
+ case 4:
+ retval = pqGetLong(result, f);
+ break;
+ default:
+ fprintf(stderr, "** int size %d not supported\n", bytes);
+ retval = 1;
}
- if (bytes != 0)
- return 1;
-
- *result = n;
if (debug)
- fprintf(debug,"From backend (#)> %d\n",*result);
- return 0;
-}
+ fprintf(debug,"From backend (#%d)> %d\n", bytes, *result);
+ return retval;
+}
-int
-pqPuts(const char* s, FILE *f, FILE *debug)
+/* --------------------------------------------------------------------- */
+int pqPuts(const char* s, FILE *f, FILE *debug)
{
if (f == NULL)
return 1;
- if (fputs(s,f) == EOF)
+ if (fputs(s, f) == EOF)
return 1;
- fputc('\0',f); /* important to send an ending EOF since backend expects it */
+ fputc('\0', f); /* important to send an ending \0 since backend expects it */
fflush(f);
if (debug) {
fprintf(debug, "To backend> %s\n", s);
}
+
return 0;
}
-
-void
-pqFlush(FILE *f, FILE *debug)
+/* --------------------------------------------------------------------- */
+void pqFlush(FILE *f, FILE *debug)
{
if (f)
fflush(f);
+
if (debug)
fflush(debug);
}
-
+/* --------------------------------------------------------------------- */