SYNOPSIS Compat mode int parse_command (string cmd, object env, string fmt, mixed &var, ...) int parse_command (string cmd, object* arr, string fmt, mixed &var, ...) DESCRIPTION parse_command() is basically a spiffed up sscanf operating on word basis and targeted at recognizing object descriptions from command strings. The efun takes the command string <cmd> and the object(s) <env>/<arr> and tries to match it against the format string <fmt>. Successfully matched elements are assigned to the variables <var>.... The result from the efun is 1 if the command could be fully matched, and 0 otherwise. If the objects are given as a single object <env>, the efun matches against the given object and all objects contained therein. Otherwise, if the objects are given as an array <arr> of objects, the efun matches only against the given objects. If <env> is 0, environment(this_player()) is used as default. The format string <fmt> consists of words, syntactic markers, and %-directives for the values to parse and return in the variables. A typical example is " 'get' / 'take' %i " or " 'spray' / 'paint' [paint] %i ". The elements in detail are: 'word': obligatory text [word]: optional text / : Alternative marker %o : Single item, object %s : Any text %w : Any word %p : One of a list of prepositions. If the variable associated with %p is used to pass a list of words to the efun, the matching will take only against this list. %l : non-compat: Living objects compat: a single living object %i : Any objects %d : Number >= 0, or when given textual: 0-99. A <word> in this context is any sequence of characters not containing a space. 'living objects' are searched by calls to the (simul)efuns find_player() and find_living(): both functions have to accept a name as argument and return the object for this name, or 0 if there is none. The results assigned to the variables by the %-directives are: %o : returns an object %s : returns a string of words %w : returns a string of one word %p : if passed empty: a string if passed as array of words: var[0] is the matched word %i : returns an array with the following content: [0]: int: the count/number recognized in the object spec > 0: a count (e.g. 'three', '4') < 0: an ordinal (e.g. 'second', 'third') = 0: 'all' or a generic plural such as 'apples' [1..]: object: all(!) objects matching the item description. In the <env> form this may be the whole recursive inventory of the <env> object. It is up to the caller to interpret the recognized numeral and to apply it on the list of matched objects. %l : non-compat: as %i, except that only living objects are returned. compat: as %o, except that only a living object is returned. %i (and non-compat-%l) match descriptions like 'three red roses', 'all nasty bugs' or 'second blue sword'. Note: Patterns of type: "%s %w %i" might not work as one would expect. %w will always succeed so the arg corresponding to %s will always be empty. The implementation of parse_command() differs between compat mode and non-compat mode drivers mainly in how the efun retrieves the necessary information from the mudlib objects. DESCRIPTION -- compat mode To make the efun useful it must have a certain support from the mudlib: it calls a set of functions in objects to get the information it needs to parse a string. 1. int id (string txt) txt is an object name of the form "adj1 adj2 ... name". The function has to return non-zero if txt is a valid (singular) name for this particular object. 2. int plural_id (string txt) txt is an object name of the form "adj1 adj2 ... name". The function has to return non-zero if txt is a valid plural name for this particular object. 3. string adjectiv_id() When parsing commands like "get all red ones", the result from this function is used to construct the text passed to id(); in this example "red <adjectiv_id>". If this function doesn't exist, the last word from the result of short() is used instead. EXAMPLE object *items; parse_command( "take apple",environment(this_player()) , " 'get' / 'take' %i ",items); HISTORY LDMud 3.3.258 removed the compat-mode parse_command(). SEE ALSO sscanf(E)