@ -57,12 +57,16 @@ static void make_bound_box(POLYGON *poly);
static bool plist_same ( int npts , Point * p1 , Point * p2 ) ;
static bool plist_same ( int npts , Point * p1 , Point * p2 ) ;
static Point * point_construct ( double x , double y ) ;
static Point * point_construct ( double x , double y ) ;
static Point * point_copy ( Point * pt ) ;
static Point * point_copy ( Point * pt ) ;
static int single_decode ( char * str , float8 * x , char * * ss ) ;
static double single_decode ( char * num , char * * endptr_p ,
static int single_encode ( float8 x , char * str ) ;
const char * type_name , const char * orig_string ) ;
static int pair_decode ( char * str , float8 * x , float8 * y , char * * s ) ;
static void single_encode ( float8 x , StringInfo str ) ;
static int pair_encode ( float8 x , float8 y , char * str ) ;
static void pair_decode ( char * str , double * x , double * y , char * * endptr_p ,
const char * type_name , const char * orig_string ) ;
static void pair_encode ( float8 x , float8 y , StringInfo str ) ;
static int pair_count ( char * s , char delim ) ;
static int pair_count ( char * s , char delim ) ;
static int path_decode ( int opentype , int npts , char * str , int * isopen , char * * ss , Point * p ) ;
static void path_decode ( char * str , bool opentype , int npts , Point * p ,
bool * isopen , char * * endptr_p ,
const char * type_name , const char * orig_string ) ;
static char * path_encode ( enum path_delim path_delim , int npts , Point * pt ) ;
static char * path_encode ( enum path_delim path_delim , int npts , Point * pt ) ;
static void statlseg_construct ( LSEG * lseg , Point * pt1 , Point * pt2 ) ;
static void statlseg_construct ( LSEG * lseg , Point * pt1 , Point * pt2 ) ;
static double box_ar ( BOX * box ) ;
static double box_ar ( BOX * box ) ;
@ -91,10 +95,6 @@ static double dist_ppoly_internal(Point *pt, POLYGON *poly);
# define LDELIM_C '<'
# define LDELIM_C '<'
# define RDELIM_C '>'
# define RDELIM_C '>'
/* Maximum number of characters printed by pair_encode() */
/* ...+3+7 : 3 accounts for extra_float_digits max value */
# define P_MAXLEN (2*(DBL_DIG+3+7)+1)
/*
/*
* Geometric data types are composed of points .
* Geometric data types are composed of points .
@ -121,195 +121,166 @@ static double dist_ppoly_internal(Point *pt, POLYGON *poly);
* and restore that order for text output - tgl 97 / 01 / 16
* and restore that order for text output - tgl 97 / 01 / 16
*/
*/
static int
static double
single_decode ( char * str , float8 * x , char * * s )
single_decode ( char * num , char * * endptr_p ,
{
const char * type_name , const char * orig_string )
char * cp ;
if ( ! PointerIsValid ( str ) )
return FALSE ;
* x = strtod ( str , & cp ) ;
# ifdef GEODEBUG
printf ( " single_decode- decoded first %d chars of \" %s \" to %g \n " ,
( int ) ( cp - str ) , str , * x ) ;
# endif
if ( s ! = NULL )
{
{
while ( isspace ( ( unsigned char ) * cp ) )
return float8in_internal ( num , endptr_p , type_name , orig_string ) ;
cp + + ;
* s = cp ;
}
return TRUE ;
} /* single_decode() */
} /* single_decode() */
static int
static void
single_encode ( float8 x , char * str )
single_encode ( float8 x , StringInfo str )
{
{
int ndig = DBL_DIG + extra_float_digits ;
char * xstr = float8out_internal ( x ) ;
if ( ndig < 1 )
appendStringInfoString ( str , xstr ) ;
ndig = 1 ;
pfree ( xstr ) ;
sprintf ( str , " %.*g " , ndig , x ) ;
return TRUE ;
} /* single_encode() */
} /* single_encode() */
static int
static void
pair_decode ( char * str , float8 * x , float8 * y , char * * s )
pair_decode ( char * str , double * x , double * y , char * * endptr_p ,
const char * type_name , const char * orig_string )
{
{
int has_delim ;
bool has_delim ;
char * cp ;
if ( ! PointerIsValid ( str ) )
return FALSE ;
while ( isspace ( ( unsigned char ) * str ) )
while ( isspace ( ( unsigned char ) * str ) )
str + + ;
str + + ;
if ( ( has_delim = ( * str = = LDELIM ) ) )
if ( ( has_delim = ( * str = = LDELIM ) ) )
str + + ;
str + + ;
while ( isspace ( ( unsigned char ) * str ) )
* x = float8in_internal ( str , & str , type_name , orig_string ) ;
str + + ;
* x = strtod ( str , & cp ) ;
if ( * str + + ! = DELIM )
if ( cp < = str )
ereport ( ERROR ,
return FALSE ;
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
while ( isspace ( ( unsigned char ) * cp ) )
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
cp + + ;
type_name , orig_string ) ) ) ;
if ( * cp + + ! = DELIM )
return FALSE ;
* y = float8in_internal ( str , & str , type_name , orig_string ) ;
while ( isspace ( ( unsigned char ) * cp ) )
cp + + ;
* y = strtod ( cp , & str ) ;
if ( str < = cp )
return FALSE ;
while ( isspace ( ( unsigned char ) * str ) )
str + + ;
if ( has_delim )
if ( has_delim )
{
{
if ( * str ! = RDELIM )
if ( * str + + ! = RDELIM )
return FALSE ;
ereport ( ERROR ,
str + + ;
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
type_name , orig_string ) ) ) ;
while ( isspace ( ( unsigned char ) * str ) )
while ( isspace ( ( unsigned char ) * str ) )
str + + ;
str + + ;
}
}
if ( s ! = NULL )
* s = str ;
return TRUE ;
/* report stopping point if wanted, else complain if not end of string */
if ( endptr_p )
* endptr_p = str ;
else if ( * str ! = ' \0 ' )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
type_name , orig_string ) ) ) ;
}
}
static int
static void
pair_encode ( float8 x , float8 y , char * str )
pair_encode ( float8 x , float8 y , StringInfo str )
{
{
int ndig = DBL_DIG + extra_float_digits ;
char * xstr = float8out_internal ( x ) ;
char * ystr = float8out_internal ( y ) ;
if ( ndig < 1 )
ndig = 1 ;
sprintf ( str , " %.*g,%.*g " , ndig , x , ndig , y ) ;
appendStringInfo ( str , " %s,%s " , xstr , ystr ) ;
return TRUE ;
pfree ( xstr ) ;
pfree ( ystr ) ;
}
}
static int
static void
path_decode ( int opentype , int npts , char * str , int * isopen , char * * ss , Point * p )
path_decode ( char * str , bool opentype , int npts , Point * p ,
bool * isopen , char * * endptr_p ,
const char * type_name , const char * orig_string )
{
{
int depth = 0 ;
int depth = 0 ;
char * s ,
char * cp ;
* cp ;
int i ;
int i ;
s = str ;
while ( isspace ( ( unsigned char ) * str ) )
while ( isspace ( ( unsigned char ) * s ) )
str + + ;
s + + ;
if ( ( * isopen = ( * str = = LDELIM_EP ) ) )
if ( ( * isopen = ( * s = = LDELIM_EP ) ) )
{
{
/* no open delimiter allowed? */
/* no open delimiter allowed? */
if ( ! opentype )
if ( ! opentype )
return FALSE ;
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
type_name , orig_string ) ) ) ;
depth + + ;
depth + + ;
s + + ;
str + + ;
while ( isspace ( ( unsigned char ) * s ) )
s + + ;
}
}
else if ( * s = = LDELIM )
else if ( * str = = LDELIM )
{
{
cp = ( s + 1 ) ;
cp = ( str + 1 ) ;
while ( isspace ( ( unsigned char ) * cp ) )
while ( isspace ( ( unsigned char ) * cp ) )
cp + + ;
cp + + ;
if ( * cp = = LDELIM )
if ( * cp = = LDELIM )
{
{
# ifdef NOT_USED
/* nested delimiters with only one point? */
if ( npts < = 1 )
return FALSE ;
# endif
depth + + ;
depth + + ;
s = cp ;
str = cp ;
}
}
else if ( strrchr ( s , LDELIM ) = = s )
else if ( strrchr ( str , LDELIM ) = = str )
{
{
depth + + ;
depth + + ;
s = cp ;
str = cp ;
}
}
}
}
for ( i = 0 ; i < npts ; i + + )
for ( i = 0 ; i < npts ; i + + )
{
{
if ( ! pair_decode ( s , & ( p - > x ) , & ( p - > y ) , & s ) )
pair_decode ( str , & ( p - > x ) , & ( p - > y ) , & str , type_name , orig_string ) ;
return FALSE ;
if ( * str = = DELIM )
str + + ;
if ( * s = = DELIM )
s + + ;
p + + ;
p + + ;
}
}
while ( isspace ( ( unsigned char ) * str ) )
str + + ;
while ( depth > 0 )
while ( depth > 0 )
{
{
if ( ( * s = = RDELIM )
if ( ( * str = = RDELIM )
| | ( ( * s = = RDELIM_EP ) & & ( * isopen ) & & ( depth = = 1 ) ) )
| | ( ( * str = = RDELIM_EP ) & & ( * isopen ) & & ( depth = = 1 ) ) )
{
{
depth - - ;
depth - - ;
s + + ;
str + + ;
while ( isspace ( ( unsigned char ) * s ) )
while ( isspace ( ( unsigned char ) * str ) )
s + + ;
str + + ;
}
}
else
else
return FALSE ;
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
type_name , orig_string ) ) ) ;
}
}
* ss = s ;
return TRUE ;
/* report stopping point if wanted, else complain if not end of string */
if ( endptr_p )
* endptr_p = str ;
else if ( * str ! = ' \0 ' )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
type_name , orig_string ) ) ) ;
} /* path_decode() */
} /* path_decode() */
static char *
static char *
path_encode ( enum path_delim path_delim , int npts , Point * pt )
path_encode ( enum path_delim path_delim , int npts , Point * pt )
{
{
int size = npts * ( P_MAXLEN + 3 ) + 2 ;
StringInfoData str ;
char * result ;
char * cp ;
int i ;
int i ;
/* Check for integer overflow */
initStringInfo ( & str ) ;
if ( ( size - 2 ) / npts ! = ( P_MAXLEN + 3 ) )
ereport ( ERROR ,
( errcode ( ERRCODE_PROGRAM_LIMIT_EXCEEDED ) ,
errmsg ( " too many points requested " ) ) ) ;
result = palloc ( size ) ;
cp = result ;
switch ( path_delim )
switch ( path_delim )
{
{
case PATH_CLOSED :
case PATH_CLOSED :
* cp + + = LDELIM ;
appendStringInfoChar ( & str , LDELIM ) ;
break ;
break ;
case PATH_OPEN :
case PATH_OPEN :
* cp + + = LDELIM_EP ;
appendStringInfoChar ( & str , LDELIM_EP ) ;
break ;
break ;
case PATH_NONE :
case PATH_NONE :
break ;
break ;
@ -317,32 +288,27 @@ path_encode(enum path_delim path_delim, int npts, Point *pt)
for ( i = 0 ; i < npts ; i + + )
for ( i = 0 ; i < npts ; i + + )
{
{
* cp + + = LDELIM ;
if ( i > 0 )
if ( ! pair_encode ( pt - > x , pt - > y , cp ) )
appendStringInfoChar ( & str , DELIM ) ;
ereport ( ERROR ,
appendStringInfoChar ( & str , LDELIM ) ;
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
pair_encode ( pt - > x , pt - > y , & str ) ;
errmsg ( " could not format \" path \" value " ) ) ) ;
appendStringInfoChar ( & str , RDELIM ) ;
cp + = strlen ( cp ) ;
* cp + + = RDELIM ;
* cp + + = DELIM ;
pt + + ;
pt + + ;
}
}
cp - - ;
switch ( path_delim )
switch ( path_delim )
{
{
case PATH_CLOSED :
case PATH_CLOSED :
* cp + + = RDELIM ;
appendStringInfoChar ( & str , RDELIM ) ;
break ;
break ;
case PATH_OPEN :
case PATH_OPEN :
* cp + + = RDELIM_EP ;
appendStringInfoChar ( & str , RDELIM_EP ) ;
break ;
break ;
case PATH_NONE :
case PATH_NONE :
break ;
break ;
}
}
* cp = ' \0 ' ;
return result ;
return str . data ;
} /* path_encode() */
} /* path_encode() */
/*-------------------------------------------------------------
/*-------------------------------------------------------------
@ -387,16 +353,11 @@ box_in(PG_FUNCTION_ARGS)
{
{
char * str = PG_GETARG_CSTRING ( 0 ) ;
char * str = PG_GETARG_CSTRING ( 0 ) ;
BOX * box = ( BOX * ) palloc ( sizeof ( BOX ) ) ;
BOX * box = ( BOX * ) palloc ( sizeof ( BOX ) ) ;
int isopen ;
bool isopen ;
char * s ;
double x ,
double x ,
y ;
y ;
if ( ( ! path_decode ( FALSE , 2 , str , & isopen , & s , & ( box - > high ) ) )
path_decode ( str , false , 2 , & ( box - > high ) , & isopen , NULL , " box " , str ) ;
| | ( * s ! = ' \0 ' ) )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type box: \" %s \" " , str ) ) ) ;
/* reorder corners if necessary... */
/* reorder corners if necessary... */
if ( box - > high . x < box - > low . x )
if ( box - > high . x < box - > low . x )
@ -935,43 +896,22 @@ box_diagonal(PG_FUNCTION_ARGS)
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static bool
static bool
line_decode ( const char * str , LINE * line )
line_decode ( char * s , const char * str , LINE * line )
{
{
char * tail ;
/* s was already advanced over leading '{' */
line - > A = single_decode ( s , & s , " line " , str ) ;
while ( isspace ( ( unsigned char ) * str ) )
if ( * s + + ! = DELIM )
str + + ;
if ( * str + + ! = ' { ' )
return false ;
line - > A = strtod ( str , & tail ) ;
if ( tail < = str )
return false ;
return false ;
str = tail ;
line - > B = single_decode ( s , & s , " line " , str ) ;
while ( isspace ( ( unsigned char ) * str ) )
if ( * s + + ! = DELIM )
str + + ;
if ( * str + + ! = DELIM )
return false ;
return false ;
line - > B = strtod ( str , & tail ) ;
line - > C = single_decode ( s , & s , " line " , str ) ;
if ( tail < = str )
if ( * s + + ! = ' } ' )
return false ;
return false ;
str = tail ;
while ( isspace ( ( unsigned char ) * s ) )
while ( isspace ( ( unsigned char ) * str ) )
s + + ;
str + + ;
if ( * s ! = ' \0 ' )
if ( * str + + ! = DELIM )
return false ;
line - > C = strtod ( str , & tail ) ;
if ( tail < = str )
return false ;
str = tail ;
while ( isspace ( ( unsigned char ) * str ) )
str + + ;
if ( * str + + ! = ' } ' )
return false ;
while ( isspace ( ( unsigned char ) * str ) )
str + + ;
if ( * str )
return false ;
return false ;
return true ;
return true ;
}
}
@ -979,33 +919,35 @@ Datum
line_in ( PG_FUNCTION_ARGS )
line_in ( PG_FUNCTION_ARGS )
{
{
char * str = PG_GETARG_CSTRING ( 0 ) ;
char * str = PG_GETARG_CSTRING ( 0 ) ;
LINE * line ;
LINE * line = ( LINE * ) palloc ( sizeof ( LINE ) ) ;
LSEG lseg ;
LSEG lseg ;
int isopen ;
bool isopen ;
char * s ;
char * s ;
line = ( LINE * ) palloc ( sizeof ( LINE ) ) ;
s = str ;
while ( isspace ( ( unsigned char ) * s ) )
if ( path_decode ( TRUE , 2 , str , & isopen , & s , & ( lseg . p [ 0 ] ) ) & & * s = = ' \0 ' )
s + + ;
if ( * s = = ' { ' )
{
{
if ( FPeq ( lseg . p [ 0 ] . x , lseg . p [ 1 ] . x ) & & FPeq ( lseg . p [ 0 ] . y , lseg . p [ 1 ] . y ) )
if ( ! line_decode ( s + 1 , str , line ) )
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid line specification: must be two distinct points " ) ) ) ;
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
" line " , str ) ) ) ;
line_construct_pts ( line , & lseg . p [ 0 ] , & lseg . p [ 1 ] ) ;
}
else if ( line_decode ( str , line ) )
{
if ( FPzero ( line - > A ) & & FPzero ( line - > B ) )
if ( FPzero ( line - > A ) & & FPzero ( line - > B ) )
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid line specification: A and B cannot both be zero " ) ) ) ;
errmsg ( " invalid line specification: A and B cannot both be zero " ) ) ) ;
}
}
else
else
{
path_decode ( s , true , 2 , & ( lseg . p [ 0 ] ) , & isopen , NULL , " line " , str ) ;
if ( FPeq ( lseg . p [ 0 ] . x , lseg . p [ 1 ] . x ) & & FPeq ( lseg . p [ 0 ] . y , lseg . p [ 1 ] . y ) )
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type line: \" %s \" " , str ) ) ) ;
errmsg ( " invalid line specification: must be two distinct points " ) ) ) ;
line_construct_pts ( line , & lseg . p [ 0 ] , & lseg . p [ 1 ] ) ;
}
PG_RETURN_LINE_P ( line ) ;
PG_RETURN_LINE_P ( line ) ;
}
}
@ -1015,12 +957,11 @@ Datum
line_out ( PG_FUNCTION_ARGS )
line_out ( PG_FUNCTION_ARGS )
{
{
LINE * line = PG_GETARG_LINE_P ( 0 ) ;
LINE * line = PG_GETARG_LINE_P ( 0 ) ;
int ndig = DBL_DIG + extra_float_digits ;
char * astr = float8out_internal ( line - > A ) ;
char * bstr = float8out_internal ( line - > B ) ;
if ( ndig < 1 )
char * cstr = float8out_internal ( line - > C ) ;
ndig = 1 ;
PG_RETURN_CSTRING ( psprintf ( " {%.*g,%.*g,%.*g} " , ndig , line - > A , ndig , line - > B , ndig , line - > C ) ) ;
PG_RETURN_CSTRING ( psprintf ( " {%s,%s,%s} " , astr , bstr , cstr ) ) ;
}
}
/*
/*
@ -1367,7 +1308,7 @@ path_in(PG_FUNCTION_ARGS)
{
{
char * str = PG_GETARG_CSTRING ( 0 ) ;
char * str = PG_GETARG_CSTRING ( 0 ) ;
PATH * path ;
PATH * path ;
int isopen ;
bool isopen ;
char * s ;
char * s ;
int npts ;
int npts ;
int size ;
int size ;
@ -1377,7 +1318,8 @@ path_in(PG_FUNCTION_ARGS)
if ( ( npts = pair_count ( str , ' , ' ) ) < = 0 )
if ( ( npts = pair_count ( str , ' , ' ) ) < = 0 )
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type path: \" %s \" " , str ) ) ) ;
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
" path " , str ) ) ) ;
s = str ;
s = str ;
while ( isspace ( ( unsigned char ) * s ) )
while ( isspace ( ( unsigned char ) * s ) )
@ -1404,11 +1346,23 @@ path_in(PG_FUNCTION_ARGS)
SET_VARSIZE ( path , size ) ;
SET_VARSIZE ( path , size ) ;
path - > npts = npts ;
path - > npts = npts ;
if ( ( ! path_decode ( TRUE , npts , s , & isopen , & s , & ( path - > p [ 0 ] ) ) )
path_decode ( s , true , npts , & ( path - > p [ 0 ] ) , & isopen , & s , " path " , str ) ;
& & ( ! ( ( depth = = 0 ) & & ( * s = = ' \0 ' ) ) ) & & ! ( ( depth > = 1 ) & & ( * s = = RDELIM ) ) )
if ( depth > = 1 )
{
if ( * s + + ! = RDELIM )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
" path " , str ) ) ) ;
while ( isspace ( ( unsigned char ) * s ) )
s + + ;
}
if ( * s ! = ' \0 ' )
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type path: \" %s \" " , str ) ) ) ;
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
" path " , str ) ) ) ;
path - > closed = ( ! isopen ) ;
path - > closed = ( ! isopen ) ;
/* prevent instability in unused pad bytes */
/* prevent instability in unused pad bytes */
@ -1782,21 +1736,9 @@ Datum
point_in ( PG_FUNCTION_ARGS )
point_in ( PG_FUNCTION_ARGS )
{
{
char * str = PG_GETARG_CSTRING ( 0 ) ;
char * str = PG_GETARG_CSTRING ( 0 ) ;
Point * point ;
Point * point = ( Point * ) palloc ( sizeof ( Point ) ) ;
double x ,
y ;
char * s ;
if ( ! pair_decode ( str , & x , & y , & s ) | | ( * s ! = ' \0 ' ) )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type point: \" %s \" " , str ) ) ) ;
point = ( Point * ) palloc ( sizeof ( Point ) ) ;
point - > x = x ;
point - > y = y ;
pair_decode ( str , & point - > x , & point - > y , NULL , " point " , str ) ;
PG_RETURN_POINT_P ( point ) ;
PG_RETURN_POINT_P ( point ) ;
}
}
@ -2008,18 +1950,10 @@ Datum
lseg_in ( PG_FUNCTION_ARGS )
lseg_in ( PG_FUNCTION_ARGS )
{
{
char * str = PG_GETARG_CSTRING ( 0 ) ;
char * str = PG_GETARG_CSTRING ( 0 ) ;
LSEG * lseg ;
LSEG * lseg = ( LSEG * ) palloc ( sizeof ( LSEG ) ) ;
int isopen ;
bool isopen ;
char * s ;
lseg = ( LSEG * ) palloc ( sizeof ( LSEG ) ) ;
if ( ( ! path_decode ( TRUE , 2 , str , & isopen , & s , & ( lseg - > p [ 0 ] ) ) )
| | ( * s ! = ' \0 ' ) )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type lseg: \" %s \" " , str ) ) ) ;
path_decode ( str , true , 2 , & ( lseg - > p [ 0 ] ) , & isopen , NULL , " lseg " , str ) ;
PG_RETURN_LSEG_P ( lseg ) ;
PG_RETURN_LSEG_P ( lseg ) ;
}
}
@ -3480,13 +3414,13 @@ poly_in(PG_FUNCTION_ARGS)
int npts ;
int npts ;
int size ;
int size ;
int base_size ;
int base_size ;
int isopen ;
bool isopen ;
char * s ;
if ( ( npts = pair_count ( str , ' , ' ) ) < = 0 )
if ( ( npts = pair_count ( str , ' , ' ) ) < = 0 )
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type polygon: \" %s \" " , str ) ) ) ;
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
" polygon " , str ) ) ) ;
base_size = sizeof ( poly - > p [ 0 ] ) * npts ;
base_size = sizeof ( poly - > p [ 0 ] ) * npts ;
size = offsetof ( POLYGON , p ) + base_size ;
size = offsetof ( POLYGON , p ) + base_size ;
@ -3502,11 +3436,7 @@ poly_in(PG_FUNCTION_ARGS)
SET_VARSIZE ( poly , size ) ;
SET_VARSIZE ( poly , size ) ;
poly - > npts = npts ;
poly - > npts = npts ;
if ( ( ! path_decode ( FALSE , npts , str , & isopen , & s , & ( poly - > p [ 0 ] ) ) )
path_decode ( str , false , npts , & ( poly - > p [ 0 ] ) , & isopen , NULL , " polygon " , str ) ;
| | ( * s ! = ' \0 ' ) )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type polygon: \" %s \" " , str ) ) ) ;
make_bound_box ( poly ) ;
make_bound_box ( poly ) ;
@ -4595,13 +4525,11 @@ Datum
circle_in ( PG_FUNCTION_ARGS )
circle_in ( PG_FUNCTION_ARGS )
{
{
char * str = PG_GETARG_CSTRING ( 0 ) ;
char * str = PG_GETARG_CSTRING ( 0 ) ;
CIRCLE * circle ;
CIRCLE * circle = ( CIRCLE * ) palloc ( sizeof ( CIRCLE ) ) ;
char * s ,
char * s ,
* cp ;
* cp ;
int depth = 0 ;
int depth = 0 ;
circle = ( CIRCLE * ) palloc ( sizeof ( CIRCLE ) ) ;
s = str ;
s = str ;
while ( isspace ( ( unsigned char ) * s ) )
while ( isspace ( ( unsigned char ) * s ) )
s + + ;
s + + ;
@ -4615,20 +4543,17 @@ circle_in(PG_FUNCTION_ARGS)
s = cp ;
s = cp ;
}
}
if ( ! pair_decode ( s , & circle - > center . x , & circle - > center . y , & s ) )
pair_decode ( s , & circle - > center . x , & circle - > center . y , & s , " circle " , str ) ;
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type circle: \" %s \" " , str ) ) ) ;
if ( * s = = DELIM )
if ( * s = = DELIM )
s + + ;
s + + ;
while ( isspace ( ( unsigned char ) * s ) )
s + + ;
if ( ( ! single_decode ( s , & circle - > radius , & s ) ) | | ( circle - > radius < 0 ) )
circle - > radius = single_decode ( s , & s , " circle " , str ) ;
if ( circle - > radius < 0 )
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type circle: \" %s \" " , str ) ) ) ;
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
" circle " , str ) ) ) ;
while ( depth > 0 )
while ( depth > 0 )
{
{
@ -4643,13 +4568,15 @@ circle_in(PG_FUNCTION_ARGS)
else
else
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type circle: \" %s \" " , str ) ) ) ;
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
" circle " , str ) ) ) ;
}
}
if ( * s ! = ' \0 ' )
if ( * s ! = ' \0 ' )
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
( errcode ( ERRCODE_INVALID_TEXT_REPRESENTATION ) ,
errmsg ( " invalid input syntax for type circle: \" %s \" " , str ) ) ) ;
errmsg ( " invalid input syntax for type %s: \" %s \" " ,
" circle " , str ) ) ) ;
PG_RETURN_CIRCLE_P ( circle ) ;
PG_RETURN_CIRCLE_P ( circle ) ;
}
}
@ -4660,32 +4587,19 @@ Datum
circle_out ( PG_FUNCTION_ARGS )
circle_out ( PG_FUNCTION_ARGS )
{
{
CIRCLE * circle = PG_GETARG_CIRCLE_P ( 0 ) ;
CIRCLE * circle = PG_GETARG_CIRCLE_P ( 0 ) ;
char * result ;
StringInfoData str ;
char * cp ;
result = palloc ( 2 * P_MAXLEN + 6 ) ;
initStringInfo ( & str ) ;
cp = result ;
* cp + + = LDELIM_C ;
* cp + + = LDELIM ;
if ( ! pair_encode ( circle - > center . x , circle - > center . y , cp ) )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
errmsg ( " could not format \" circle \" value " ) ) ) ;
cp + = strlen ( cp ) ;
* cp + + = RDELIM ;
* cp + + = DELIM ;
if ( ! single_encode ( circle - > radius , cp ) )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
errmsg ( " could not format \" circle \" value " ) ) ) ;
cp + = strlen ( cp ) ;
appendStringInfoChar ( & str , LDELIM_C ) ;
* cp + + = RDELIM_C ;
appendStringInfoChar ( & str , LDELIM ) ;
* cp = ' \0 ' ;
pair_encode ( circle - > center . x , circle - > center . y , & str ) ;
appendStringInfoChar ( & str , RDELIM ) ;
appendStringInfoChar ( & str , DELIM ) ;
single_encode ( circle - > radius , & str ) ;
appendStringInfoChar ( & str , RDELIM_C ) ;
PG_RETURN_CSTRING ( result ) ;
PG_RETURN_CSTRING ( str . data ) ;
}
}
/*
/*