skylib_fluffos_v3/
skylib_fluffos_v3/bin/
skylib_fluffos_v3/bin/db/
skylib_fluffos_v3/fluffos-2.9-ds2.04/
skylib_fluffos_v3/fluffos-2.9-ds2.04/ChangeLog.old/
skylib_fluffos_v3/fluffos-2.9-ds2.04/Win32/
skylib_fluffos_v3/fluffos-2.9-ds2.04/compat/
skylib_fluffos_v3/fluffos-2.9-ds2.04/compat/simuls/
skylib_fluffos_v3/fluffos-2.9-ds2.04/include/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/clone/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/command/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/data/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/etc/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/include/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/inherit/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/inherit/master/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/log/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/compiler/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/efuns/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/operators/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/u/
skylib_fluffos_v3/fluffos-2.9-ds2.04/tmp/
skylib_fluffos_v3/fluffos-2.9-ds2.04/windows/
skylib_fluffos_v3/mudlib/
skylib_fluffos_v3/mudlib/cmds/
skylib_fluffos_v3/mudlib/cmds/admin/
skylib_fluffos_v3/mudlib/cmds/guild-race/
skylib_fluffos_v3/mudlib/cmds/living/broken/
skylib_fluffos_v3/mudlib/cmds/player/group_cmds/
skylib_fluffos_v3/mudlib/cmds/playtester/
skylib_fluffos_v3/mudlib/d/admin/
skylib_fluffos_v3/mudlib/d/admin/room/
skylib_fluffos_v3/mudlib/d/admin/room/we_care/
skylib_fluffos_v3/mudlib/d/admin/save/
skylib_fluffos_v3/mudlib/d/admin/text/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/buildings/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/map/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/roads/
skylib_fluffos_v3/mudlib/d/learning/chars/
skylib_fluffos_v3/mudlib/d/learning/functions/
skylib_fluffos_v3/mudlib/d/learning/handlers/
skylib_fluffos_v3/mudlib/d/learning/help_topics/
skylib_fluffos_v3/mudlib/d/learning/help_topics/npcs/
skylib_fluffos_v3/mudlib/d/learning/help_topics/objects/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rcs_demo/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/crowd/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/situations/
skylib_fluffos_v3/mudlib/d/learning/save/
skylib_fluffos_v3/mudlib/d/learning/school/
skylib_fluffos_v3/mudlib/d/learning/school/add_sc/
skylib_fluffos_v3/mudlib/d/learning/school/characters/
skylib_fluffos_v3/mudlib/d/learning/school/general/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/basic_commands/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/edtutor/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_fluffos_v3/mudlib/d/learning/school/items/
skylib_fluffos_v3/mudlib/d/learning/school/npc_school/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/room_basic/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/situations/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_fluffos_v3/mudlib/d/learning/text/
skylib_fluffos_v3/mudlib/d/liaison/
skylib_fluffos_v3/mudlib/d/mudlib/
skylib_fluffos_v3/mudlib/d/mudlib/changes/
skylib_fluffos_v3/mudlib/d/playtesters/
skylib_fluffos_v3/mudlib/d/playtesters/effects/
skylib_fluffos_v3/mudlib/d/playtesters/handlers/
skylib_fluffos_v3/mudlib/d/playtesters/items/
skylib_fluffos_v3/mudlib/d/sage/
skylib_fluffos_v3/mudlib/doc/
skylib_fluffos_v3/mudlib/doc/creator/
skylib_fluffos_v3/mudlib/doc/driver/
skylib_fluffos_v3/mudlib/doc/driver/efuns/arrays/
skylib_fluffos_v3/mudlib/doc/driver/efuns/buffers/
skylib_fluffos_v3/mudlib/doc/driver/efuns/calls/
skylib_fluffos_v3/mudlib/doc/driver/efuns/compile/
skylib_fluffos_v3/mudlib/doc/driver/efuns/filesystem/
skylib_fluffos_v3/mudlib/doc/driver/efuns/floats/
skylib_fluffos_v3/mudlib/doc/driver/efuns/functions/
skylib_fluffos_v3/mudlib/doc/driver/efuns/general/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mappings/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mixed/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mudlib/
skylib_fluffos_v3/mudlib/doc/driver/efuns/numbers/
skylib_fluffos_v3/mudlib/doc/driver/efuns/parsing/
skylib_fluffos_v3/mudlib/doc/login/
skylib_fluffos_v3/mudlib/doc/lpc/basic_manual/
skylib_fluffos_v3/mudlib/doc/lpc/intermediate/
skylib_fluffos_v3/mudlib/doc/new/add_command/
skylib_fluffos_v3/mudlib/doc/new/events/
skylib_fluffos_v3/mudlib/doc/new/handlers/
skylib_fluffos_v3/mudlib/doc/new/living/race/
skylib_fluffos_v3/mudlib/doc/new/living/spells/
skylib_fluffos_v3/mudlib/doc/new/object/
skylib_fluffos_v3/mudlib/doc/new/player/
skylib_fluffos_v3/mudlib/doc/new/room/guild/
skylib_fluffos_v3/mudlib/doc/new/room/outside/
skylib_fluffos_v3/mudlib/doc/new/room/storeroom/
skylib_fluffos_v3/mudlib/doc/object/
skylib_fluffos_v3/mudlib/doc/playtesters/
skylib_fluffos_v3/mudlib/doc/policy/
skylib_fluffos_v3/mudlib/doc/weapons/
skylib_fluffos_v3/mudlib/global/
skylib_fluffos_v3/mudlib/global/creator/
skylib_fluffos_v3/mudlib/handlers/
skylib_fluffos_v3/mudlib/include/casino/
skylib_fluffos_v3/mudlib/include/cmds/
skylib_fluffos_v3/mudlib/include/effects/
skylib_fluffos_v3/mudlib/include/npc/
skylib_fluffos_v3/mudlib/include/room/
skylib_fluffos_v3/mudlib/include/shops/
skylib_fluffos_v3/mudlib/net/daemon/
skylib_fluffos_v3/mudlib/net/daemon/chars/
skylib_fluffos_v3/mudlib/net/inherit/
skylib_fluffos_v3/mudlib/net/obj/
skylib_fluffos_v3/mudlib/net/obj/BACKUPS/
skylib_fluffos_v3/mudlib/obj/amulets/
skylib_fluffos_v3/mudlib/obj/armours/plate/
skylib_fluffos_v3/mudlib/obj/b_day/
skylib_fluffos_v3/mudlib/obj/clothes/transport/horse/
skylib_fluffos_v3/mudlib/obj/faith/symbols/
skylib_fluffos_v3/mudlib/obj/fungi/
skylib_fluffos_v3/mudlib/obj/gatherables/
skylib_fluffos_v3/mudlib/obj/instruments/
skylib_fluffos_v3/mudlib/obj/media/
skylib_fluffos_v3/mudlib/obj/misc/player_shop/
skylib_fluffos_v3/mudlib/obj/monster/godmother/
skylib_fluffos_v3/mudlib/obj/monster/transport/
skylib_fluffos_v3/mudlib/obj/rings/
skylib_fluffos_v3/mudlib/obj/scabbards/
skylib_fluffos_v3/mudlib/obj/spells/
skylib_fluffos_v3/mudlib/obj/stationery/
skylib_fluffos_v3/mudlib/obj/stationery/envelopes/
skylib_fluffos_v3/mudlib/obj/toys/
skylib_fluffos_v3/mudlib/obj/vessels/
skylib_fluffos_v3/mudlib/obj/weapons/axes/
skylib_fluffos_v3/mudlib/obj/weapons/chains/
skylib_fluffos_v3/mudlib/obj/weapons/maces/BACKUPS/
skylib_fluffos_v3/mudlib/save/autodoc/
skylib_fluffos_v3/mudlib/save/book_handler/
skylib_fluffos_v3/mudlib/save/books/history/calarien/
skylib_fluffos_v3/mudlib/save/mail/
skylib_fluffos_v3/mudlib/save/new_soul/data/
skylib_fluffos_v3/mudlib/save/parcels/
skylib_fluffos_v3/mudlib/save/playerinfo/
skylib_fluffos_v3/mudlib/save/players/d/
skylib_fluffos_v3/mudlib/save/players/s/
skylib_fluffos_v3/mudlib/save/random_names/
skylib_fluffos_v3/mudlib/save/random_names/data/
skylib_fluffos_v3/mudlib/save/terrains/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_desert/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_grassy_field/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_mountain/
skylib_fluffos_v3/mudlib/save/todo_lists/
skylib_fluffos_v3/mudlib/secure/
skylib_fluffos_v3/mudlib/secure/cmds/admin/
skylib_fluffos_v3/mudlib/secure/cmds/lord/
skylib_fluffos_v3/mudlib/secure/config/
skylib_fluffos_v3/mudlib/secure/handlers/autodoc/
skylib_fluffos_v3/mudlib/secure/handlers/intermud/
skylib_fluffos_v3/mudlib/secure/include/global/
skylib_fluffos_v3/mudlib/secure/save/
skylib_fluffos_v3/mudlib/secure/save/handlers/
skylib_fluffos_v3/mudlib/secure/std/
skylib_fluffos_v3/mudlib/secure/std/classes/
skylib_fluffos_v3/mudlib/secure/std/modules/
skylib_fluffos_v3/mudlib/std/creator/
skylib_fluffos_v3/mudlib/std/dom/
skylib_fluffos_v3/mudlib/std/effects/
skylib_fluffos_v3/mudlib/std/effects/external/
skylib_fluffos_v3/mudlib/std/effects/fighting/
skylib_fluffos_v3/mudlib/std/effects/magic/
skylib_fluffos_v3/mudlib/std/effects/magic/BACKUPS/
skylib_fluffos_v3/mudlib/std/effects/other/BACKUPS/
skylib_fluffos_v3/mudlib/std/effects/priest/
skylib_fluffos_v3/mudlib/std/effects/room/
skylib_fluffos_v3/mudlib/std/environ/
skylib_fluffos_v3/mudlib/std/guilds/
skylib_fluffos_v3/mudlib/std/guilds/old/
skylib_fluffos_v3/mudlib/std/languages/
skylib_fluffos_v3/mudlib/std/liquids/
skylib_fluffos_v3/mudlib/std/npc/
skylib_fluffos_v3/mudlib/std/npc/goals/
skylib_fluffos_v3/mudlib/std/npc/goals/basic/
skylib_fluffos_v3/mudlib/std/npc/goals/misc/
skylib_fluffos_v3/mudlib/std/npc/plans/
skylib_fluffos_v3/mudlib/std/npc/plans/basic/
skylib_fluffos_v3/mudlib/std/npc/types/
skylib_fluffos_v3/mudlib/std/npc/types/helper/
skylib_fluffos_v3/mudlib/std/npcs/
skylib_fluffos_v3/mudlib/std/outsides/
skylib_fluffos_v3/mudlib/std/races/shadows/
skylib_fluffos_v3/mudlib/std/room/basic/BACKUPS/
skylib_fluffos_v3/mudlib/std/room/basic/topography/
skylib_fluffos_v3/mudlib/std/room/controller/
skylib_fluffos_v3/mudlib/std/room/inherit/topography/
skylib_fluffos_v3/mudlib/std/room/topography/area/
skylib_fluffos_v3/mudlib/std/room/topography/iroom/
skylib_fluffos_v3/mudlib/std/room/topography/milestone/
skylib_fluffos_v3/mudlib/std/shadows/curses/
skylib_fluffos_v3/mudlib/std/shadows/disease/
skylib_fluffos_v3/mudlib/std/shadows/fighting/
skylib_fluffos_v3/mudlib/std/shadows/healing/
skylib_fluffos_v3/mudlib/std/shadows/magic/
skylib_fluffos_v3/mudlib/std/shadows/poison/
skylib_fluffos_v3/mudlib/std/shadows/room/
skylib_fluffos_v3/mudlib/std/shops/controllers/
skylib_fluffos_v3/mudlib/std/shops/objs/
skylib_fluffos_v3/mudlib/std/shops/player_shop/
skylib_fluffos_v3/mudlib/std/socket/
skylib_fluffos_v3/mudlib/std/soul/d/
skylib_fluffos_v3/mudlib/std/soul/e/
skylib_fluffos_v3/mudlib/std/soul/i/
skylib_fluffos_v3/mudlib/std/soul/j/
skylib_fluffos_v3/mudlib/std/soul/k/
skylib_fluffos_v3/mudlib/std/soul/l/
skylib_fluffos_v3/mudlib/std/soul/n/
skylib_fluffos_v3/mudlib/std/soul/o/
skylib_fluffos_v3/mudlib/std/soul/q/
skylib_fluffos_v3/mudlib/std/soul/r/
skylib_fluffos_v3/mudlib/std/soul/u/
skylib_fluffos_v3/mudlib/std/soul/v/
skylib_fluffos_v3/mudlib/std/soul/y/
skylib_fluffos_v3/mudlib/std/soul/z/
skylib_fluffos_v3/mudlib/std/stationery/
skylib_fluffos_v3/mudlib/w/
skylib_fluffos_v3/mudlib/w/default/
skylib_fluffos_v3/mudlib/w/default/armour/
skylib_fluffos_v3/mudlib/w/default/clothes/
skylib_fluffos_v3/mudlib/w/default/item/
skylib_fluffos_v3/mudlib/w/default/npc/
skylib_fluffos_v3/mudlib/w/default/room/
skylib_fluffos_v3/mudlib/w/default/weapon/
skylib_fluffos_v3/mudlib/www/
skylib_fluffos_v3/mudlib/www/java/
skylib_fluffos_v3/mudlib/www/secure/
skylib_fluffos_v3/mudlib/www/secure/lpc/advanced/
skylib_fluffos_v3/mudlib/www/secure/lpc/intermediate/
skylib_fluffos_v3/win32/
#include <alias.h>

inherit COMMAND_BASE;

private nosave string gfilter;
/**
 * Turn the compiled alias array into a string.
 * @param al the alias array
 * @return the string value of the alias array
 * @see compile_alias()
 */
string alias_string( mixed al ) {
   int i, num, *add_thing;
   string str;

    str = "";
    add_thing = ({ });

    for( i = 0; i < sizeof(al); i++ ) {
        if( stringp(al[i]) ) {
            str += replace( al[i], ({";", "\\;"}) );
        } else {
            num = al[i] & ALIAS_MASK;
            switch( al[i] - num ) {
            case NEW_LINE  :
               str += ";";
               break;
            case ALL_ARGS  :
               str += "$*$";
               break;
            case ONE_ARG   :
               str += "$"+num+"$";
               break;
            case TO_ARG    :
               str += "$*"+num+"$";
               break;
            case FROM_ARG  :
               str += "$"+num+"*$";
               break;
            case ALL_ARG   :
               str += "$arg:"+al[++i]+"$";
               break;
            case ARG_THING :
               str += "$arg"+num+":"+al[++i]+"$";
               break;
            case ELSE_THING :
              str += "$else$";
              break;
            case ALL_IFARG :
               str += "$ifarg:";
               break;
            case IFARG_THING :
               str += "$ifarg"+num+":";
               break;
            case CURR_LOC :
               str += "$!$";
               break;
            case END_IF      :
               str += "$endif$";
               break;
            }
        }
    }

    return str;

} /* alias_string() */

/**
 * Prints out all the aliases on the player object.  This is called by the
 * alias command when no arguments are specified.
 * @return 0 if no aliases are defined, 1 if they are
 * @see alias()
 */
int print_aliases( string filter, int sorted ) {
    int len, cols;
    string str, str1, str2, *tmp, bing, key;
    mapping aliases;
    string ret;

    aliases = TP->query_aliases();

    if( !sizeof(aliases) )
        return notify_fail("You have defined no aliases.\n");

    str1 = "";
    str2 = "";

    tmp = keys(aliases);
    if( filter && !regexp( filter, "[\\[\\]\\(\\)]+") ) {
        gfilter = "^" + filter;
        tmp = filter( tmp, (: regexp( $1, gfilter ) :) );
    }

    tmp = sort_array( tmp, 1 );
    ret = "";
    cols = (int)TP->query_cols();

    foreach( key in tmp ) {
        if( !key ) {
            map_delete( aliases, 0 );
            continue;
        }

        bing = alias_string( aliases[key] );
        if( !bing )
            bing = "Error in the alias!";

        str = key+": "+bing;
        if( strlen(str) > 39 || sorted ) {
            len = cols - strlen(key) - 2;
            if( len < 0 )
                len = 10;
            // If it is too long, print it right now.
            ret += sprintf( key+": %-=*s\n", len, bing );
        } else if( strlen(str) > 19 ) {
            str1 += str+"\n";
        } else {
            str2 += str+"\n";
        }
    }

    if( strlen(str1) )
        ret += sprintf("%-#*s\n", cols, str1 );

    if( strlen(str2) )
        ret += sprintf("%-#*s\n", cols, str2 );

    ret += sprintf("A total of %d aliases.\n", sizeof(tmp) );

    TP->more_string(ret);
    return 1;

} /* print_aliases() */

/**
 * Creates the compiled alias array.  See the alias.h file for the
 * definitions of thevalues in the alias array.
 * @param str the string to compile
 * @return the compiled alias array
 * @see /include/alias.h
 */
mixed compile_alias( string str ) {
    int i, space, tmp, gumby, nodollar;
    mixed ret, ifargs;
    string *frog, s1;

    str = replace( str, ({"\\;", "$escaped$", ";", "$new_line$", " ", " "}) );
    str = replace( str, "$escaped$", ";");
    str = "&"+str+"&";
    frog = explode( str, "$");

    if( frog[0] == "&")
       frog = frog[1..];
    else
       frog[ 0 ] = frog[ 0 ][ 1 .. ];

    s1 = frog[<1];
    if( s1 == "&" )
        frog = frog[0..<2];
    else
        frog[<1] = s1[0..<2];

    ret = ({ });
    ifargs = ({ });
    nodollar = 1;

    for( i = 0; i < sizeof(frog); i++ ) {
        switch( frog[i] ) {
        case "new_line" :
          ret += ({ NEW_LINE });
          nodollar = 1;
        break;
        case "*" :
          ret += ({ ALL_ARGS });
          gumby = 1;
          nodollar = 1;
        break;
        case "!" :
          if( creatorp(TO) ) {
              ret += ({ CURR_LOC });
              nodollar = 1;
          }
        break;
        case "else" :
          if( sizeof(ifargs) ) {
              ret[ifargs[sizeof(ifargs)-1]] = sizeof(ret)-
                  ifargs[sizeof(ifargs)-1]+1;
              ret += ({ ELSE_THING, 0, ""});
              ifargs[sizeof(ifargs)-1] = sizeof(ret)-2;
              nodollar = 1;
          }
        break;
        case "~" :
        case "endif" :
          if( sizeof(ifargs) ) {
              ret += ({ END_IF });
              ret[ifargs[sizeof(ifargs)-1]] = sizeof(ret)-
                  ifargs[sizeof(ifargs)-1];
              ifargs = delete( ifargs, sizeof(ifargs)-1, 1 );
              nodollar = 1;
              space = 1;
          }
        break;
        default :
          if( frog[i][0..4] == "ifarg") {
              if( sscanf( frog[i], "ifarg%d:%s", tmp, s1 ) == 2 ) {
                  if( tmp < 0 )
                      tmp = 0;
                  if( tmp > ALIAS_MASK )
                      tmp = ALIAS_MASK;
                  ret += ({ IFARG_THING+ tmp, 0, ""});
                  frog[i--] = s1;
                  nodollar = 1;
                  ifargs += ({ sizeof(ret)-2 });
                  space = 0;
                  gumby = 1;
              } else if( frog[i][5] == ':') {
                  ret += ({ ALL_IFARG, 0, ""});
                  frog[i] = frog[i][6..];
                  nodollar = 1;
                  ifargs += ({ sizeof(ret)-2 });
                  space = 0;
                  gumby = 1;
                  i--;
              } else {
                  if( sizeof(ret) && stringp(ret[sizeof(ret)-1]) && !space ) {
                      ret[sizeof(ret)-1] += "$"+frog[i];
                  } else if( nodollar ) {
                      ret += ({ frog[i] });
                      nodollar = 0;
                  } else {
                      ret += ({ "$"+frog[i] });
                  }
              }
          } else if( frog[i][0..2] == "arg") {
              if( sscanf(frog[i], "arg%d:%s", tmp, s1 ) == 2 ) {
                  if( tmp < 0 )
                      tmp = 0;
                  if( tmp > ALIAS_MASK)
                      tmp = ALIAS_MASK;
                  ret += ({ ARG_THING+ tmp, s1, ""});
                  nodollar = 1;
                  gumby = 1;
              } else if( frog[i][3] == ':') {
                  ret += ({ ALL_ARG, frog[i][4..100], ""});
                  nodollar = 1;
                  gumby = 1;
              } else {
                  if( sizeof(ret) && stringp(ret[sizeof(ret)-1]) && !space ) {
                      ret[sizeof(ret)-1] += "$"+frog[i];
                  } else if( nodollar ) {
                      ret += ({ frog[i] });
                      nodollar = 0;
                  } else {
                      ret += ({ "$"+frog[i] });
                  }
                  gumby = 1;
                  space = 0;
              }
          } else if( strlen(frog[i]) && frog[i][<1] == '*' &&
              sscanf( frog[i], "%d%s*", tmp, s1 ) == 2 && s1 == "") {
              if( tmp < 0 )
                  tmp = 0;
              if( tmp > ALIAS_MASK )
                  tmp = ALIAS_MASK;
              ret += ({ FROM_ARG + tmp });
              gumby = 1;
              nodollar = 1;
          } else if( strlen(frog[i]) && frog[i][0] == '*' &&
              sscanf( frog[i][1..1000], "%d%s", tmp, s1 ) == 2 && s1 == "") {
              if( tmp < 0 )
                  tmp = 0;
              if( tmp > ALIAS_MASK )
                  tmp = ALIAS_MASK;
              ret += ({ TO_ARG + tmp });
              gumby = 1;
              nodollar = 1;
          } else if( sscanf( frog[i], "%d%s", tmp, s1 ) == 2 && s1 == "") {
              if( tmp < 0 )
                  tmp = 0;
              if( tmp > ALIAS_MASK )
                  tmp = ALIAS_MASK;
              ret += ({ ONE_ARG + tmp });
              gumby = 1;
              nodollar = 1;
          } else {
              if( !nodollar )
                  frog[i] = "$"+frog[i];

              nodollar = 0;
              space = 0;

              if( strlen(frog[i]) && frog[i][<1] == '~') {
                  if( sizeof(ifargs) ) {
                      if( strlen(frog[i]) == 1 )
                          frog[i] = "";
                      else
                          frog[i] = frog[i][0..<2];
                      // Create an offset.
                      ret += ({ END_IF });
                      ret[ifargs[<1]] = sizeof(ret) - ifargs[<1];
                      ifargs = ifargs[0..<2];
                      nodollar = 1;
                      space = 1;
                  }
              }

              if( sizeof(ret) && stringp(ret[<1]) && space != 2 )
                  ret[<1] += frog[i];
              else
                  ret += ({ frog[i] });

              if( space )
                  space = 2;
          }
        }

    }

    while( sizeof(ifargs) ) {
        ret += ({ END_IF });
        ret[ifargs[sizeof(ifargs)-1]] = sizeof(ret)-
            ifargs[sizeof(ifargs)-1];
        ifargs = delete( ifargs, sizeof(ifargs)-1, 1 );
    }

    if( !gumby ) {
        if( sizeof(ret) && !stringp(ret[sizeof(ret)-1]) || space ) {
            ret += ({ " ", ALL_ARGS });
        } else if( sizeof(ret) ) {
           ret[sizeof(ret)-1] += " ";
           ret += ({ ALL_ARGS });
        }
    }

    return ret;

} /* compile_alias() */

/**
 * This method will print out one or more aliases.
 * @param str the aliases to print
 */
int print_some_aliases( string str ) {
    if( TP->is_alias(str) ) {
        printf("%s: %-=*s\n", str, (int)TP->query_cols() - strlen(str) -2,
            alias_string( TP->query_player_alias(str) ) );
        return 1;
    }

    return print_aliases( str, 0 );

} /* print_some_aliases() */

/**
 * The main alias control function.  Sets up new aliases and prints out
 * the values of single aliases or all the aliases.
 * @param str the command name
 * @return 0 if the alias command failed, 1 if it succeeded
 * @see edit_alias()
 * @see print_aliases()
 */
protected int alias( string name, string value ) {
#ifdef DISALLOW_COLOUR
    if( strsrch( name, "%^") > -1 || strsrch( value, "%^") > -1 )
        return notify_fail("You cannot add an alias with a colour escape "
                           "sequence (% ^).\n");
#endif

    if( name == ".plan" || name == ".project" || name == ".signature") {
        if( sizeof(value) > MAX_PLAN_LENGTH )
            return notify_fail("Sorry, the maximum length of .plan, .project "
                "and .signature aliases is "+MAX_PLAN_LENGTH+" characters.\n");
    }

    if( sizeof(value) > MAX_ALIAS_LENGTH )
        return notify_fail("Sorry, the maximum alias length is "+
            MAX_ALIAS_LENGTH+" characters.\n");

    name = implode( explode( name, " "), "");
    write( ( !TP->is_alias(name) ? "Added" : "Changed")+" alias '"+
        name+"'.\n");
    TP->add_player_alias( name, compile_alias(value) );
    return 1;

} /* alias() */

/** @ignore yes */
mixed query_patterns() {
    return ({
        "", (: print_aliases("", 0) :),
        "sorted", (: print_aliases("", 1) :),
        "<word'alias'>", (: print_some_aliases($4[0]) :),
        "<word'alias'> <string>", (: alias($4[0], $4[1]) :)
        });
} /* query_patterns() */