/* /adm/sefun/strings.c
* from Foundation II
* sefuns for string manipulation
* created by Descartes of Borg 940506
*/
varargs string center(string str, int x) {
int y;
if(!x) x= 80;
if((y = strlen(strip_colours(str))) >= x) return str;
x = x + strlen(str) - y;
return sprintf(sprintf("%%|%ds", x), str);
}
varargs string arrange_string(string str, int x) {
int y;
if(!x) x = 80;
x += strlen(str) - strlen(strip_colours(str));
return sprintf(sprintf("%%:-%ds", x), str);
}
string trim(string str) {
string *whitespace;
int j, i = 0;
j = strlen(str) - 1;
whitespace = ({ ' ', '\t' });
while(member_array(str[i], whitespace) != -1) i++;
while(i < j && member_array(str[j], whitespace) != -1) j--;
return str[i..j];
}
/* #define NEW_WRAP */
#ifndef NEW_WRAP
varargs string wrap(string str, int x) {
if( !x ) {
if( !this_player() ) x = 79;
else {
int *tmp;
tmp = (int *)this_player()->GetScreen();
if( tmp ) x = (tmp[0] || 79);
else x = 79;
}
}
return sprintf("%-=" + x + "s\n", str);
}
#else
varargs string wrap(string str, int x) {
string ret = "";
int len;
if(find_player("descartes"))
message("system", str, find_player("descartes"));
if( !x ) {
if( !this_player() ) x = 79;
else x = ((int *)this_player()->GetScreen())[0] || 79;
}
else if( x < 5 ) return str;
while( (len = strlen(str)) >= x ) {
int i, count, ignore, actual;
for(i=0, count = 0, actual = 0; i<len; i++) {
int pt;
ret = ret + str[i..i];
if( str[i] == '\n' ) {
str = str[i+1..];
break;
}
actual++;
if( ignore ) {
if( ignore == 1 && str[i] != '%' ) continue;
if( i == len-1 ) continue;
else if( ignore == 1 ) {
if( str[i+1] != '^' ) continue;
if( i == len-2 || str[i+2] != '^' ) {
ignore = 2;
continue;
}
continue;
}
else {
ignore = 0;
continue;
}
}
else {
if( i != len-1 ) count++;
else if( str[i] != '%' ) count++;
else if( str[i+1] != '^' ) count++;
else {
if( i == len-2 || str[i+2] != '^' ) {
ignore = 1;
continue;
}
count++;
}
}
if( count < x ) continue;
if( count == x ) {
int no_whitespace;
pt = actual;
write(ret[<1..<1] + " : " + str[(pt-1)..(pt-1)]);
if( str[pt-1] == ' ' || str[pt-1] == '-' ) {
if( str[pt-1] == '-' ) ret = ret[0..<2] + "\n";
if( pt < len-2 && str[pt] == ' ' ) {
if( pt < len-3 ) str = str[pt+1..];
else str = "";
}
else if( pt < len-2 ) str = str[pt..];
else str = "";
break;
}
else if( pt < len-1 && (str[pt] == ' ' || str[pt] == '\n') ) {
if( pt < len-2 ) str = str[pt+1..];
else str = "";
break;
}
else {
no_whitespace = 1;
while( --pt ) {
int ch;
ch = str[pt-1];
if( ch == ' ' || ch == '-' ) {
ret = ret[0..<(actual-pt+1)] + "\n";
str = str[pt..];
no_whitespace = 0;
break;
}
}
if( !no_whitespace ) break;
}
}
else if( str[actual-1] == ' ' || str[actual-1] == '-' ) {
ret = ret[0..<2] + "\n";
str = str[actual..];
break;
}
}
}
return ret + str + "\n";
}
#endif
varargs mixed convert_string(string str, int flag) {
mixed *ret = ({ 0, "" });
if( (str = trim(str)) == "" ) return 0;
if( str[0] == '(' ) {
switch(str[1]) {
case '{':
ret[0] = ({});
str = str[2..];
while(str[0] != '}') {
mixed *tmp;
tmp = convert_string(str, 1);
ret[0] += ({ tmp[0] });
str = tmp[1];
while(str[0] == ' ' || str[0] == '\t') str = str[1..];
if( str[0] != ',' && str[0] != '}' )
error("Improperly formatted array: " + str + "\n");
else if( str[0] == ',') {
str = str[1..];
while(str[0] == ' ' || str[0] == '\t') str = str[1..];
}
}
if( str[1] != ')' ) {
str = str[2..];
while(str[0] == ' ' || str[0] == '\t') str = str[1..];
if( str[0] != ')' ) error("Illegal array terminator.\n");
else ret[1] = str[1..];
}
else ret[1] = str[2..];
if( !flag ) return ret[0];
while(ret[1][0] == ' ' || ret[1][0] == '\t') ret[1] = ret[1][1..];
return ret[0];
case '[':
ret[0] = ([]);
str = str[2..];
while(str[0] != ']') {
mixed *tmp;
mixed cle, val;
tmp = convert_string(str, 1);
str = tmp[1];
while(str[0] == ' ' || str[0] == '\t') str = str[1..];
if( str[0] != ':' )
error("Illegally formatting mapping: " + str + "\n");
cle = tmp[0];
tmp = convert_string(str[1..], 1);
ret[0][cle] = tmp[0];
str = tmp[1];
while(str[0] == ' ' || str[0] == '\t') str = str[1..];
if( str[0] != ',' && str[0] != ']' )
error("Illegally formatted mapping: " + str + "n");
else if( str[0] != ']' ) {
str = str[1..];
while(str[0] == ' ' || str[0] == '\t') str = str[1..];
}
}
if( str[1] != ')' ) {
str = str[2..];
while(str[0] == ' ' || str[0] == '\t') str = str[1..];
if( str[0] != ')' ) error("Illegal array terminator.\n");
else ret[1] = str[1..];
}
else ret[1] = str[2..];
if( !flag ) return ret[0];
while(ret[1][0] == ' ' || ret[1][0] == '\t') ret[1] = ret[1][1..];
return ret;
}
}
else if( str[0] == '"' ) {
string tmp;
tmp = "";
while( str[1] != '"' || (str[1] == '"' && str[0] == '\\') ) {
if( str[1] == '"' ) tmp = tmp[0..<2] + "\"";
else tmp += str[1..1];
str = str[1..];
}
if( !flag ) return tmp;
if( strlen(str) > 2 ) str = trim(str[2..]);
return ({ tmp, str });
}
else if( str[0] >= '0' && str[0] <= '9') {
string tmp;
int y;
if( strlen(str) > 1 && str[0..1] == "0x" ) {
tmp = "0x";
str = str[2..];
while(str != "" && (str[0] >= '0' && str[0] <= '9')) {
tmp += str[0..0];
if( strlen(str) > 1 ) str = str[1..];
else str = "";
}
sscanf(tmp, "%x", y);
}
else {
tmp = "";
while(str != "" && (str[0] >= '0' && str[0] <= '9')) {
tmp += str[0..0];
if( strlen(str) > 1 ) str = str[1..];
else str = "";
}
sscanf(tmp, "%d", y);
}
if( !flag ) return y;
if( str != "" ) str = trim(str);
return ({ y, str });
}
else {
string tmp;
tmp = "";
while(strlen(str) && ((str[0] >= 'a' && str[0] <= 'z') ||
(str[0] >= 'A' && str[0] <= 'Z') ||
(str[0] >= '0' && str[0] <= '9') ||
(str[0] == '_'))) {
tmp += str[0..0];
if( strlen(str) > 1 ) str = str[1..];
else str = "";
}
if( !flag ) return to_object(tmp);
else return ({ to_object(tmp), str });
}
error("Gobbledygook in string.\n");
}