/* config file parser */ /* used by am_allow.c and wp_allow.c to read /include/cfg/weapon.dat and armour.dat. Note that the lib has been setup so any .dat can be read by players, regardless of path. Format: fields are strings #comment @Field # Main Field, ' ' & '\n' are stripped :field1, field2, field3, .... # Array field, ' ' & '\n' are stripped :$field4 # String field, '\n' are stripped => ({ Field, ({ ({ field1, field2, field3, }), field4, }), }) The parser allows escaped characters. Useful if you need to use Example: @name :b o b, bobby\ joe :$b o b, bobby joe\n #.......... will create a data array, ({ "name", ({ "bob", "bobby joe", }), "b o b,bobby joe\n", }), }) */ #include <mudlib.h> string remove_comment(string str) { string tmp1, rest; while(sscanf(str,"%s#%s\n%s",str,tmp1,rest) == 3) { str += rest; } return str; } string remove_whitespace(string str) { str = implode(explode(str +" "," "), ""); str = implode(explode(str +"\n","\n"), ""); return str; } /* convert escaped tokens to something else... */ string escape_string1(string str) { #ifdef OLD_EXPLODE str = implode(explode(str +"\\ ", "\\ "), "\\*^"); str = implode(explode(str +"\\#", "\\#"), "\\$^"); str = implode(explode(str +"\\@", "\\@"), "\\~^"); str = implode(explode(str +"\\:", "\\:"), "\\!^"); str = implode(explode(str +"\\,", "\\,"), "\\&^"); #else str = implode(explode(str, "\\ "), "\\*^"); str = implode(explode(str, "\\#"), "\\$^"); str = implode(explode(str, "\\@"), "\\~^"); str = implode(explode(str, "\\:"), "\\!^"); str = implode(explode(str, "\\,"), "\\&^"); #endif return str; } string escape_string2(string str) { #ifdef OLD_EXPLODE str = implode(explode(str +"\\*^", "\\*^"), " "); str = implode(explode(str +"\\$^", "\\$^"), "#"); str = implode(explode(str +"\\&^", "\\&^"), ","); str = implode(explode(str +"\\b", "\\b"), "\b"); str = implode(explode(str +"\\n", "\\n"), "\n"); str = implode(explode(str +"\\t", "\\t"), "\t"); str = implode(explode(str +"\\~^", "\\~^"), "@"); str = implode(explode(str +"\\!^", "\\!^"), ":"); str = implode(explode(str +"\\\\", "\\\\"), "!@#$^"); str = implode(explode(str +"\\", "\\"), ""); str = implode(explode(str +"!@#$^", "!@#$^"), "\\"); #else str = implode(explode(str, "\\*^"), " "); str = implode(explode(str, "\\$^"), "#"); str = implode(explode(str, "\\&^"), ","); str = implode(explode(str, "\\b"), "\b"); str = implode(explode(str, "\\n"), "\n"); str = implode(explode(str, "\\t"), "\t"); str = implode(explode(str, "\\~^"), "@"); str = implode(explode(str, "\\!^"), ":"); str = implode(explode(str, "\\\\"), "!@#$^"); str = implode(explode(str, "\\"), ""); str = implode(explode(str, "!@#$^"), "\\"); #endif return str; } mixed *load_file(string file) { string txt, *fields, *field_data; mixed *data, *f_data; int i, j, k; data = ({}); txt = read_file(file); if(!txt) return ({}); txt = escape_string1(txt); txt = remove_comment(txt); #ifdef OLD_EXPLODE fields = explode(txt +"@", "@"); #else fields = explode(txt, "@"); #endif for(i = 1; i < sizeof(fields); i++) { #ifdef OLD_EXPLODE field_data = explode(fields[i] +":",":"); #else field_data = explode(fields[i],":"); #endif data += ({ remove_whitespace(field_data[0]), }); f_data = ({}); for(j = 1; j < sizeof(field_data); j++) { txt = field_data[j]; if(txt == "" || txt[0] != '$') { txt = remove_whitespace(txt); txt = escape_string2(txt); #ifdef OLD_EXPLODE f_data += ({ explode(txt +",",","), }); #else f_data += ({ explode(txt,","), }); #endif } else { #ifdef OLD_EXPLODE txt = implode(explode(txt +"\n","\n"), ""); #else txt = implode(explode(txt,"\n"), ""); #endif for(k = strlen(txt); k-- && txt[k] == ' ';); txt = extract(txt,1,k); txt = escape_string2(txt); f_data += ({ txt, }); } } data += ({ f_data, }); } return data; }