/
lib/banish/
lib/d/coronos/
lib/d/coronos/w/alena/
lib/d/coronos/w/angel/
lib/d/coronos/w/angel/caves/
lib/d/coronos/w/angel/caves/monst/
lib/d/coronos/w/angel/city/chambers/
lib/d/coronos/w/angel/city/monst/
lib/d/coronos/w/angel/city/obj/
lib/d/coronos/w/angel/city/streets/
lib/d/coronos/w/angel/farms/plains/
lib/d/coronos/w/angel/monst/
lib/d/tempus/
lib/d/tempus/w/angel/
lib/d/tempus/w/kingbill/
lib/d/tempus/w/mirak/
lib/d/tempus/w/mirak/monst/
lib/d/tempus/w/mirak/obj/
lib/d/tempus/w/relgar/planes/baat/
lib/d/tempus/w/sarak/
lib/d/tempus/w/serepion/mon/
lib/d/tempus/w/valrejn/
lib/doc/
lib/doc/domains/
lib/doc/efun/
lib/include/fn_specs/
lib/info/
lib/inherit/base/
lib/log/
lib/log/mailbox/
lib/log/main/
lib/news/
lib/obj/party/
lib/objects/componen/
lib/open/
lib/open/party/
lib/open/paste/
lib/open/spells/
lib/open/valrejn/
lib/players/
lib/players/alena/
lib/players/alena/obj/
lib/players/alena/open/
lib/players/alena/private/
lib/players/angel/
lib/players/angel/obj/
lib/players/ash/
lib/players/biggs/
lib/players/biggs/food/
lib/players/biggs/gobkeep/
lib/players/biggs/mnstr/
lib/players/biggs/town/caves/
lib/players/biggs/town/tower/
lib/players/biggs/wpns/
lib/players/calris/
lib/players/deathurg/
lib/players/deathurg/open/
lib/players/deathurg/private/thief/
lib/players/dogberry/
lib/players/dogberry/library/
lib/players/dogberry/open/
lib/players/epsilon/
lib/players/epsilon/private/
lib/players/farewell/
lib/players/hippo/
lib/players/hippo/open/
lib/players/hippo/tools/
lib/players/jimpa/
lib/players/josh/
lib/players/josh/room/
lib/players/josh/room/mage/dungeon/
lib/players/josh/room/mage/dungeon/obj/
lib/players/josh/wep/
lib/players/kingbill/
lib/players/metatron/
lib/players/miette/
lib/players/mirak/
lib/players/mirak/open/
lib/players/parsilan/
lib/players/relgar/
lib/players/relgar/private/
lib/players/sarak/
lib/players/sarak/bugs/
lib/players/sarak/feelings/
lib/players/sarak/magical/
lib/players/sarak/minotaur/island/
lib/players/sarak/open/
lib/players/sarak/private/
lib/players/serepion/
lib/players/serepion/open/
lib/players/serepion/private/
lib/players/spike/
lib/players/spike/open/
lib/players/spike/private/
lib/players/spike/seaworld/
lib/players/valrejn/
lib/players/valrejn/open/
lib/players/valrejn/private/
lib/players/virus/
lib/players/wrath/
lib/players/wrath/arm/
lib/players/wrath/mon/
lib/players/wrath/room/
lib/players/wrath/room/entry/
lib/players/wrath/room/zolgath/
lib/players/wrath/weap/
lib/players/zil/
lib/room/
lib/room/city/arena/
lib/room/city/creator/
lib/room/city/garden/monst/
lib/room/city/library/
lib/room/city/library/open/books/
lib/room/city/shop/
lib/room/death/
lib/room/death/open/
lib/room/island/
lib/room/keeps/
lib/room/registry/
lib/room/ships/crew/
lib/room/ships/open/
lib/room/ships/open/types/bounty/
lib/room/ships/open/types/nebula/
lib/room/ships/open/types/phoenix/
lib/secure/udp_cmd_/
lib/skills/
lib/skills/fighter/
lib/skills/psionici/
lib/skills/thief/
lib/usr/
lib/usr/creators/
lib/usr/no_banis/
lib/usr/players/
/* 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;
}