lpmoo-1.2/etc/
lpmoo-1.2/mudlib/
lpmoo-1.2/mudlib/etc/
lpmoo-1.2/mudlib/include/
lpmoo-1.2/mudlib/include/moo/
lpmoo-1.2/mudlib/lpc/
lpmoo-1.2/mudlib/std/auto/
lpmoo-1.2/mudlib/std/bfuns/
/*
 * NAME:	detoken.c
 * DESCRIPTION:	uncompress verb code
 */

# include <moo/tokens.h>

mapping tokmap;		/* map of all tokens */

/*
 * NAME:	create()
 * DESCRIPTION:	initialize data
 */
static
void create(void)
{
  tokmap = ([
    TOK_PERCENT   : " % ",
    TOK_QUESTION  : " ? ",
    TOK_PIPE      : " | ",
    TOK_MINUS     : " - ",
    TOK_PLUS      : " + ",
    TOK_ASSOC     : " ~ ",
    TOK_COMMA     : ", ",
    TOK_SEMICOLON : ";\n",
    TOK_RPAREN    : ")\n",
    TOK_RBRACKET  : "]\n",
    TOK_ASSIGN    : " = ",
    TOK_TIMES     : " * ",
    TOK_DIVIDE    : " / ",
    TOK_IF        : "if (",
    TOK_ELSEIF    : "elseif (",
    TOK_ELSE      : "else\n",
    TOK_ENDIF     : "endif\n",
    TOK_FOR       : "for ",
    TOK_IN        : " in ",
    TOK_ENDFOR    : "endfor\n",
    TOK_WHILE     : "while (",
    TOK_ENDWHILE  : "endwhile\n",
    TOK_FORK      : "fork ",
    TOK_ENDFORK   : "endfork\n",
    TOK_RETURN    : "return",
    TOK_RANGE     : "..",
    TOK_EQUAL     : " == ",
    TOK_NEQUAL    : " != ",
    TOK_LESS      : " < ",
    TOK_LSEQUAL   : " <= ",
    TOK_GREATER   : " > ",
    TOK_GREQUAL   : " >= ",
    TOK_AND       : " && ",
    TOK_OR        : " || ",

    VTOK_BUF      : "BUF",
    VTOK_ERR      : "ERR",
    VTOK_FLOAT    : "FLOAT",
    VTOK_LIST     : "LIST",
    VTOK_NUM      : "NUM",
    VTOK_OBJ      : "OBJ",
    VTOK_STR      : "STR",
    VTOK_TABLE    : "TABLE",

    VTOK_PLAYER   : "player",
    VTOK_THIS     : "this",
    VTOK_CALLER   : "caller",
    VTOK_ARGS     : "args",
    VTOK_ARGSTR   : "argstr",
    VTOK_VERB     : "verb",
    VTOK_DOBJ     : "dobj",
    VTOK_DOBJSTR  : "dobjstr",
    VTOK_PREPSTR  : "prepstr",
    VTOK_IOBJ     : "iobj",
    VTOK_IOBJSTR  : "iobjstr",
  ]);
}

/*
 * NAME:	main()
 * DESCRIPTION:	detokenize the given source code
 */
string main(string code, int full_paren, int do_indent)
{
  string subst, indent;
  int i, sz;

  if (do_indent)
    indent = "";

  for (i = 0, sz = strlen(code); i < sz; ++i)
    {
      int c;

      if (! ((c = code[i]) & 0x80))
	continue;

      switch (c &= ~0x80)
	{
	case 0x00:  /* magic indent */
	  subst = do_indent ? indent : "";
	  break;

	case 0x01:  /* magic --indent */
	  subst = do_indent ? (indent = indent[2 ..]) : "";
	  break;

	case 0x02:  /* magic ++indent */
	  subst = do_indent ? (indent += "  ") : "";
	  break;

	case '{':  /* magic paren */
	case '}':
	  if (! full_paren)
	    {
	      subst = "";
	      break;
	    }
	  code[i] = (c == '{' ? '(' : ')');
	  continue;

	default:
	  subst = tokmap[c];
	  if (subst == 0)
	    error("Unknown token in source: " + (string) c);
	}

      code = code[.. i - 1] + subst + code[i + 1 ..];
      c = strlen(subst) - 1;
      i += c, sz += c;
    }

  return code;
}