/*
Copyright (c) 1993 Xerox Corporation. All rights reserved.
*/
/*
$Id$
$Date$
*
*/
/* Chauser, October 28, 1993 3:42 pm PDT */
#ifndef ←←PCR←Cmd←h
# define ←←PCR←Cmd←h 1
#include <config/PCR←StdTypes.h>
/*
* Callbacks
*/
typedef PCR←ERes PCR←Cmd←GetCharProc(
PCR←Any data
);
/*
Read unsigned character (as int).
Result <=0 will be treated as EOF.
*/
typedef PCR←ERes PCR←Cmd←PrintProc(
PCR←Any data,
char *fmt,
...
);
/*
Behaves like printf, normally returns PCR←ERes←okay.
*/
typedef PCR←ERes PCR←Cmd←CmdProc(
int argc,
const char **argv,
PCR←Cmd←GetCharProc *getCharProc,
PCR←Any getCharData,
PCR←Cmd←PrintProc *printProc,
PCR←Any printData,
PCR←Any data
);
/*
Registered command procedure.
*/
typedef PCR←ERes PCR←Cmd←EnumProc(
const char *cmdName,
PCR←Cmd←CmdProc *cmdProc,
PCR←Any cmdData,
const char *helpMsg,
PCR←Any data
);
/*
Callback proc passed to PCR←Cmd←Enumerate.
Called with all signals masked.
Must return (may not exit() or longjmp()).
Returning anything other than PCR←ERes←okay
terminates the enumeration.
*/
/*
* Procs
*/
extern void
PCR←Cmd←Register(
const char *cmdName,
PCR←Cmd←CmdProc *proc,
PCR←Any data,
const char *helpMsg
);
/*
Register a command proc / data pair.
String bodies of cmdName and helpMsg are shared, not copied.
Registering a NIL proc unregisters.
*/
extern PCR←ERes
PCR←Cmd←Lookup(
const char *cmdName,
PCR←Cmd←CmdProc **procp,
PCR←Any *datap,
const char **helpMsgp
);
/*
Lookup the named command.
Any of procp, datap or helpMsgp may be NIL.
*/
extern PCR←ERes
PCR←Cmd←Enumerate(
PCR←Cmd←EnumProc *enumProc,
PCR←Any data
);
/*
Enumerate all registered commands,
call enumProc on each,
return last result returned by enumProc.
(If enumProc ever returns other than PCR←ERes←okay the
enumeration terminates immediately).
*/
extern PCR←ERes
PCR←Cmd←Call(
const char *cmdName,
int argc,
const char **argv,
PCR←Cmd←GetCharProc *getCharProc,
PCR←Any getCharData,
PCR←Cmd←PrintProc *printProc,
PCR←Any printData,
PCR←Bool echo
);
/*
Call the named command.
Return its result,
or PCR←ERes←FromErr(ESRCH) if not found.
*/
extern PCR←ERes
PCR←Cmd←ReadEvalPrint(
PCR←Cmd←GetCharProc *getCharProc,
PCR←Any getCharData,
PCR←Cmd←PrintProc *printProc,
PCR←Any printData,
PCR←Bool echo,
PCR←Bool prompt
);
/*
Read-Eval-Print loop.
Return result of last command executed.
*/
extern PCR←ERes
PCR←Cmd←EvalPrint(
int argc, const char **argv,
PCR←Cmd←GetCharProc *getCharProc,
PCR←Any getCharData,
PCR←Cmd←PrintProc *printProc,
PCR←Any printData,
PCR←Bool echo
);
/*
Like ReadEvalPrint, but commands appear in argv
separated by ';'.
An initial backslash occuring in *(argv[i]) is removed,
but inhibits interpretation of semicolons; thus, recursion is
possible, with a command like
do-twice echo a \; do-twice echo b \\; echo c \; echo d ; echo e
producing
a b c b c d a b c b c d e
This differs from Unix(tm) shells in that the number of backslashes
grows linearly with the nesting depth rather than exponentially.
*/
extern PCR←Cmd←GetCharProc PCR←Cmd←FDGetCharProc;
extern PCR←Cmd←PrintProc PCR←Cmd←FDPrintProc;
/*
Standard read/write procs.
The data arg is a file descriptor: ((PCR←Any)(fd))
*/
/*
* Startup
*/
extern PCR←ERes
PCR←Cmd←Run(void);
#endif /* !←←PCR←Base←h */
/*
$Log$
*/