/* Copyright (c) 1993 Xerox Corporation. All rights reserved. */ /* $Id$ $Date$ * */ /* Chauser, October 28, 1993 3:33 pm PDT */ #ifndef ←←PCR←Base←h # define ←←PCR←Base←h 1 #include <config/PCR←StdTypes.h> #include <base/PCR←BaseArgs.h> #include <stdarg.h> /* * Startup */ extern /* readonly */ PCR←BaseArgs←Templates PCR←Base←startArgsTemplates; extern /* readonly */ const char * PCR←Base←cmdName; extern /* readonly */ int PCR←Base←startNArgs; extern /* readonly */ const char ** PCR←Base←startArgs; extern PCR←ERes PCR←Base←Start( const char * cmdName, int nArgs, const char ** args, PCR←ProcPtr proc, PCR←Any data, char *msgBuf, int msgBufLen ); /* Startup. The cmdName is used as a source of symbol information to initialize dynamic loading. It may be NIL, in which case dynamic loading is disabled (unless proc enables it using the PCR←IL.h interface). The args are used to configure PCR itself.. N.B. args[0] is *not* the command name. If arg parsing fails, or the startup fails for any other reason, return an error with an appropriate message stored in msgBuf. Otherwise, (*proc)(data) is invoked in an initial thread. If (*proc)(data) returns, the equivalent of PCR←Base←Exit(0) occurs. This call never returns successfully. */ /* * System message printing * * These may be called at any time, though it is not recommended * that they be used from threads for performance reasons. * * They are the *only* way to print before PCR←Base←Start has been called. * * The only format specifications allowed are * %c %s %d %o %x */ extern int PCR←Base←vsprintf(char *s, const char *fmt, va←list ap); extern int PCR←Base←sprintf(char *s, const char *fmt, ...); extern int PCR←Base←vprintf(const char *fmt, va←list ap); extern int PCR←Base←printf(const char *fmt, ...); extern int PCR←Base←Msg(const char *fmt, ...); /* * Shutdown */ extern void PCR←Base←AtExit( PCR←ProcPtr proc, PCR←Any data ); /* Registered AtExit procs are called by PCR←Base←Exit(...). ??? Is it okay to call AtExit before calling Start ??? */ extern void PCR←Base←Exit(int status); /* * Finding a full path name for an executable file */ typedef PCR←ERes PCR←Base←AccessProc(const char *path, PCR←Any data); extern PCR←ERes PCR←Base←FindFileUsingSearchRules( const char *cmdName, const char *cwd, char *buf, int buflen, PCR←Base←AccessProc access, PCR←Any accessData ); /* * PCR←Base←FindFileUsingSearchRues uses the OS-specific search rules * to try to find the full path name of a file with cmdName as its name. * The caller must supply the current working directory, and buf * into which the answer is stored (if it fits). The access procedure * should return PCR←ERes←okay if the path name given to it is * acceptable to the client. * Return values: * PCR←ERes←okay -- buf contains a path name accepted by accept * EINVAL -- relative cmdName and null cwd * EINVAL -- null buf or 0 buflen * ERANGE -- some enumerated full path wouldn't fit in buf */ /* * System panic messages. * * Avoid these except for catastrophic failures! */ typedef void PCR←Base←PanicFunc(const char *fmt, ...); extern PCR←Base←PanicFunc * PCR←Base←←Panic(const char *file, int line); extern void PCR←Base←Panic(const char *fmt, ...); #define PCR←Base←Panic \ (*(PCR←Base←←Panic(←←FILE←←, ←←LINE←←))) extern void PCR←Base←←NYI(const char *file, int line, PCR←Bool fatal); extern void PCR←Base←NYI(PCR←Bool fatal); #define PCR←Base←NYI(fatal) \ PCR←Base←←NYI(←←FILE←←, ←←LINE←←,(fatal)) #endif /* !←←PCR←Base←h */ /* $Log$ */