int parse_command(string str, mixed source, string pattern, var1, var2 ...);

Parses commands given in "str" against the pattern in "pattern" and
returns 1 if it matches. "source" is either an object or an array of objects.
This is essentially a 'hotted' sscanf and it has a similar syntax, although
parse_command works on word basis where sscanf works on character basis.

.ip str
Given command
.ip source
Either an array holding the accessible objects, or
an object from which to recurse and create
the list of accessible objects, normally
ob = environment(this_player()) .

.ip pattern
Parse pattern as list of words and formats:
.nf
		Syntax:
			'word' 		obligatory text (One word)
			[word]		optional text (One word)
			/		Alternative marker
			%o		Single item, object
			%l		Single living object
			%s		Any text (multiple words)
			%w              Any word
			%p		Preposition
			%i		Any items
			%d              Number 0- or tx(0-99)
.fi
Example string: " 'get' / 'take' %i " .
Items as in %o and %i can on many forms, some examples:
.nf
			apple, two apples, twentyfirst apple
			apples, all apples, all green apples, all green ones
.fi

.ip varN
This is the list of result variables as in sscanf.
One variable is needed for each %_.
The return types of different %_ is:
.nf
	%o	Returns an object
	%l	Returns an object
	%s	Returns a string of words
	%w      Returns a string of one word
	%p	Can on entry hold a list of word in array
		or an empty variable
		Returns:
		   if empty variable: a string
		   if array: array[0]=matched word
	%i	Returns a special array on the form:
		[0] = (int) given numeric prefix
		       =0: all or a pluralform given
		       >0: numeral given: two, three, four...
		       <0: order given: second, third ...
		[1..n] (object) Objectpointers
		       A list of the POSSIBLE objects that can match
		       the given %i. No choosing of third or such.
	%d      Returns a number
.fi
.lp
Example:

a=parse_command("take apple",environment(this_player()),
	 " 'get' / 'take' %i ",items);

HISTORY
  LDMud 3.3.258 and LP "03.02.1@150" removed the compat-mode 
  parse_command().

29.10.2006 Zesstra
