/* 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 /* * 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$ */