/** * process_value - a replacement for the (now missing) process_value * efun. I was hoping that function pointers would * make this unnecessary, but there's no way to store * a function pointer with the autoloader. * * Initial release: 16-Nov-96 */ string *pattern = ({"\\|", " *[0-9]+ *", ".*"}); #define PV_BAR 2 #define PV_INT 3 #define PV_STR 4 #define PV_QUOTED 5 int *token = ({ 2, 3, 4 }); /** * This method replaces the process_value efun which is now missing. * @param s the string to process * @return the processed string */ mixed process_value( string s ) { string func, file, arg; mixed assoc, params; object ob; int i; if( sscanf( s, "%s|%s", func, arg ) == 2 ) { // Call has arguments. } else { // No arguments. func = s; arg = 0; } if( sscanf( func, "%s:%s", func, file ) == 2 ) { if( !objectp( ob = find_object(file) ) ) return 0; } else { ob = TO; } // printf("func: %O\n", func ); // printf("file: %O\n", file ); params = ({ func }); if( stringp(arg) ) { assoc = reg_assoc( arg, pattern, token ); // First, get rid of the separators. for( i = 0; i < sizeof(assoc[0]); i++ ) { if( assoc[0][i] == "" && !assoc[1][i] ) { assoc[0] = assoc[0][0..i - 1] + assoc[0][i + 1..]; assoc[1] = assoc[1][0..i - 1] + assoc[1][i + 1..]; } else if( !assoc[1][i] ) { // Got unanticipated pattern; dunno what to do here. write("process_value: syntax error: " + assoc[0][i] + "\n"); return 0; } } // Check for escaped special characters. for( i = 0; i < sizeof(assoc[0]) - 1; i++ ) { if( assoc[1][i+1] == PV_BAR && strsrch( assoc[0][i], "\\", -1 ) == strlen(assoc[0][i]) - 1 ) { assoc[0][i] = assoc[0][i][0..sizeof(assoc[0][i])-2]; if( i+2 < sizeof(assoc[0]) ) { // printf("i=%d; assoc=%O\n", i, assoc ); assoc[0][i] += assoc[0][i+1] + assoc[0][i+2]; assoc[0] = assoc[1][0..i] + assoc[1][i + 2..]; } else { assoc[0][i] += assoc[0][i+1]; assoc[0] = assoc[1][0..i] + assoc[1][i + 2..]; } } } for( i = 0; i < sizeof(assoc[0]); i++ ) { switch( assoc[1][i] ) { case PV_BAR: // printf("bar: %O\n", assoc[0][i] ); break; case PV_INT: // printf("int: %O\n", to_int(assoc[0][i]) ); params += ({ to_int(assoc[0][i]) }); break; case PV_STR: case PV_QUOTED: // printf("string: %O\n", assoc[0][i] ); params += ({ assoc[0][i] }); break; default: // if( assoc[0][i] != "") // printf("OTHER: %O\n", assoc[0][i] ); } } } return call_other( ob, params ); } /* process_value() */ /* * And I'll just put process_string in here also, so that it's all in * one place. */ string process_string( string s ) { string *ss, proc; int i; ss = explode( s, "@@"); if( strsrch(s, "@@") == 0 ) ss = ({""}) + ss; for( i = 1; i < sizeof(ss); i += 2 ) { proc = process_value( ss[i] ); if( stringp(proc) ) ss[i] = proc; } return implode( ss, ""); } /* process_string() */