77 *
88 *
99 * IDENTIFICATION
10- * $Header: /cvsroot/pgsql/src/backend/utils/adt/encode.c,v 1.2 2001/09/14 17:46:40 momjian Exp $
10+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/encode.c,v 1.3 2001/09/30 22:03:41 tgl Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
1414#include "postgres.h"
1515
1616#include <ctype.h>
17+
1718#include "utils/builtins.h"
1819
1920
@@ -38,24 +39,25 @@ binary_encode(PG_FUNCTION_ARGS)
3839Datum name = PG_GETARG_DATUM (1 );
3940text * result ;
4041char * namebuf ;
41- int namelen , datalen ,resultlen ,res ;
42+ int datalen ,resultlen ,res ;
4243struct pg_encoding * enc ;
4344
4445datalen = VARSIZE (data )- VARHDRSZ ;
45- namelen = VARSIZE (name )- VARHDRSZ ;
4646
47- namebuf = ( char * ) DirectFunctionCall1 (textout ,name );
47+ namebuf = DatumGetCString ( DirectFunctionCall1 (textout ,name ) );
4848
4949enc = pg_find_encoding (namebuf );
5050if (enc == NULL )
51- elog (ERROR ,"No such encoding" );
51+ elog (ERROR ,"No such encoding as '%s'" , namebuf );
5252
5353resultlen = enc -> encode_len (VARDATA (data ),datalen );
5454result = palloc (VARHDRSZ + resultlen );
5555
5656res = enc -> encode (VARDATA (data ),datalen ,VARDATA (result ));
57+
58+ /* Make this FATAL 'cause we've trodden on memory ... */
5759if (res > resultlen )
58- elog (ERROR ,"Overflow - encode estimate too small" );
60+ elog (FATAL ,"Overflow - encode estimate too small" );
5961
6062VARATT_SIZEP (result )= VARHDRSZ + res ;
6163
@@ -69,24 +71,25 @@ binary_decode(PG_FUNCTION_ARGS)
6971Datum name = PG_GETARG_DATUM (1 );
7072bytea * result ;
7173char * namebuf ;
72- int namelen , datalen ,resultlen ,res ;
74+ int datalen ,resultlen ,res ;
7375struct pg_encoding * enc ;
7476
7577datalen = VARSIZE (data )- VARHDRSZ ;
76- namelen = VARSIZE (name )- VARHDRSZ ;
7778
78- namebuf = ( char * ) DirectFunctionCall1 (textout ,name );
79+ namebuf = DatumGetCString ( DirectFunctionCall1 (textout ,name ) );
7980
8081enc = pg_find_encoding (namebuf );
8182if (enc == NULL )
82- elog (ERROR ,"No such encoding" );
83+ elog (ERROR ,"No such encoding as '%s'" , namebuf );
8384
8485resultlen = enc -> decode_len (VARDATA (data ),datalen );
8586result = palloc (VARHDRSZ + resultlen );
8687
8788res = enc -> decode (VARDATA (data ),datalen ,VARDATA (result ));
89+
90+ /* Make this FATAL 'cause we've trodden on memory ... */
8891if (res > resultlen )
89- elog (ERROR ,"Overflow - decode estimate too small" );
92+ elog (FATAL ,"Overflow - decode estimate too small" );
9093
9194VARATT_SIZEP (result )= VARHDRSZ + res ;
9295
@@ -339,14 +342,12 @@ esc_encode(const uint8 *src, unsigned srclen, uint8 *dst)
339342{
340343const uint8 * end = src + srclen ;
341344uint8 * rp = dst ;
342- int val ;
343345int len = 0 ;
344346
345347while (src < end )
346348{
347349if (* src == '\0' )
348350{
349- val = * src ;
350351rp [0 ]= '\\' ;
351352rp [1 ]= '0' ;
352353rp [2 ]= '0' ;
@@ -356,7 +357,6 @@ esc_encode(const uint8 *src, unsigned srclen, uint8 *dst)
356357}
357358else if (* src == '\\' )
358359{
359- val = * src ;
360360rp [0 ]= '\\' ;
361361rp [1 ]= '\\' ;
362362rp += 2 ;
@@ -370,7 +370,6 @@ esc_encode(const uint8 *src, unsigned srclen, uint8 *dst)
370370
371371src ++ ;
372372}
373- * rp = '\0' ;
374373
375374return len ;
376375}
@@ -380,7 +379,6 @@ esc_decode(const uint8 *src, unsigned srclen, uint8 *dst)
380379{
381380const uint8 * end = src + srclen ;
382381uint8 * rp = dst ;
383- int val ;
384382int len = 0 ;
385383
386384while (src < end )
@@ -389,19 +387,21 @@ esc_decode(const uint8 *src, unsigned srclen, uint8 *dst)
389387{
390388* rp ++ = * src ++ ;
391389}
392- else if (( src [ 0 ] == '\\' ) &&
390+ else if (src + 3 < end &&
393391(src [1 ] >='0' && src [1 ] <='3' )&&
394392(src [2 ] >='0' && src [2 ] <='7' )&&
395393(src [3 ] >='0' && src [3 ] <='7' ) )
396394{
395+ int val ;
396+
397397val = VAL (src [1 ]);
398398val <<=3 ;
399399val += VAL (src [2 ]);
400400val <<=3 ;
401401* rp ++ = val + VAL (src [3 ]);
402402src += 4 ;
403403}
404- else if (( src [ 0 ] == '\\' ) &&
404+ else if (src + 1 < end &&
405405(src [1 ]== '\\' ) )
406406{
407407* rp ++ = '\\' ;
@@ -418,6 +418,7 @@ esc_decode(const uint8 *src, unsigned srclen, uint8 *dst)
418418
419419len ++ ;
420420}
421+
421422return len ;
422423}
423424
@@ -439,11 +440,6 @@ esc_enc_len(const uint8 *src, unsigned srclen)
439440src ++ ;
440441}
441442
442- /*
443- * Allow for null terminator
444- */
445- len ++ ;
446-
447443return len ;
448444}
449445
@@ -459,7 +455,7 @@ esc_dec_len(const uint8 *src, unsigned srclen)
459455{
460456src ++ ;
461457}
462- else if (( src [ 0 ] == '\\' ) &&
458+ else if (src + 3 < end &&
463459(src [1 ] >='0' && src [1 ] <='3' )&&
464460(src [2 ] >='0' && src [2 ] <='7' )&&
465461(src [3 ] >='0' && src [3 ] <='7' ) )
@@ -469,7 +465,7 @@ esc_dec_len(const uint8 *src, unsigned srclen)
469465 */
470466src += 4 ;
471467}
472- else if (( src [ 0 ] == '\\' ) &&
468+ else if (src + 1 < end &&
473469(src [1 ]== '\\' ) )
474470{
475471/*
@@ -510,7 +506,7 @@ pg_find_encoding(const char *name)
510506int i ;
511507
512508for (i = 0 ;enclist [i ].name ;i ++ )
513- if (! strcasecmp (enclist [i ].name ,name ))
509+ if (strcasecmp (enclist [i ].name ,name )== 0 )
514510return & enclist [i ].enc ;
515511
516512return NULL ;