Move ctype library into separate module
This commit is contained in:
parent
9313276e09
commit
d9507216cb
517
engine/builtin.c
517
engine/builtin.c
@ -5984,511 +5984,6 @@ static int PH7_builtin_parse_ini_string(ph7_context *pCtx, int nArg, ph7_value *
|
|||||||
PH7_ParseIniString(pCtx, zIni, (sxu32)nByte, (nArg > 1) ? ph7_value_to_bool(apArg[1]) : 0);
|
PH7_ParseIniString(pCtx, zIni, (sxu32)nByte, (nArg > 1) ? ph7_value_to_bool(apArg[1]) : 0);
|
||||||
return PH7_OK;
|
return PH7_OK;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* Ctype Functions.
|
|
||||||
* Authors:
|
|
||||||
* Symisc Systems,devel@symisc.net.
|
|
||||||
* Copyright (C) Symisc Systems,http://ph7.symisc.net
|
|
||||||
* Status:
|
|
||||||
* Stable.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* bool ctype_alnum(string $text)
|
|
||||||
* Checks if all of the characters in the provided string, text, are alphanumeric.
|
|
||||||
* Parameters
|
|
||||||
* $text
|
|
||||||
* The tested string.
|
|
||||||
* Return
|
|
||||||
* TRUE if every character in text is either a letter or a digit, FALSE otherwise.
|
|
||||||
*/
|
|
||||||
static int PH7_builtin_ctype_alnum(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
|
||||||
const unsigned char *zIn, *zEnd;
|
|
||||||
int nLen;
|
|
||||||
if(nArg < 1) {
|
|
||||||
/* Missing arguments,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Extract the target string */
|
|
||||||
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
|
||||||
zEnd = &zIn[nLen];
|
|
||||||
if(nLen < 1) {
|
|
||||||
/* Empty string,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Perform the requested operation */
|
|
||||||
for(;;) {
|
|
||||||
if(zIn >= zEnd) {
|
|
||||||
/* If we reach the end of the string,then the test succeeded. */
|
|
||||||
ph7_result_bool(pCtx, 1);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
if(!SyisAlphaNum(zIn[0])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Point to the next character */
|
|
||||||
zIn++;
|
|
||||||
}
|
|
||||||
/* The test failed,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* bool ctype_alpha(string $text)
|
|
||||||
* Checks if all of the characters in the provided string, text, are alphabetic.
|
|
||||||
* Parameters
|
|
||||||
* $text
|
|
||||||
* The tested string.
|
|
||||||
* Return
|
|
||||||
* TRUE if every character in text is a letter from the current locale, FALSE otherwise.
|
|
||||||
*/
|
|
||||||
static int PH7_builtin_ctype_alpha(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
|
||||||
const unsigned char *zIn, *zEnd;
|
|
||||||
int nLen;
|
|
||||||
if(nArg < 1) {
|
|
||||||
/* Missing arguments,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Extract the target string */
|
|
||||||
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
|
||||||
zEnd = &zIn[nLen];
|
|
||||||
if(nLen < 1) {
|
|
||||||
/* Empty string,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Perform the requested operation */
|
|
||||||
for(;;) {
|
|
||||||
if(zIn >= zEnd) {
|
|
||||||
/* If we reach the end of the string,then the test succeeded. */
|
|
||||||
ph7_result_bool(pCtx, 1);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
if(!SyisAlpha(zIn[0])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Point to the next character */
|
|
||||||
zIn++;
|
|
||||||
}
|
|
||||||
/* The test failed,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* bool ctype_cntrl(string $text)
|
|
||||||
* Checks if all of the characters in the provided string, text, are control characters.
|
|
||||||
* Parameters
|
|
||||||
* $text
|
|
||||||
* The tested string.
|
|
||||||
* Return
|
|
||||||
* TRUE if every character in text is a control characters,FALSE otherwise.
|
|
||||||
*/
|
|
||||||
static int PH7_builtin_ctype_cntrl(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
|
||||||
const unsigned char *zIn, *zEnd;
|
|
||||||
int nLen;
|
|
||||||
if(nArg < 1) {
|
|
||||||
/* Missing arguments,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Extract the target string */
|
|
||||||
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
|
||||||
zEnd = &zIn[nLen];
|
|
||||||
if(nLen < 1) {
|
|
||||||
/* Empty string,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Perform the requested operation */
|
|
||||||
for(;;) {
|
|
||||||
if(zIn >= zEnd) {
|
|
||||||
/* If we reach the end of the string,then the test succeeded. */
|
|
||||||
ph7_result_bool(pCtx, 1);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
if(zIn[0] >= 0xc0) {
|
|
||||||
/* UTF-8 stream */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(!SyisCtrl(zIn[0])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Point to the next character */
|
|
||||||
zIn++;
|
|
||||||
}
|
|
||||||
/* The test failed,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* bool ctype_digit(string $text)
|
|
||||||
* Checks if all of the characters in the provided string, text, are numerical.
|
|
||||||
* Parameters
|
|
||||||
* $text
|
|
||||||
* The tested string.
|
|
||||||
* Return
|
|
||||||
* TRUE if every character in the string text is a decimal digit, FALSE otherwise.
|
|
||||||
*/
|
|
||||||
static int PH7_builtin_ctype_digit(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
|
||||||
const unsigned char *zIn, *zEnd;
|
|
||||||
int nLen;
|
|
||||||
if(nArg < 1) {
|
|
||||||
/* Missing arguments,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Extract the target string */
|
|
||||||
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
|
||||||
zEnd = &zIn[nLen];
|
|
||||||
if(nLen < 1) {
|
|
||||||
/* Empty string,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Perform the requested operation */
|
|
||||||
for(;;) {
|
|
||||||
if(zIn >= zEnd) {
|
|
||||||
/* If we reach the end of the string,then the test succeeded. */
|
|
||||||
ph7_result_bool(pCtx, 1);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
if(zIn[0] >= 0xc0) {
|
|
||||||
/* UTF-8 stream */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(!SyisDigit(zIn[0])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Point to the next character */
|
|
||||||
zIn++;
|
|
||||||
}
|
|
||||||
/* The test failed,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* bool ctype_xdigit(string $text)
|
|
||||||
* Check for character(s) representing a hexadecimal digit.
|
|
||||||
* Parameters
|
|
||||||
* $text
|
|
||||||
* The tested string.
|
|
||||||
* Return
|
|
||||||
* Returns TRUE if every character in text is a hexadecimal 'digit', that is
|
|
||||||
* a decimal digit or a character from [A-Fa-f] , FALSE otherwise.
|
|
||||||
*/
|
|
||||||
static int PH7_builtin_ctype_xdigit(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
|
||||||
const unsigned char *zIn, *zEnd;
|
|
||||||
int nLen;
|
|
||||||
if(nArg < 1) {
|
|
||||||
/* Missing arguments,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Extract the target string */
|
|
||||||
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
|
||||||
zEnd = &zIn[nLen];
|
|
||||||
if(nLen < 1) {
|
|
||||||
/* Empty string,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Perform the requested operation */
|
|
||||||
for(;;) {
|
|
||||||
if(zIn >= zEnd) {
|
|
||||||
/* If we reach the end of the string,then the test succeeded. */
|
|
||||||
ph7_result_bool(pCtx, 1);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
if(zIn[0] >= 0xc0) {
|
|
||||||
/* UTF-8 stream */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(!SyisHex(zIn[0])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Point to the next character */
|
|
||||||
zIn++;
|
|
||||||
}
|
|
||||||
/* The test failed,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* bool ctype_graph(string $text)
|
|
||||||
* Checks if all of the characters in the provided string, text, creates visible output.
|
|
||||||
* Parameters
|
|
||||||
* $text
|
|
||||||
* The tested string.
|
|
||||||
* Return
|
|
||||||
* Returns TRUE if every character in text is printable and actually creates visible output
|
|
||||||
* (no white space), FALSE otherwise.
|
|
||||||
*/
|
|
||||||
static int PH7_builtin_ctype_graph(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
|
||||||
const unsigned char *zIn, *zEnd;
|
|
||||||
int nLen;
|
|
||||||
if(nArg < 1) {
|
|
||||||
/* Missing arguments,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Extract the target string */
|
|
||||||
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
|
||||||
zEnd = &zIn[nLen];
|
|
||||||
if(nLen < 1) {
|
|
||||||
/* Empty string,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Perform the requested operation */
|
|
||||||
for(;;) {
|
|
||||||
if(zIn >= zEnd) {
|
|
||||||
/* If we reach the end of the string,then the test succeeded. */
|
|
||||||
ph7_result_bool(pCtx, 1);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
if(zIn[0] >= 0xc0) {
|
|
||||||
/* UTF-8 stream */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(!SyisGraph(zIn[0])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Point to the next character */
|
|
||||||
zIn++;
|
|
||||||
}
|
|
||||||
/* The test failed,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* bool ctype_print(string $text)
|
|
||||||
* Checks if all of the characters in the provided string, text, are printable.
|
|
||||||
* Parameters
|
|
||||||
* $text
|
|
||||||
* The tested string.
|
|
||||||
* Return
|
|
||||||
* Returns TRUE if every character in text will actually create output (including blanks).
|
|
||||||
* Returns FALSE if text contains control characters or characters that do not have any output
|
|
||||||
* or control function at all.
|
|
||||||
*/
|
|
||||||
static int PH7_builtin_ctype_print(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
|
||||||
const unsigned char *zIn, *zEnd;
|
|
||||||
int nLen;
|
|
||||||
if(nArg < 1) {
|
|
||||||
/* Missing arguments,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Extract the target string */
|
|
||||||
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
|
||||||
zEnd = &zIn[nLen];
|
|
||||||
if(nLen < 1) {
|
|
||||||
/* Empty string,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Perform the requested operation */
|
|
||||||
for(;;) {
|
|
||||||
if(zIn >= zEnd) {
|
|
||||||
/* If we reach the end of the string,then the test succeeded. */
|
|
||||||
ph7_result_bool(pCtx, 1);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
if(zIn[0] >= 0xc0) {
|
|
||||||
/* UTF-8 stream */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(!SyisPrint(zIn[0])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Point to the next character */
|
|
||||||
zIn++;
|
|
||||||
}
|
|
||||||
/* The test failed,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* bool ctype_punct(string $text)
|
|
||||||
* Checks if all of the characters in the provided string, text, are punctuation character.
|
|
||||||
* Parameters
|
|
||||||
* $text
|
|
||||||
* The tested string.
|
|
||||||
* Return
|
|
||||||
* Returns TRUE if every character in text is printable, but neither letter
|
|
||||||
* digit or blank, FALSE otherwise.
|
|
||||||
*/
|
|
||||||
static int PH7_builtin_ctype_punct(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
|
||||||
const unsigned char *zIn, *zEnd;
|
|
||||||
int nLen;
|
|
||||||
if(nArg < 1) {
|
|
||||||
/* Missing arguments,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Extract the target string */
|
|
||||||
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
|
||||||
zEnd = &zIn[nLen];
|
|
||||||
if(nLen < 1) {
|
|
||||||
/* Empty string,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Perform the requested operation */
|
|
||||||
for(;;) {
|
|
||||||
if(zIn >= zEnd) {
|
|
||||||
/* If we reach the end of the string,then the test succeeded. */
|
|
||||||
ph7_result_bool(pCtx, 1);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
if(zIn[0] >= 0xc0) {
|
|
||||||
/* UTF-8 stream */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(!SyisPunct(zIn[0])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Point to the next character */
|
|
||||||
zIn++;
|
|
||||||
}
|
|
||||||
/* The test failed,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* bool ctype_space(string $text)
|
|
||||||
* Checks if all of the characters in the provided string, text, creates whitespace.
|
|
||||||
* Parameters
|
|
||||||
* $text
|
|
||||||
* The tested string.
|
|
||||||
* Return
|
|
||||||
* Returns TRUE if every character in text creates some sort of white space, FALSE otherwise.
|
|
||||||
* Besides the blank character this also includes tab, vertical tab, line feed, carriage return
|
|
||||||
* and form feed characters.
|
|
||||||
*/
|
|
||||||
static int PH7_builtin_ctype_space(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
|
||||||
const unsigned char *zIn, *zEnd;
|
|
||||||
int nLen;
|
|
||||||
if(nArg < 1) {
|
|
||||||
/* Missing arguments,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Extract the target string */
|
|
||||||
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
|
||||||
zEnd = &zIn[nLen];
|
|
||||||
if(nLen < 1) {
|
|
||||||
/* Empty string,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Perform the requested operation */
|
|
||||||
for(;;) {
|
|
||||||
if(zIn >= zEnd) {
|
|
||||||
/* If we reach the end of the string,then the test succeeded. */
|
|
||||||
ph7_result_bool(pCtx, 1);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
if(zIn[0] >= 0xc0) {
|
|
||||||
/* UTF-8 stream */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(!SyisSpace(zIn[0])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Point to the next character */
|
|
||||||
zIn++;
|
|
||||||
}
|
|
||||||
/* The test failed,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* bool ctype_lower(string $text)
|
|
||||||
* Checks if all of the characters in the provided string, text, are lowercase letters.
|
|
||||||
* Parameters
|
|
||||||
* $text
|
|
||||||
* The tested string.
|
|
||||||
* Return
|
|
||||||
* Returns TRUE if every character in text is a lowercase letter in the current locale.
|
|
||||||
*/
|
|
||||||
static int PH7_builtin_ctype_lower(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
|
||||||
const unsigned char *zIn, *zEnd;
|
|
||||||
int nLen;
|
|
||||||
if(nArg < 1) {
|
|
||||||
/* Missing arguments,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Extract the target string */
|
|
||||||
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
|
||||||
zEnd = &zIn[nLen];
|
|
||||||
if(nLen < 1) {
|
|
||||||
/* Empty string,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Perform the requested operation */
|
|
||||||
for(;;) {
|
|
||||||
if(zIn >= zEnd) {
|
|
||||||
/* If we reach the end of the string,then the test succeeded. */
|
|
||||||
ph7_result_bool(pCtx, 1);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
if(!SyisLower(zIn[0])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Point to the next character */
|
|
||||||
zIn++;
|
|
||||||
}
|
|
||||||
/* The test failed,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* bool ctype_upper(string $text)
|
|
||||||
* Checks if all of the characters in the provided string, text, are uppercase letters.
|
|
||||||
* Parameters
|
|
||||||
* $text
|
|
||||||
* The tested string.
|
|
||||||
* Return
|
|
||||||
* Returns TRUE if every character in text is a uppercase letter in the current locale.
|
|
||||||
*/
|
|
||||||
static int PH7_builtin_ctype_upper(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
|
||||||
const unsigned char *zIn, *zEnd;
|
|
||||||
int nLen;
|
|
||||||
if(nArg < 1) {
|
|
||||||
/* Missing arguments,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Extract the target string */
|
|
||||||
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
|
||||||
zEnd = &zIn[nLen];
|
|
||||||
if(nLen < 1) {
|
|
||||||
/* Empty string,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/* Perform the requested operation */
|
|
||||||
for(;;) {
|
|
||||||
if(zIn >= zEnd) {
|
|
||||||
/* If we reach the end of the string,then the test succeeded. */
|
|
||||||
ph7_result_bool(pCtx, 1);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
if(!SyisUpper(zIn[0])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Point to the next character */
|
|
||||||
zIn++;
|
|
||||||
}
|
|
||||||
/* The test failed,return FALSE */
|
|
||||||
ph7_result_bool(pCtx, 0);
|
|
||||||
return PH7_OK;
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* Date/Time functions
|
* Date/Time functions
|
||||||
* Authors:
|
* Authors:
|
||||||
@ -8098,18 +7593,6 @@ static const ph7_builtin_func aBuiltInFunc[] = {
|
|||||||
{ "str_ireplace", PH7_builtin_str_replace},
|
{ "str_ireplace", PH7_builtin_str_replace},
|
||||||
{ "strtr", PH7_builtin_strtr },
|
{ "strtr", PH7_builtin_strtr },
|
||||||
{ "parse_ini_string", PH7_builtin_parse_ini_string},
|
{ "parse_ini_string", PH7_builtin_parse_ini_string},
|
||||||
/* Ctype functions */
|
|
||||||
{ "ctype_alnum", PH7_builtin_ctype_alnum },
|
|
||||||
{ "ctype_alpha", PH7_builtin_ctype_alpha },
|
|
||||||
{ "ctype_cntrl", PH7_builtin_ctype_cntrl },
|
|
||||||
{ "ctype_digit", PH7_builtin_ctype_digit },
|
|
||||||
{ "ctype_xdigit", PH7_builtin_ctype_xdigit},
|
|
||||||
{ "ctype_graph", PH7_builtin_ctype_graph },
|
|
||||||
{ "ctype_print", PH7_builtin_ctype_print },
|
|
||||||
{ "ctype_punct", PH7_builtin_ctype_punct },
|
|
||||||
{ "ctype_space", PH7_builtin_ctype_space },
|
|
||||||
{ "ctype_lower", PH7_builtin_ctype_lower },
|
|
||||||
{ "ctype_upper", PH7_builtin_ctype_upper },
|
|
||||||
/* Time functions */
|
/* Time functions */
|
||||||
{ "time", PH7_builtin_time },
|
{ "time", PH7_builtin_time },
|
||||||
{ "microtime", PH7_builtin_microtime },
|
{ "microtime", PH7_builtin_microtime },
|
||||||
|
513
modules/ctype/ctype.c
Normal file
513
modules/ctype/ctype.c
Normal file
@ -0,0 +1,513 @@
|
|||||||
|
#include "ctype.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bool ctype_alnum(string $text)
|
||||||
|
* Checks if all of the characters in the provided string, text, are alphanumeric.
|
||||||
|
* Parameters
|
||||||
|
* $text
|
||||||
|
* The tested string.
|
||||||
|
* Return
|
||||||
|
* TRUE if every character in text is either a letter or a digit, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
static int PH7_builtin_ctype_alnum(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
||||||
|
const unsigned char *zIn, *zEnd;
|
||||||
|
int nLen;
|
||||||
|
if(nArg < 1) {
|
||||||
|
/* Missing arguments,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Extract the target string */
|
||||||
|
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
||||||
|
zEnd = &zIn[nLen];
|
||||||
|
if(nLen < 1) {
|
||||||
|
/* Empty string,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Perform the requested operation */
|
||||||
|
for(;;) {
|
||||||
|
if(zIn >= zEnd) {
|
||||||
|
/* If we reach the end of the string,then the test succeeded. */
|
||||||
|
ph7_result_bool(pCtx, 1);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
if(!SyisAlphaNum(zIn[0])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Point to the next character */
|
||||||
|
zIn++;
|
||||||
|
}
|
||||||
|
/* The test failed,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* bool ctype_alpha(string $text)
|
||||||
|
* Checks if all of the characters in the provided string, text, are alphabetic.
|
||||||
|
* Parameters
|
||||||
|
* $text
|
||||||
|
* The tested string.
|
||||||
|
* Return
|
||||||
|
* TRUE if every character in text is a letter from the current locale, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
static int PH7_builtin_ctype_alpha(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
||||||
|
const unsigned char *zIn, *zEnd;
|
||||||
|
int nLen;
|
||||||
|
if(nArg < 1) {
|
||||||
|
/* Missing arguments,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Extract the target string */
|
||||||
|
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
||||||
|
zEnd = &zIn[nLen];
|
||||||
|
if(nLen < 1) {
|
||||||
|
/* Empty string,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Perform the requested operation */
|
||||||
|
for(;;) {
|
||||||
|
if(zIn >= zEnd) {
|
||||||
|
/* If we reach the end of the string,then the test succeeded. */
|
||||||
|
ph7_result_bool(pCtx, 1);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
if(!SyisAlpha(zIn[0])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Point to the next character */
|
||||||
|
zIn++;
|
||||||
|
}
|
||||||
|
/* The test failed,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* bool ctype_cntrl(string $text)
|
||||||
|
* Checks if all of the characters in the provided string, text, are control characters.
|
||||||
|
* Parameters
|
||||||
|
* $text
|
||||||
|
* The tested string.
|
||||||
|
* Return
|
||||||
|
* TRUE if every character in text is a control characters,FALSE otherwise.
|
||||||
|
*/
|
||||||
|
static int PH7_builtin_ctype_cntrl(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
||||||
|
const unsigned char *zIn, *zEnd;
|
||||||
|
int nLen;
|
||||||
|
if(nArg < 1) {
|
||||||
|
/* Missing arguments,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Extract the target string */
|
||||||
|
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
||||||
|
zEnd = &zIn[nLen];
|
||||||
|
if(nLen < 1) {
|
||||||
|
/* Empty string,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Perform the requested operation */
|
||||||
|
for(;;) {
|
||||||
|
if(zIn >= zEnd) {
|
||||||
|
/* If we reach the end of the string,then the test succeeded. */
|
||||||
|
ph7_result_bool(pCtx, 1);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
if(zIn[0] >= 0xc0) {
|
||||||
|
/* UTF-8 stream */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!SyisCtrl(zIn[0])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Point to the next character */
|
||||||
|
zIn++;
|
||||||
|
}
|
||||||
|
/* The test failed,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* bool ctype_digit(string $text)
|
||||||
|
* Checks if all of the characters in the provided string, text, are numerical.
|
||||||
|
* Parameters
|
||||||
|
* $text
|
||||||
|
* The tested string.
|
||||||
|
* Return
|
||||||
|
* TRUE if every character in the string text is a decimal digit, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
static int PH7_builtin_ctype_digit(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
||||||
|
const unsigned char *zIn, *zEnd;
|
||||||
|
int nLen;
|
||||||
|
if(nArg < 1) {
|
||||||
|
/* Missing arguments,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Extract the target string */
|
||||||
|
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
||||||
|
zEnd = &zIn[nLen];
|
||||||
|
if(nLen < 1) {
|
||||||
|
/* Empty string,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Perform the requested operation */
|
||||||
|
for(;;) {
|
||||||
|
if(zIn >= zEnd) {
|
||||||
|
/* If we reach the end of the string,then the test succeeded. */
|
||||||
|
ph7_result_bool(pCtx, 1);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
if(zIn[0] >= 0xc0) {
|
||||||
|
/* UTF-8 stream */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!SyisDigit(zIn[0])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Point to the next character */
|
||||||
|
zIn++;
|
||||||
|
}
|
||||||
|
/* The test failed,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* bool ctype_xdigit(string $text)
|
||||||
|
* Check for character(s) representing a hexadecimal digit.
|
||||||
|
* Parameters
|
||||||
|
* $text
|
||||||
|
* The tested string.
|
||||||
|
* Return
|
||||||
|
* Returns TRUE if every character in text is a hexadecimal 'digit', that is
|
||||||
|
* a decimal digit or a character from [A-Fa-f] , FALSE otherwise.
|
||||||
|
*/
|
||||||
|
static int PH7_builtin_ctype_xdigit(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
||||||
|
const unsigned char *zIn, *zEnd;
|
||||||
|
int nLen;
|
||||||
|
if(nArg < 1) {
|
||||||
|
/* Missing arguments,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Extract the target string */
|
||||||
|
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
||||||
|
zEnd = &zIn[nLen];
|
||||||
|
if(nLen < 1) {
|
||||||
|
/* Empty string,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Perform the requested operation */
|
||||||
|
for(;;) {
|
||||||
|
if(zIn >= zEnd) {
|
||||||
|
/* If we reach the end of the string,then the test succeeded. */
|
||||||
|
ph7_result_bool(pCtx, 1);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
if(zIn[0] >= 0xc0) {
|
||||||
|
/* UTF-8 stream */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!SyisHex(zIn[0])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Point to the next character */
|
||||||
|
zIn++;
|
||||||
|
}
|
||||||
|
/* The test failed,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* bool ctype_graph(string $text)
|
||||||
|
* Checks if all of the characters in the provided string, text, creates visible output.
|
||||||
|
* Parameters
|
||||||
|
* $text
|
||||||
|
* The tested string.
|
||||||
|
* Return
|
||||||
|
* Returns TRUE if every character in text is printable and actually creates visible output
|
||||||
|
* (no white space), FALSE otherwise.
|
||||||
|
*/
|
||||||
|
static int PH7_builtin_ctype_graph(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
||||||
|
const unsigned char *zIn, *zEnd;
|
||||||
|
int nLen;
|
||||||
|
if(nArg < 1) {
|
||||||
|
/* Missing arguments,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Extract the target string */
|
||||||
|
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
||||||
|
zEnd = &zIn[nLen];
|
||||||
|
if(nLen < 1) {
|
||||||
|
/* Empty string,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Perform the requested operation */
|
||||||
|
for(;;) {
|
||||||
|
if(zIn >= zEnd) {
|
||||||
|
/* If we reach the end of the string,then the test succeeded. */
|
||||||
|
ph7_result_bool(pCtx, 1);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
if(zIn[0] >= 0xc0) {
|
||||||
|
/* UTF-8 stream */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!SyisGraph(zIn[0])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Point to the next character */
|
||||||
|
zIn++;
|
||||||
|
}
|
||||||
|
/* The test failed,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* bool ctype_print(string $text)
|
||||||
|
* Checks if all of the characters in the provided string, text, are printable.
|
||||||
|
* Parameters
|
||||||
|
* $text
|
||||||
|
* The tested string.
|
||||||
|
* Return
|
||||||
|
* Returns TRUE if every character in text will actually create output (including blanks).
|
||||||
|
* Returns FALSE if text contains control characters or characters that do not have any output
|
||||||
|
* or control function at all.
|
||||||
|
*/
|
||||||
|
static int PH7_builtin_ctype_print(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
||||||
|
const unsigned char *zIn, *zEnd;
|
||||||
|
int nLen;
|
||||||
|
if(nArg < 1) {
|
||||||
|
/* Missing arguments,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Extract the target string */
|
||||||
|
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
||||||
|
zEnd = &zIn[nLen];
|
||||||
|
if(nLen < 1) {
|
||||||
|
/* Empty string,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Perform the requested operation */
|
||||||
|
for(;;) {
|
||||||
|
if(zIn >= zEnd) {
|
||||||
|
/* If we reach the end of the string,then the test succeeded. */
|
||||||
|
ph7_result_bool(pCtx, 1);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
if(zIn[0] >= 0xc0) {
|
||||||
|
/* UTF-8 stream */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!SyisPrint(zIn[0])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Point to the next character */
|
||||||
|
zIn++;
|
||||||
|
}
|
||||||
|
/* The test failed,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* bool ctype_punct(string $text)
|
||||||
|
* Checks if all of the characters in the provided string, text, are punctuation character.
|
||||||
|
* Parameters
|
||||||
|
* $text
|
||||||
|
* The tested string.
|
||||||
|
* Return
|
||||||
|
* Returns TRUE if every character in text is printable, but neither letter
|
||||||
|
* digit or blank, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
static int PH7_builtin_ctype_punct(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
||||||
|
const unsigned char *zIn, *zEnd;
|
||||||
|
int nLen;
|
||||||
|
if(nArg < 1) {
|
||||||
|
/* Missing arguments,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Extract the target string */
|
||||||
|
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
||||||
|
zEnd = &zIn[nLen];
|
||||||
|
if(nLen < 1) {
|
||||||
|
/* Empty string,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Perform the requested operation */
|
||||||
|
for(;;) {
|
||||||
|
if(zIn >= zEnd) {
|
||||||
|
/* If we reach the end of the string,then the test succeeded. */
|
||||||
|
ph7_result_bool(pCtx, 1);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
if(zIn[0] >= 0xc0) {
|
||||||
|
/* UTF-8 stream */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!SyisPunct(zIn[0])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Point to the next character */
|
||||||
|
zIn++;
|
||||||
|
}
|
||||||
|
/* The test failed,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* bool ctype_space(string $text)
|
||||||
|
* Checks if all of the characters in the provided string, text, creates whitespace.
|
||||||
|
* Parameters
|
||||||
|
* $text
|
||||||
|
* The tested string.
|
||||||
|
* Return
|
||||||
|
* Returns TRUE if every character in text creates some sort of white space, FALSE otherwise.
|
||||||
|
* Besides the blank character this also includes tab, vertical tab, line feed, carriage return
|
||||||
|
* and form feed characters.
|
||||||
|
*/
|
||||||
|
static int PH7_builtin_ctype_space(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
||||||
|
const unsigned char *zIn, *zEnd;
|
||||||
|
int nLen;
|
||||||
|
if(nArg < 1) {
|
||||||
|
/* Missing arguments,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Extract the target string */
|
||||||
|
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
||||||
|
zEnd = &zIn[nLen];
|
||||||
|
if(nLen < 1) {
|
||||||
|
/* Empty string,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Perform the requested operation */
|
||||||
|
for(;;) {
|
||||||
|
if(zIn >= zEnd) {
|
||||||
|
/* If we reach the end of the string,then the test succeeded. */
|
||||||
|
ph7_result_bool(pCtx, 1);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
if(zIn[0] >= 0xc0) {
|
||||||
|
/* UTF-8 stream */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!SyisSpace(zIn[0])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Point to the next character */
|
||||||
|
zIn++;
|
||||||
|
}
|
||||||
|
/* The test failed,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* bool ctype_lower(string $text)
|
||||||
|
* Checks if all of the characters in the provided string, text, are lowercase letters.
|
||||||
|
* Parameters
|
||||||
|
* $text
|
||||||
|
* The tested string.
|
||||||
|
* Return
|
||||||
|
* Returns TRUE if every character in text is a lowercase letter in the current locale.
|
||||||
|
*/
|
||||||
|
static int PH7_builtin_ctype_lower(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
||||||
|
const unsigned char *zIn, *zEnd;
|
||||||
|
int nLen;
|
||||||
|
if(nArg < 1) {
|
||||||
|
/* Missing arguments,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Extract the target string */
|
||||||
|
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
||||||
|
zEnd = &zIn[nLen];
|
||||||
|
if(nLen < 1) {
|
||||||
|
/* Empty string,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Perform the requested operation */
|
||||||
|
for(;;) {
|
||||||
|
if(zIn >= zEnd) {
|
||||||
|
/* If we reach the end of the string,then the test succeeded. */
|
||||||
|
ph7_result_bool(pCtx, 1);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
if(!SyisLower(zIn[0])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Point to the next character */
|
||||||
|
zIn++;
|
||||||
|
}
|
||||||
|
/* The test failed,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* bool ctype_upper(string $text)
|
||||||
|
* Checks if all of the characters in the provided string, text, are uppercase letters.
|
||||||
|
* Parameters
|
||||||
|
* $text
|
||||||
|
* The tested string.
|
||||||
|
* Return
|
||||||
|
* Returns TRUE if every character in text is a uppercase letter in the current locale.
|
||||||
|
*/
|
||||||
|
static int PH7_builtin_ctype_upper(ph7_context *pCtx, int nArg, ph7_value **apArg) {
|
||||||
|
const unsigned char *zIn, *zEnd;
|
||||||
|
int nLen;
|
||||||
|
if(nArg < 1) {
|
||||||
|
/* Missing arguments,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Extract the target string */
|
||||||
|
zIn = (const unsigned char *)ph7_value_to_string(apArg[0], &nLen);
|
||||||
|
zEnd = &zIn[nLen];
|
||||||
|
if(nLen < 1) {
|
||||||
|
/* Empty string,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
/* Perform the requested operation */
|
||||||
|
for(;;) {
|
||||||
|
if(zIn >= zEnd) {
|
||||||
|
/* If we reach the end of the string,then the test succeeded. */
|
||||||
|
ph7_result_bool(pCtx, 1);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
if(!SyisUpper(zIn[0])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Point to the next character */
|
||||||
|
zIn++;
|
||||||
|
}
|
||||||
|
/* The test failed,return FALSE */
|
||||||
|
ph7_result_bool(pCtx, 0);
|
||||||
|
return PH7_OK;
|
||||||
|
}
|
||||||
|
PH7_PRIVATE sxi32 initializeModule(ph7_vm *pVm, ph7_real *ver, SyString *desc) {
|
||||||
|
sxi32 rc;
|
||||||
|
sxu32 n;
|
||||||
|
|
||||||
|
desc->zString = MODULE_DESC;
|
||||||
|
*ver = MODULE_VER;
|
||||||
|
for(n = 0; n < SX_ARRAYSIZE(ctypeFuncList); ++n) {
|
||||||
|
rc = ph7_create_function(&(*pVm), ctypeFuncList[n].zName, ctypeFuncList[n].xFunc, &(*pVm));
|
||||||
|
if(rc != SXRET_OK) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return SXRET_OK;
|
||||||
|
}
|
38
modules/ctype/ctype.h
Normal file
38
modules/ctype/ctype.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#ifndef __CTYPE_H__
|
||||||
|
#define __CTYPE_H__
|
||||||
|
|
||||||
|
#include "ph7.h"
|
||||||
|
#include "ph7int.h"
|
||||||
|
|
||||||
|
#define MODULE_DESC "CType Module"
|
||||||
|
#define MODULE_VER 1.0
|
||||||
|
|
||||||
|
/* Forward reference */
|
||||||
|
static int PH7_builtin_ctype_alnum(ph7_context *pCtx, int nArg, ph7_value **apArg);
|
||||||
|
static int PH7_builtin_ctype_alpha(ph7_context *pCtx, int nArg, ph7_value **apArg);
|
||||||
|
static int PH7_builtin_ctype_cntrl(ph7_context *pCtx, int nArg, ph7_value **apArg);
|
||||||
|
static int PH7_builtin_ctype_digit(ph7_context *pCtx, int nArg, ph7_value **apArg);
|
||||||
|
static int PH7_builtin_ctype_xdigit(ph7_context *pCtx, int nArg, ph7_value **apArg);
|
||||||
|
static int PH7_builtin_ctype_graph(ph7_context *pCtx, int nArg, ph7_value **apArg);
|
||||||
|
static int PH7_builtin_ctype_print(ph7_context *pCtx, int nArg, ph7_value **apArg);
|
||||||
|
static int PH7_builtin_ctype_punct(ph7_context *pCtx, int nArg, ph7_value **apArg);
|
||||||
|
static int PH7_builtin_ctype_space(ph7_context *pCtx, int nArg, ph7_value **apArg);
|
||||||
|
static int PH7_builtin_ctype_lower(ph7_context *pCtx, int nArg, ph7_value **apArg);
|
||||||
|
static int PH7_builtin_ctype_upper(ph7_context *pCtx, int nArg, ph7_value **apArg);
|
||||||
|
PH7_PRIVATE sxi32 initializeModule(ph7_vm *pVm, ph7_real *ver, SyString *desc);
|
||||||
|
|
||||||
|
static const ph7_builtin_func ctypeFuncList[] = {
|
||||||
|
{ "ctype_alnum", PH7_builtin_ctype_alnum },
|
||||||
|
{ "ctype_alpha", PH7_builtin_ctype_alpha },
|
||||||
|
{ "ctype_cntrl", PH7_builtin_ctype_cntrl },
|
||||||
|
{ "ctype_digit", PH7_builtin_ctype_digit },
|
||||||
|
{ "ctype_xdigit", PH7_builtin_ctype_xdigit},
|
||||||
|
{ "ctype_graph", PH7_builtin_ctype_graph },
|
||||||
|
{ "ctype_print", PH7_builtin_ctype_print },
|
||||||
|
{ "ctype_punct", PH7_builtin_ctype_punct },
|
||||||
|
{ "ctype_space", PH7_builtin_ctype_space },
|
||||||
|
{ "ctype_lower", PH7_builtin_ctype_lower },
|
||||||
|
{ "ctype_upper", PH7_builtin_ctype_upper }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user