|
|
|
@ -675,14 +675,14 @@ eantoobig: |
|
|
|
|
/*
|
|
|
|
|
* string2ean --- try to parse a string into an ean13. |
|
|
|
|
* |
|
|
|
|
* If errorOK is false, ereport a useful error message if the string is bad. |
|
|
|
|
* If errorOK is true, just return "false" for bad input. |
|
|
|
|
* ereturn false with a useful error message if the string is bad. |
|
|
|
|
* Otherwise return true. |
|
|
|
|
* |
|
|
|
|
* if the input string ends with '!' it will always be treated as invalid |
|
|
|
|
* (even if the check digit is valid) |
|
|
|
|
*/ |
|
|
|
|
static bool |
|
|
|
|
string2ean(const char *str, bool errorOK, ean13 *result, |
|
|
|
|
string2ean(const char *str, struct Node *escontext, ean13 *result, |
|
|
|
|
enum isn_type accept) |
|
|
|
|
{ |
|
|
|
|
bool digit, |
|
|
|
@ -876,48 +876,38 @@ eanbadcheck: |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!errorOK) |
|
|
|
|
{ |
|
|
|
|
if (rcheck == (unsigned) -1) |
|
|
|
|
{ |
|
|
|
|
ereport(ERROR, |
|
|
|
|
ereturn(escontext, false, |
|
|
|
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), |
|
|
|
|
errmsg("invalid %s number: \"%s\"", |
|
|
|
|
isn_names[accept], str))); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
ereport(ERROR, |
|
|
|
|
ereturn(escontext, false, |
|
|
|
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), |
|
|
|
|
errmsg("invalid check digit for %s number: \"%s\", should be %c", |
|
|
|
|
isn_names[accept], str, (rcheck == 10) ? ('X') : (rcheck + '0')))); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
eaninvalid: |
|
|
|
|
if (!errorOK) |
|
|
|
|
ereport(ERROR, |
|
|
|
|
ereturn(escontext, false, |
|
|
|
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), |
|
|
|
|
errmsg("invalid input syntax for %s number: \"%s\"", |
|
|
|
|
isn_names[accept], str))); |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
eanwrongtype: |
|
|
|
|
if (!errorOK) |
|
|
|
|
ereport(ERROR, |
|
|
|
|
ereturn(escontext, false, |
|
|
|
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), |
|
|
|
|
errmsg("cannot cast %s to %s for number: \"%s\"", |
|
|
|
|
isn_names[type], isn_names[accept], str))); |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
eantoobig: |
|
|
|
|
if (!errorOK) |
|
|
|
|
ereport(ERROR, |
|
|
|
|
ereturn(escontext, false, |
|
|
|
|
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), |
|
|
|
|
errmsg("value \"%s\" is out of range for %s type", |
|
|
|
|
str, isn_names[accept]))); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*----------------------------------------------------------
|
|
|
|
@ -952,7 +942,7 @@ isn_out(PG_FUNCTION_ARGS) |
|
|
|
|
char *result; |
|
|
|
|
char buf[MAXEAN13LEN + 1]; |
|
|
|
|
|
|
|
|
|
(void) ean2string(val, false, buf, true); |
|
|
|
|
(void) ean2string(val, fcinfo->context, buf, true); |
|
|
|
|
|
|
|
|
|
result = pstrdup(buf); |
|
|
|
|
PG_RETURN_CSTRING(result); |
|
|
|
@ -968,7 +958,7 @@ ean13_out(PG_FUNCTION_ARGS) |
|
|
|
|
char *result; |
|
|
|
|
char buf[MAXEAN13LEN + 1]; |
|
|
|
|
|
|
|
|
|
(void) ean2string(val, false, buf, false); |
|
|
|
|
(void) ean2string(val, fcinfo->context, buf, false); |
|
|
|
|
|
|
|
|
|
result = pstrdup(buf); |
|
|
|
|
PG_RETURN_CSTRING(result); |
|
|
|
@ -983,7 +973,8 @@ ean13_in(PG_FUNCTION_ARGS) |
|
|
|
|
const char *str = PG_GETARG_CSTRING(0); |
|
|
|
|
ean13 result; |
|
|
|
|
|
|
|
|
|
(void) string2ean(str, false, &result, EAN13); |
|
|
|
|
if (!string2ean(str, fcinfo->context, &result, EAN13)) |
|
|
|
|
PG_RETURN_NULL(); |
|
|
|
|
PG_RETURN_EAN13(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -996,7 +987,8 @@ isbn_in(PG_FUNCTION_ARGS) |
|
|
|
|
const char *str = PG_GETARG_CSTRING(0); |
|
|
|
|
ean13 result; |
|
|
|
|
|
|
|
|
|
(void) string2ean(str, false, &result, ISBN); |
|
|
|
|
if (!string2ean(str, fcinfo->context, &result, ISBN)) |
|
|
|
|
PG_RETURN_NULL(); |
|
|
|
|
PG_RETURN_EAN13(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1009,7 +1001,8 @@ ismn_in(PG_FUNCTION_ARGS) |
|
|
|
|
const char *str = PG_GETARG_CSTRING(0); |
|
|
|
|
ean13 result; |
|
|
|
|
|
|
|
|
|
(void) string2ean(str, false, &result, ISMN); |
|
|
|
|
if (!string2ean(str, fcinfo->context, &result, ISMN)) |
|
|
|
|
PG_RETURN_NULL(); |
|
|
|
|
PG_RETURN_EAN13(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1022,7 +1015,8 @@ issn_in(PG_FUNCTION_ARGS) |
|
|
|
|
const char *str = PG_GETARG_CSTRING(0); |
|
|
|
|
ean13 result; |
|
|
|
|
|
|
|
|
|
(void) string2ean(str, false, &result, ISSN); |
|
|
|
|
if (!string2ean(str, fcinfo->context, &result, ISSN)) |
|
|
|
|
PG_RETURN_NULL(); |
|
|
|
|
PG_RETURN_EAN13(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1035,7 +1029,8 @@ upc_in(PG_FUNCTION_ARGS) |
|
|
|
|
const char *str = PG_GETARG_CSTRING(0); |
|
|
|
|
ean13 result; |
|
|
|
|
|
|
|
|
|
(void) string2ean(str, false, &result, UPC); |
|
|
|
|
if (!string2ean(str, fcinfo->context, &result, UPC)) |
|
|
|
|
PG_RETURN_NULL(); |
|
|
|
|
PG_RETURN_EAN13(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|