* Added SV_KEEP_TERMINATOR option to not split the line terminator.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@12461 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
FlavioJS 2008-04-02 17:16:25 +00:00
parent 412f168c2a
commit 3f944dd947
3 changed files with 27 additions and 18 deletions

View File

@ -3,6 +3,9 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK. AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2008/04/02
* Added SV_KEEP_TERMINATOR option to not split the line terminator.
* Added sv_split to strlib.c/h (similar to sv_parse). [FlavioJS]
2008/03/31 2008/03/31
* Fixed ACIDDEMO crash, thanks to Kaato&Konard [Lupus] * Fixed ACIDDEMO crash, thanks to Kaato&Konard [Lupus]
2008/03/30 2008/03/30

View File

@ -541,7 +541,7 @@ int sv_parse(const char* str, int len, int startoff, char delim, int* out_pos, i
/// ///
/// out_fields can be NULL. /// out_fields can be NULL.
/// Fields that don't fit in out_fields are not nul-terminated. /// Fields that don't fit in out_fields are not nul-terminated.
/// Extra entries in out_fields are filled with the end of line (empty string). /// Extra entries in out_fields are filled with the end of the last field (empty string).
/// ///
/// @param str String to parse /// @param str String to parse
/// @param len Length of the string /// @param len Length of the string
@ -556,36 +556,39 @@ int sv_split(char* str, int len, int startoff, char delim, char** out_fields, in
int pos[1024]; int pos[1024];
int i; int i;
int done; int done;
char* eol; char* end;
int ret = sv_parse(str, len, startoff, delim, pos, ARRAYLENGTH(pos), opt); int ret = sv_parse(str, len, startoff, delim, pos, ARRAYLENGTH(pos), opt);
if( ret == -1 || out_fields == NULL || nfields <= 0 ) if( ret == -1 || out_fields == NULL || nfields <= 0 )
return ret; // nothing to do return ret; // nothing to do
// next line // next line
eol = str + pos[1]; end = str + pos[1];
if( eol[0] == '\0' ) if( end[0] == '\0' )
{ {
*out_fields = eol; *out_fields = end;
} }
else if( (opt&SV_TERMINATE_LF) && eol[0] == '\n' ) else if( (opt&SV_TERMINATE_LF) && end[0] == '\n' )
{ {
eol[0] = '\0'; if( !(opt&SV_KEEP_TERMINATOR) )
*out_fields = eol + 1; end[0] = '\0';
*out_fields = end + 1;
} }
else if( (opt&SV_TERMINATE_CRLF) && eol[0] == '\r' && eol[1] == '\n' ) else if( (opt&SV_TERMINATE_CRLF) && end[0] == '\r' && end[1] == '\n' )
{ {
eol[0] = eol[1] = '\0'; if( !(opt&SV_KEEP_TERMINATOR) )
*out_fields = eol + 2; end[0] = end[1] = '\0';
*out_fields = end + 2;
} }
else if( (opt&SV_TERMINATE_LF) && eol[0] == '\r' ) else if( (opt&SV_TERMINATE_LF) && end[0] == '\r' )
{ {
eol[0] = '\0'; if( !(opt&SV_KEEP_TERMINATOR) )
*out_fields = eol + 1; end[0] = '\0';
*out_fields = end + 1;
} }
else else
{ {
ShowError("sv_split: unknown line delimiter 0x02%x.\n", (unsigned char)eol[0]); ShowError("sv_split: unknown line delimiter 0x02%x.\n", (unsigned char)end[0]);
return -1;// error return -1;// error
} }
++out_fields; ++out_fields;
@ -599,7 +602,8 @@ int sv_split(char* str, int len, int startoff, char delim, char** out_fields, in
if( i < ARRAYLENGTH(pos) ) if( i < ARRAYLENGTH(pos) )
{// split field {// split field
*out_fields = str + pos[i]; *out_fields = str + pos[i];
str[pos[i+1]] = '\0'; end = str + pos[i+1];
*end = '\0';
// next field // next field
i += 2; i += 2;
++done; ++done;
@ -614,7 +618,7 @@ int sv_split(char* str, int len, int startoff, char delim, char** out_fields, in
} }
// remaining fields // remaining fields
for( i = 0; i < nfields; ++i ) for( i = 0; i < nfields; ++i )
out_fields[i] = eol; out_fields[i] = end;
return ret; return ret;
} }

View File

@ -48,7 +48,7 @@ int strline(const char* str, size_t pos);
/// Bitfield determining the behaviour of sv_parse. /// Bitfield determining the behaviour of sv_parse and sv_split.
typedef enum e_svopt typedef enum e_svopt
{ {
// default: no escapes and no line terminator // default: no escapes and no line terminator
@ -59,6 +59,8 @@ typedef enum e_svopt
SV_TERMINATE_LF = 2, SV_TERMINATE_LF = 2,
SV_TERMINATE_CRLF = 4, SV_TERMINATE_CRLF = 4,
SV_TERMINATE_CR = 8, SV_TERMINATE_CR = 8,
// If sv_split keeps the end of line terminator, instead of replacing with '\0'
SV_KEEP_TERMINATOR = 16
} e_svopt; } e_svopt;
/// Other escape sequences supported by the C compiler. /// Other escape sequences supported by the C compiler.