diff options
author | Andy Fiddaman <omnios@citrus-it.co.uk> | 2021-07-28 15:06:19 +0000 |
---|---|---|
committer | Andy Fiddaman <omnios@citrus-it.co.uk> | 2021-08-06 09:08:05 +0000 |
commit | 3636ae5408a4c1fb68954277f99be72f62e3489e (patch) | |
tree | a0e56c079c49fd9add7870dadd225c822880fe31 /usr/src/contrib | |
parent | fff4deb7386e037cc60d5c3d1560a378bec1bb6f (diff) | |
download | illumos-joyent-3636ae5408a4c1fb68954277f99be72f62e3489e.tar.gz |
13977 ksh93: stack robustness fixes
13976 contrib/ast: remove unreferenced man pages
Reviewed by: Dan McDonald <danmcd@joyent.com>
Reviewed by: Robert Mustacchi <rm@fingolfin.org>
Approved by: Gordon Ross <gordon.w.ross@gmail.com>
Diffstat (limited to 'usr/src/contrib')
61 files changed, 13 insertions, 12864 deletions
diff --git a/usr/src/contrib/ast/src/cmd/ksh93/sh/xec.c b/usr/src/contrib/ast/src/cmd/ksh93/sh/xec.c index a49640456e..2ae075a29d 100644 --- a/usr/src/contrib/ast/src/cmd/ksh93/sh/xec.c +++ b/usr/src/contrib/ast/src/cmd/ksh93/sh/xec.c @@ -503,8 +503,8 @@ int sh_debug(Shell_t *shp, const char *trap, const char *name, const char *subsc Stk_t *stkp=shp->stk; struct sh_scoped savst; Namval_t *np = SH_COMMANDNOD; - char *sav = stkptr(stkp,0); int n=4, offset=stktell(stkp); + char *sav = stkfreeze(stkp,0); const char *cp = "+=( "; Sfio_t *iop = stkstd; short level; @@ -559,7 +559,7 @@ int sh_debug(Shell_t *shp, const char *trap, const char *name, const char *subsc nv_putval(SH_FUNNAMENOD,shp->st.funname,NV_NOFREE); shp->st = savst; if(sav != stkptr(stkp,0)) - stkset(stkp,sav,0); + stkset(stkp,sav,offset); else stkseek(stkp,offset); return(n); @@ -990,7 +990,7 @@ int sh_exec(register const Shnode_t *t, int flags) int ntflag = 0; #endif int topfd = shp->topfd; - char *sav=stkptr(stkp,0); + char *sav=stkfreeze(stkp,0); char *cp=0, **com=0, *comn; int argn; int skipexitset = 0; diff --git a/usr/src/contrib/ast/src/lib/libast/man/LIBAST.3 b/usr/src/contrib/ast/src/lib/libast/man/LIBAST.3 deleted file mode 100644 index 380ebde2dc..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/LIBAST.3 +++ /dev/null @@ -1,98 +0,0 @@ -.fp 5 CW -.de Af -.if \\$2 .nr ;G \\$1 -.ie !\\$3 \{\ -\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" -\} -.. -.de aF -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" -.ft \\n(;G -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH LIBAST 3 -.UC 4 -.SH NAME -libast \- introduction to the ast library -.SH DESCRIPTION -This section describes the -.I AST -(AT&T Software Technology) library functions of the -.B libast -library. -.B libast -serves three major purposes. -First, it presents (a subset of) POSIX/ANSI standard headers and interfaces on -non-compliant systems. -Second, it provides a portable base of routines that implement concepts -common to all UNIX system variants. -Finally, it is a forum for -modern implementations of features present (or lacking) -in the standard C libraries. -Features better provided by separate libraries are omitted from -.BR libast . -For example, most terminal driver interface issues are left for -special purpose libraries such as -.IR curses (3). -.PP -The -.B libast -related header files are installed in the directories -.LR include/ast . -Routines that do not advertize their own headers are prototyped in -.LR <ast.h> . -.L <ast.h> -is ANSI, K&R and C++ compatible and includes or defines the equivalent of -.LR <limits.h> , -.LR <stddef.h> , -.LR <stdlib.h> , -.LR <sys/types.h> , -.L <string.h> -and -.LR <unistd.h> . -Other libraries that depend on -.B libast -may also have headers installed in the -.L include/ast -directories. -.SH FILES -.nf -include/ast the \fBast\fP package header directory -lib/libast.a the \fBlibast\fP library -lib/libast-g.a the \fBlibast\fP library compiled for debugging -lib/libast-pg.a the \fBlibast\fP library compiled for profiling -lib/libast.so.4.0 the \fBlibast\fP shared library -.fi -.SH "SEE ALSO" -intro(3), -intro(2), -cc(1) -.SH CAVEATS -The library documentation is still under construction. -Yes, some of it has been in this state for 20 years. -Thank goodness our commands self-document. diff --git a/usr/src/contrib/ast/src/lib/libast/man/aso.3 b/usr/src/contrib/ast/src/lib/libast/man/aso.3 deleted file mode 100644 index a9d077a159..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/aso.3 +++ /dev/null @@ -1,357 +0,0 @@ -.fp 5 CW -.TH LIBASO 3 -.SH NAME -\fBASO\fP \- Atomic Scalar Operations -.SH SYNOPSIS -.de Tp -.fl -.ne 2 -.TP -.. -.de Ss -.fl -.ne 2 -.SS "\\$1" -.. -.de Cs -.nf -.ft 5 -.. -.de Ce -.ft 1 -.fi -.. -.ta 1.0i 2.0i 3.0i 4.0i 5.0i -.Cs -#include <aso.h> -.Ce -.Ss "TYPES" -.Cs -typedef int (*Asoerror_f)(int, const char*); -typedef void* (*Asoinit_f)(void*, const char*); -typedef ssize_t (*Asolock_f)(void*, ssize_t, void volatile*); - -typedef struct Asodisc_s -{ - uint32_t version; - unsigned int hung; - Asoerror_f errorf; -} Asodisc_t; - -typedef struct Asometh_s -{ - const char* name; - int type; - Asoinit_f initf; - Asolock_f lockf; - const char* details; -} Asometh_t; -.Ce -.Ss "OPERATIONS" -.Cs -uint8_t asocas8(uint8_t volatile*, int, int); -uint8_t asoget8(uint8_t volatile*); -uint8_t asoinc8(uint8_t volatile*); -uint8_t asodec8(uint8_t volatile*); - -uint16_t asocas16(uint16_t volatile*, uint16_t, uint16_t); -uint16_t asoget16(uint16_t volatile*); -uint16_t asoinc16(uint16_t volatile*); -uint16_t asodec16(uint16_t volatile*); - -uint32_t asocas32(uint32_t volatile*, uint32_t, uint32_t); -uint32_t asoget32(uint32_t volatile*); -uint32_t asoinc32(uint32_t volatile*); -uint32_t asodec32(uint32_t volatile*); - -uint64_t asocas64(uint64_t volatile*, uint64_t, uint64_t); -uint64_t asoget64(uint64_t volatile*); -uint64_t asoinc64(uint64_t volatile*); -uint64_t asodec64(uint64_t volatile*); - -unsigned char asocaschar(unsigned char volatile*, int, int); -unsigned char asogetchar(unsigned char volatile*); -unsigned char asoincchar(unsigned char volatile*); -unsigned char asodecchar(unsigned char volatile*); - -unsigned short asocasshort(unsigned short volatile*, unsigned short, unsigned short); -unsigned short asogetshort(unsigned short volatile*); -unsigned short asoincshort(unsigned short volatile*); -unsigned short asodecshort(unsigned short volatile*); - -unsigned int asocasint(unsigned int volatile*, unsigned int, unsigned int); -unsigned int asogetint(unsigned int volatile*); -unsigned int asoincint(unsigned int volatile*); -unsigned int asodecint(unsigned int volatile*); - -unsigned long asocaslong(unsigned long volatile*, unsigned long, unsigned long); -unsigned long asogetlong(unsigned long volatile*); -unsigned long asoinclong(unsigned long volatile*); -unsigned long asodeclong(unsigned long volatile*); - -size_t asocassize(size_t volatile*, size_t, size_t); -size_t asogetsize(size_t volatile*); -size_t asoincsize(size_t volatile*); -size_t asodecsize(size_t volatile*); - -void* asocasptr(void volatile*, void*, void*); -void* asogetptr(void volatile*); - -void ASODISC(Asodisc_t*, Asoerror_f); -Asometh_t* asometh(int, void*); -int asoinit(const char*, Asometh_t*, Asodisc_t*); -int asolock(unsigned int volatile*, unsigned int, int); -int asoloop(uintmax_t); -int asorelax(long); -.Ce -.SH DESCRIPTION -.PP -\fIASO\fP provides functions to perform atomic scalar operations. -The functions on the type \f5uint32_t\fP will be fully described below. -Other functions work similarly on their respective types. -Some of the functions may be macros that call other functions. -64 bit operations are provided if the compiler supports 64 bit integers and/or pointers. -.PP -.Ss "TYPES" -.PP -\f5uint8_t, uint16_t, uint32_t, uint64_t\fP - -These are \fIunsigned integer\fP types of different sizes in bits. -For example, \f5uint32_t\fP represents the type of unsigned integer with 32 bits or 4 bytes. -.PP -.Ss "OPERATIONS" -.PP -.Ss " uint32_t asoget32(uint32_t* from);" -This function returns the value \f5*from\fP. -.PP -.Ss " uint32_t asoinc32(uint32_t* dest);" -.Ss " uint32_t asodec32(uint32_t* dest);" -These functions increment \f5*dest\fP by 1 and decrement \f5*dest\fP by 1 in an atomic step. -The return value is the old value in \f5*dest\fP. - -Consider an example where two concurrent threads/processes call \f5asoinc32()\fP -on the same \f5dest\fP with values, say \fIv1\fP and \fIv2\fP. -The eventual value in \f5dest\fP -will be as if \f5*dest += 2\fP was performed in a single-threaded execution. - -That should be constrasted with a situation where, instead of \f5asoinc32()\fP or \f5asodec32()\fP, -only normal increment (++) or decrement (--) were used. -Then, the end result could be either \f5*dest += 1\fP or \f5*dest += 2\fP, -depending on states of the hardware cache and process scheduling. -.PP -.Ss " uint32_t asocas32(uint32_t* dest, uint32_t tstval, uint32_t newval);" -This function provides the atomic \fIcompare-and-swap\fP operation. -If the current content of \f5dest\fP is equal to \f5tstval\fP then it will be set to \f5newval\fP. -If multiple threads/processes are performing the same operations only one will succeed with a -return value of \f5tstval\fP. -The return value is the old value in \f5*dest\fP. -.PP -.Ss " void asorelax(long nsec)" -This function causes the calling process or thread to briefly pause -for \f5nsec\fP nanoseconds. -It is useful to implement tight loops that occasionally yield control. -.PP -.Ss " int asolock(unsigned int* lock, unsigned int key, int type)" -This function uses \f5key\fP, a non-zero unsigned integer, to lock or unlock the \f5lock\fP. -It returns \f50\fP on success and \f5-1\fP on failure. -The argument \f5type\fP can take one of the following values: -.Tp -\f5ASO_UNLOCK\fP: -This unlocks the lock if it was locked with \f5key\fP. It is an error to try -unlocking a lock of a different key. -.Tp -\f5ASO_TRYLOCK\fP: -This makes a single attempt to use the given \f5key\fP to acquire a lock. -An error will result if the lock is already locked with a different key. -.Tp -\f5ASO_LOCK\fP: -This is a regular locking call. If the lock is locked with a different key, -this call will wait until the lock is open, then lock it with the given \f5key\fP. -.Tp -\f5ASO_SPINLOCK\fP: -Regardless of what key is currently locking the lock, -this call will always wait until the lock is open, then lock it with the given \f5key\fP. -Note that, if the lock is already locked with \f5key\fP, this call can result -in a deadlock unless that lock can be opened by some other mechanism, e.g., -by a different process or thread. -.PP -.Ss " int asoloop(uintmax_t iteration);" -This function is used to implement spin locks that periodically relinquish the processor: -.Cs -uintmax_t iteration; -iteration = 0; -for (;;) { - /* test resource with an aso*() call */ - if (asoloop(++iteration)) - /* an error occurred */; -} -.Ce -The value of \f5iteration\fP should be \f51\fP (\fInot\fP \f50\fP) for the first loop iteration. -\f50\fP is returned on success, \f5-1\fP on failure. -If \f5iteration mod 4\fP is \f50\fP then \f5asorelax(1)\fP is called to temporarily relinquish -the processor. -If \f5Asodisc_t.hung != 0\fP and \f5Asodisc_t.errorf != 0\fP and -\f5iteration mod (2**Asodisc_t.hung-1)\fP is \f50\fP, -then \f5Asodisc_t.errorf\fP is called with type \f5ASO_HUNG\fP -and \f5-1\fP is returned. -.PP -.Ss "DISCIPLINE" -.PP -The Asodisc_t discipline structure allows the caller to modify default behavior. -The \fIASO\fP discipline is global for all threads and forked children of the current process. -The discipline is set and modified by the \f5asoinit()\fP function, described below. -The structure members are: -.Tp -\f5uint32_t version;\fP -This must be set to \f5ASO_VERSION\fP by the caller and is used by the implementation to detect -release differences between the caller and the implementation. -The version is integer of the form \fIYYYYMMDD\fP where \fIYYYY\fP is the release year, \fIMM\fP -is the release month, and \fIDD\fP is the release day of month. -This allows the implementation to be forwards and backwards binary compatible with all releases. -.Tp -\f5unsigned int hung;\fP -An error occurs if \f5asoloop\fP() is called \f52**Asometh_t.hung\fP times without gaining access to the loop resource. -The default value \f50\fP disables the test. -.Tp -\f5Asoerror_f errorf;\fP -\f5int (*errorf)(int type, const char* mesg);\fP -If \f5errorf\fP != \f50\fP then it is called for each \fIASO\fP fatal library condition. -\f5type\fP may be one of: \f5ASO_METHOD\fP - a method error; \f5ASO_HUNG\fP - \f5asoloop\fP() was called -\f52**Asometh_t.hung\fP times with no access to the loop resource. -\f5mesg\fP is a 0-terminated messsage description. -.Ss " void ASODISC(Asodisc_t* disc, Asoerror_f errorf);" -.PP -This function-like-macro initializes \f5disc->version = ASO_VERSION\fP, \f5disc->errorf = errorf\fP, -and the remaining \f5disc\fP members to \f50\fP. -.PP -.Ss "METHODS" -.PP -Several atomic locking methods are implemented for atomic operations -not supported by \fIintrinsic\fP functions or assembly instructions. -Methods are controlled by the \f5asometh()\fP and \f5asoinit()\fP -functions, described below. -The \fIASO\fP method is global for all threads and forked children of the current process. -A given method may have multiple types. -The methods types are: -.Tp -\f5ASO_INTRINSIC\fP: -Some hardware platforms provide machine instructions to implement these operations directly. -In that case, if a local compiler permits, calls to these \fIintrinsic\fP functions -may be translated directly into their corresponding machine instructions. -When necessary the implementation can use only the intrinsic \fIcompare-and-swap\fP -function on the largest integer type to emulate all other \fIASO\fP operations. -The \f5ASO_INTRINSIC\fP method type is the default when supported by the compiler. -It may be used for single-process single-thread, multi-thread, and -multi-process applications. -When supported by the hardware / compiler, the library provides the "\fBintrinsic\fP" method with type -\f5ASO_INTRINSIC|ASO_PROCESS|ASO_THREAD|ASO_SIGNAL\fP. -.Tp -\f5ASO_SIGNAL\fP: -This method type is suitable only for single-process single-thread applications. -It can be used to provide locking between asyncronous \fBsignal\fP(2) handlers -and the main program. -The library provides the "\fBsignal\fP" method with type \f5ASO_SIGNAL\fP. -This is the default method type when \f5ASO_INTRINSIC\fP is not supported. -.Tp -\f5ASO_THREAD\fP: -This method type is suitable for single-process single-thread, and multi-thread applications. -It typically requires thread library support, and since the default \f5aso\fP library -is not linked with a thread library, no \f5ASO_THREAD\fP method is provided by default. -Threaded applications must link with \fB-ltaso\fP (before \fB-laso\fP or \fB-last\fP) -in order to access \f5ASO_THREAD\fP methods. -The \fB-ltaso\fP library provides the "\fBspin\fP" (using \fBpthread_spin_lock\fP(3)) and -"\fBmutex"\fP (using \fBpthread_mutex_lock\fP(3)) methods with type \f5ASO_THREAD|ASO_SIGNAL\fP. -.Tp -\f5ASO_PROCESS\fP: -This method type is suitable for single-process single-thread, and multi-process applications. -Some \f5ASO_PROCESS\fP methods may also be suitable for multi-thread applications (if they have the \f5ASO_THREAD\fP type.) -These methods are typically and noticably \fIslow\fP, up to 2 orders of magnitude slower than -\f5ASO_INTRINSIC\fP for some applications. -They are provided as a last resort when other methods are not available. -The library provides the "\fBsemaphore\fP" method with type \f5ASO_PROCESS|ASO_THREAD|ASO_SIGNAL\fP -and the "\fBfcntl\fP" method with type \f5ASO_PROCESS|ASO_SIGNAL\fP. - -.Ss " Asometh_t* asometh(int type, void* data);" -This function looks up methods by type or name. -If type is \f50\fP and \f5data\fP is \f50\fP then the current method is returned; a valid method -will always be returned for this call. -If type is \f50\fP then \f5data\fP is treated as a \f50\fP-terminated string method name; -\f50\fP is returned if no matching method is found. -The pseudo-type \f5ASO_NEXT\fP generates the list of all methods in successive calls: -.Cs -Asometh_t* meth; -meth = 0; -while (meth = asometh(ASO_NEXT, meth)) - /* examine meth->... */ -.Ce -Otherwise if \f5type\fP is not \f50\fP and not \f5ASO_NEXT\fP it is treated as a combination of the ordered types -\f5ASO_THREAD\fP, \f5ASO_SIGNAL\fP, \f5ASO_INTRINSIC\fP, \f5ASO_PROCESS\fP: -the first method with \f5(meth->type & type) != 0\fP is returned; -\f50\fP is returned if no matching method is found. - -Method names are treated as a name, optionally followed by a list of -\fB,\fP\fIname\fP=\fIvalue\fP details, and optionally ending with \fB,\fP\fIpathname\fP. -The \fBsemaphore\fP method uses \fBsize\fP=\fInumber\fP to specify -the number of semaphores and hashes \fIpathname\fP to determine the semaphore IPC key. -The \fBfcntl\fP method uses \fBsize\fP=\fInumber\fP to specify -the number of 1 byte file locks and uses \fIpathname\fP as the -file to lock using \f5fcntl(F_SETLCK[W])\fP. - -.Ss " int asoinit(const char* details, Asometh_t* meth, Asodisc_t* disc);" -This function sets the global discipline to \f5disc\fP, -closes the current method (releasing its resources), -temporarily instantiates the default method -(either \f5ASO_INTRINSIC\fP if available or \f5AS_SIGNAL\fP otherwise), -and initializes \f5meth\fP and instantiates it as the new method. -If \f5disc\fP is \f50\fP the the global discpline is not modified. -If \f5meth\fP is \f50\fP then \f51\fP is returned if \f5asoinit()\fP has -already been called to initialize a method, otherwise \f50\fP is returned. -If \f5meth->lockf\fP is \f50\fP and \f5(meth->type & ASO_INTRINSIC) != 0\fP -then \f5-1\fP is returned and the current method is not changed. -If an error occurs instantiating \f5meth\fP then the current method is -set to the default and \f5-1\fP is returned. -Otherwise \f50\fP is returned on success. - -Method resources are released by the next \f5asometh()\fP call, -or by an \fIASO\fP cleanup function called via \f5atexit\fP(2). -System global method resources are released on last use; -this includes removing semaphore keys or -physical files that may be used by some methods. -In some cases \fIASO\fP maintains reference counts within -the resource to determine last use. - -An application requiring a specific method must check the default method before -using any \fIASO\fP operations. For example, a threaded application would -do something like this: -.Cs -void* data = 0 /* \fIor\fP a method name string with optional details */ -Asometh_t* meth; -if (data || !(asometh(0, 0)->type & (ASO_INTRINSIC|ASO_THREAD))) { - if (!(meth = asometh(ASO_INTRINSIC|ASO_THREAD, data))) - /* error -- suitable method not found */; - else if (asoinit(meth, 0, 0, ASO_VERSION)) - /* error -- method initialization error */; -} -/* ready for \fIASO\fP operaions */ -.Ce -A multi-process application would check for \f5(ASO_INTRINSIC|ASO_PROCESS)\fP -instead of \f5(ASO_INTRINSIC|ASO_THREAD)\fP. - -.PP -.SH IMPLEMENTATION NOTES -Unlike other \fIAST\fP library discipline/method functions which can instantiate -multiple discpline/method handles within a single process, the \fIASO\fP -library allows only one discipline and method to be set at a time, with the additional -restriction that it may only be set by the main and only thread of the calling process. -For this reason there is no open/close interface with an instantation handle; -instead the global discipline/method is simply initialized by \f5asoinit()\fP. - -\f5ASO_THREAD\fP and \f5ASO_PROCESS\fP methods rely on the \f5Asometh_t.lockf()\fP -being sufficiently "heavy" to flush the calling thread/process memory cache -so the subsequent \fIASO\fP operation operates on the physical memory location -instead of the cached location. There is currently no other portable mechanism -that guarantees this other than the \f5ASO_INTRINSIC\fP method. - -.PP -.SH AUTHOR -Kiem-Phong Vo, Adam Edgar, and Glenn Fowler diff --git a/usr/src/contrib/ast/src/lib/libast/man/ast.3 b/usr/src/contrib/ast/src/lib/libast/man/ast.3 deleted file mode 100644 index 8055be9dbc..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/ast.3 +++ /dev/null @@ -1,283 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH AST 3 -.SH NAME -ast \- miscellaneous libast support -.SH SYNOPSIS -.EX -#include <ast.h> - -char* astconf(const char* \fIname\fP, const char* \fIpath\fP, const char* \fIvalue\fP); -Ast_confdisc_t astconfdisc(Ast_confdisc_t new_notify); -void astconflist(Sfio_t* stream, const char* path, int flags); -off_t astcopy(int \fIrfd\fP, int \fIwfd\fP, off_t \fIn\fP); -int astquery(int \fIfd\fP, const char* \fIformat\fP , ...); -.EE -.SH DESCRIPTION -.L astconf -is a string interface to the -.IR confstr (2), -.IR pathconf (2), -and -.IR sysconf (2) -calls. -If -.I value -is -.L 0 -then the configuration parameter value for -.I name -is returned. -Some -.I name -configuration parameters may consult the -.I path -argument. -In this case if -.I path -is -.L 0 -then -\f5"/"\fP -is used. -Otherwise if -.I path -is not -.L 0 -then it must exist. -The string return value for -.I name -remains unchanged until the next -.L astconf -call on -.IR name . -If -.I value -is -.L 0 -then a valid string is always returned; -\f5""\fP -is returned if -.I name -has no configuration value. -This simplifies the programming interface: -.EX -if (!strcmp(astconf("PATH_RESOLVE", NiL, NiL), "logical")) - /* the logical way ... */ -.EE -If -.I value -is not -.L 0 -then the configuration parameter value for -.I name -is set to -.IR value . -.L 0 -is returned if the value cannot be set. -The paradigm is: -.EX -universe = astconf("UNIVERSE", 0, "att"); -\|.\|.\|. -astconf("UNIVERSE", 0, universe); -.EE -The settable configuration names are: -.TP -.L FS_3D -.L 1 -if -.IR 3d (1) -viewpathing is enabled, -.L 0 -otherwise. -This is an alternative to the -.IR fs3d (3) -interface. -.TP -.L PATH_RESOLVE -.L logical -if symbolic links are followed during file tree traversal, -.L physical -if symbolic links are not followed during file tree traversal, -and -.L metaphysical -if symbolic links are followed at the top level during file tree traversal. -These correspond to the generic -.LR \-L , -.LR \-P , -and -.L \-H -command options. -.TP -.L UNIVERSE -.L ucb -for -.I Berkeley -style and -.L att -otherwise. -This configuration parameter controls the -.I universe -setting on machines that support it (e.g., Pyramid). -.L UNIVERSE -also controls the behavior of some commands like -.IR cat (1) -and -.IR echo (1). -.PP -User defined -.I name -values may also be set and queried, but these should probably have -some form of vendor prefix to avoid being stomped by future standards. -.PP -.L astconfdisc -registers a discipline function -.EX -int (*notify)(const char* \fIname\fP, const char* \fIpath\fP, const char* \fIvalue\fP); -.EE -that is called just before the configuration parameter -.I name -is set to -.I value -relative to -.IR path . -If -.I notify -returns -.L 0 -then the configuration parameter value is not changed. -.PP -.L astconflist -lists the current configuration names and values of -.IR stream . -If -.I path -is -.L 0 -then \f5"/"\fP is used where appropriate. -If -.I flags -is -.L 0 -or -.L R_OK|W_OK -then all configuration parameters are listed. -.L R_OK -lists the readonly configuration parameters and -.L W_OK -lists the settable configuration parameters. -.L X_OK -lists the settable configuration parameters in a form that can be -snarfed for input to the -.IR getconf (1) -command. -.PP -.L astcopy -efficiently copies up to -.I n -bytes from the file descriptor -.I rfd -to the file descriptor -.IR wfd . -The actual number of bytes copied is returned; \-1 is returned on error. -If -.I n -is 0 then an optimal number of bytes (with respect to both -.I rfd -and -.IR wfd ) -is copied. -.PP -If possible -.IR mmap (2) -is used to do the transfer. -Some implementations may bypass user buffer copies usually required by the -.IR read (2)- write (2) -paradigm. -.PP -.L astquery -outputs an -.IR sfprintf (3) -prompt specified by -.I "format, .\|.\|." -to the controlling terminal and reads a response from the controlling terminal. -Offirmative response returns -.LR 0 , -.L EOF -or quit response returns -.LR \-1 , -otherwise -.L 1 -is returned. -If -.I quit -is greater than -.L 0 -then -.I exit(quit) -is called on a quit response. -The responses will eventually be locale specific. -.PP -.L astwinsize -returns the number of rows in -.I *rows -and the number of columns -.I *col -for the terminal file descriptor -.IR fd . -If the number of rows or columns cannot be determined or if -.I fd -is not a terminal then -.I *rows -and -.I *cols -are set to -.LR 0 . -If -.I ioctl (2) -methods fail then the environment variable -.L LINES -is used to set -.I *rows -and the environment variable -.L COLUMNS -is used to set -.IR *cols . -.SH "SEE ALSO" -getconf(1), confstr(2), mmap(2), pathconf(2), read(2), sysconf(2), write(2) diff --git a/usr/src/contrib/ast/src/lib/libast/man/astsa.3 b/usr/src/contrib/ast/src/lib/libast/man/astsa.3 deleted file mode 100644 index 5b588a8ebe..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/astsa.3 +++ /dev/null @@ -1,161 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.PP -.. -.de Tp -.fl -.ne 3 -.TP -.. -.de Ss -.fl -.ne 3 -.SS "\\$1" -.. -.ta 1.0i 2.0i 3.0i 4.0i 5.0i -.TH ASTSA 3 -.SH NAME -astsa \- standalone libast support -.SH SYNOPSIS -.EX -#include <ast.h> -#include <ccode.h> -#include <error.h> -#include <option.h> -#include <stk.h> -.EE -.SH DESCRIPTION -.B astsa -is a standalone subset of -.BR ast (3) -that requires only -.BR cdt (3) -and -.BR sfio (3). -.PP -.B <ast.h> -includes -.BR <ast_common.h> , -.B <stdarg.h> -or -.BR <varargs.h> , -.BR <sfio.h> , -.BR <limits.h> , -and -.B <limits.h> -and -.B <unistd.h> -if supported by the local system. -.PP -The macros and functions provided by -.B <ast.h> -are described below. -The other headers are described in -.BR ccode (3), -.BR error (3), -.BR optget (3), -and -.BR stk (3). -.SH MACROS -.Ss "size_t elementsof(\fIx\fP)" -Evaluates to the number of elements in the array variable -.IR x . -.Ss "\fItype\fP* newof(void* old, \fItype\fP, size_t \fIelements\fP, size_t \fIextra\fP)" -Equivalent to (\fItype\fP*)realloc((char*)\fIold\fP,sizeof(\fItype\fP)*\fIelements\fP+\fIextra\fP) -if \fIold\fP!=0 and -(\fItype\fP*)calloc(1,sizeof(\fItype\fP)*\fIelements\fP+\fIextra\fP) -otherwise. -.Ss "\fItype\fP* oldof(void* old, \fItype\fP, size_t \fIelements\fP, size_t \fIextra\fP)" -Equivalent to (\fItype\fP*)realloc((char*)\fIold\fP,sizeof(\fItype\fP)*\fIelements\fP+\fIextra\fP) -if \fIold\fP!=0 and -(\fItype\fP*)malloc(1,sizeof(\fItype\fP)*\fIelements\fP+\fIextra\fP) -otherwise. -.Ss "size_t roundof(\fIx\fP,\fIy\fP)" -Evaluates to \fIx\fP rounded up to the next power of 2 boundary \fIy\fP. -.Ss "int ssizeof(\fIx\fP)" -Equivalent to (int)sizeof(\fIx\fP). -.Ss "int streq(\fIa\fP,\fIb\fP)" -Equivalent to (*(\fIa\fP)==*(\fIb\fP)&&strcmp(\fIa\fP,\fIb\fP)==0). -.Ss "int strneq(\fIa\fP,\fIb\fP,\fIn\fP)" -Equivalent to (*(\fIa\fP)==*(\fIb\fP)&&strncmp(\fIa\fP,\fIb\fP,\fIn\fP)==0). -.SH FUNCTIONS -.Ss "void astwinsize(int \fIfd\fP, int* \fIplines\fP, int* \fIpcolumns\fP)" -If \fIplines\fP!=0 then *\fIplines\fP is set to the number of lines on the -tty device corresponding to \fIfd\fP. -If \fIpcolumns\fP!=0 then *\fIpcolumns\fP is set to the number of columns -on the tty device corresponding to \fIfd\fP. -The default if \fIfd\fP is not a terminal device, or if \fIfd\fP queries fail, -is 24 lines and 80 columns. -.Ss "char* fmterror(int \fIerrno\fP)" -Returns the error message text corresponding to the -.BR errno (3) -\fIerrno\fP. -.Ss "char* strerror(int \fIerrno\fP)" -Equivalent to fmterror(\fIerrno\fP). -.Ss "int strgrpmatch(const char* \fIstring\fP, const char* \fIpattern\fP, int* \fIsub\fP, int \fInsub\fP, int \fIflags\fP)" -Matches the null terminated \fIstring\fP against the null terminated -.BR ksh (1) -augmented \fIpattern\fP. -If \fIsub\fP!=0 then \fIsub\fP[2*\fIi\fP] is set to the start offset and \fIsub\fP[2*\fIi\fP+1] is set -to the end offset of the \fIi\fP-th parenthesized subexpression. -\fInsub\fP is 1/2 the number of elements in \fIsub\fP. -\fIflags\fP controls the matching: -.Tp -\f5STR_MAXIMAL\fP: -Maximal match. -The default is minimal (first) match. -.Tp -\f5STR_LEFT\fP: -Implicit left anchor. -.Tp -\f5STR_RIGHT\fP: -Implicit right anchor. -.Tp -\f5STR_ICASE\fP: -Ignore case. -.Tp -\f5STR_GROUP\fP: -(|&) inside [@|*|+{n,m}](...) only. -.Ss "int strmatch(const char* \fIstring\fP, const char* \fIpattern\fP, int* \fIsub\fP, int \fInsub\fP, int \fIflags\fP)" -Equivalent to strgrpmatch(\fIstring\fP,\fIpattern\fP,0,0,STR_MAXIMAL|STR_LEFT|STR_RIGHT). -.SH "SEE ALSO" -.BR ast (3), -.BR ccode (3), -.BR cdt (3), -.BR error (3), -.BR malloc (3), -.BR option (3), -.BR sfio (3), -.BR stk (3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/cdt.3 b/usr/src/contrib/ast/src/lib/libast/man/cdt.3 deleted file mode 100644 index 46bfe13092..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/cdt.3 +++ /dev/null @@ -1,617 +0,0 @@ -.fp 5 CW -.TH LIBCDT 3 -.SH NAME -\fBCdt\fR \- container data types -.SH SYNOPSIS -.de Tp -.fl -.ne 2 -.TP -.. -.de Ss -.fl -.ne 2 -.SS "\\$1" -.. -.de Cs -.nf -.ft 5 -.. -.de Ce -.ft 1 -.fi -.. -.ta 1.0i 2.0i 3.0i 4.0i 5.0i -.Cs -#include <cdt.h> -.Ce -.Ss "DICTIONARY TYPES" -.Cs -Void_t*; -Dt_t; -Dtdisc_t; -Dtmethod_t; -Dtlink_t; -Dtstat_t; -.Ce -.Ss "DICTIONARY CONTROL" -.Cs -Dt_t* dtopen(const Dtdisc_t* disc, const Dtmethod_t* meth); -int dtclose(Dt_t* dt); -void dtclear(dt); -Dtdisc_t* dtdisc(Dt_t* dt, const Dtdisc_t* disc, int type); -Dtmethod_t* dtmethod(Dt_t* dt, const Dtmethod_t* meth); -Dt_t* dtview(Dt_t* dt, Dt_t* view); -int dtcustomize(Dt_t* dt, int type, Void_t* arg); -int dtoptimize(Dt_t* dt); -int dtshare(Dt_t* dt, int type); -int dtlock(Dt_t* dt, unsigned int key, int type); -.Ce -.Ss "STORAGE METHODS" -.Cs -Dtmethod_t* Dtset; -Dtmethod_t* Dtbag; -Dtmethod_t* Dtrhset; -Dtmethod_t* Dtrhbag; -Dtmethod_t* Dtoset; -Dtmethod_t* Dtobag; -Dtmethod_t* Dtlist; -Dtmethod_t* Dtstack; -Dtmethod_t* Dtqueue; -Dtmethod_t* Dtdeque; -.Ce -.Ss "DISCIPLINE" -.Cs -#define DTOFFSET(struct_s,member) -#define DTDISC(disc,key,size,link,makef,freef,comparf,hashf,memoryf,eventf) -typedef Void_t* (*Dtmake_f)(Dt_t*, Void_t*, Dtdisc_t*); -typedef void (*Dtfree_f)(Dt_t*, Void_t*, Dtdisc_t*); -typedef int (*Dtcompar_f)(Dt_t*, Void_t*, Void_t*, Dtdisc_t*); -typedef unsigned int (*Dthash_f)(Dt_t*, Void_t*, Dtdisc_t*); -typedef Void_t* (*Dtmemory_f)(Dt_t*, Void_t*, size_t, Dtdisc_t*); -typedef int (*Dtevent_f)(Dt_t*, int, Void_t*, Dtdisc_t*); -.Ce -.Ss "OBJECT OPERATIONS" -.Cs -Void_t* dtinsert(Dt_t* dt, Void_t* obj); -Void_t* dtappend(Dt_t* dt, Void_t* obj); -Void_t* dtdelete(Dt_t* dt, Void_t* obj); -Void_t* dtattach(Dt_t* dt, Void_t* obj); -Void_t* dtdetach(Dt_t* dt, Void_t* obj); -Void_t* dtsearch(Dt_t* dt, Void_t* obj); -Void_t* dtmatch(Dt_t* dt, Void_t* key); -Void_t* dtfirst(Dt_t* dt); -Void_t* dtnext(Dt_t* dt, Void_t* obj); -Void_t* dtlast(Dt_t* dt); -Void_t* dtprev(Dt_t* dt, Void_t* obj); -Void_t* dtleast(Dt_t* dt, Void_t* obj); -Void_t* dtmost(Dt_t* dt, Void_t* obj); -int dtwalk(Dt_t* dt, int (*userf)(Dt_t*, Void_t*, Void_t*), Void_t*); -Dtlink_t* dtflatten(Dt_t* dt); -Dtlink_t* dtlink(Dt_t* dt, Dtlink_t* link); -Void_t* dtobj(Dt_t* dt, Dtlink_t* link); -Dtlink_t* dtextract(Dt_t* dt); -Dtlink_t* dtrestore(Dt_t* dt, Dtlink_t* link); -.Ce -.Ss "DICTIONARY STATUS" -.Cs -Dt_t* dtvnext(Dt_t* dt); -ssize_t dtvcount(Dt_t* dt); -Dt_t* dtvhere(Dt_t* dt); -ssize_t dtsize(Dt_t* dt); -ssize_t dtstat(Dt_t* dt, Dtstat_t* st); -.Ce -.Ss "HASH FUNCTIONS" -.Cs -unsigned int dtstrhash(unsigned int h, char* str, int n); -unsigned int dtcharhash(unsigned int h, unsigned char c); -.Ce -.SH DESCRIPTION -.PP -\fICdt\fP manages run-time dictionaries using standard container data types: -unordered set/multiset, ordered set/multiset, list, stack, and queue. -.PP -.Ss "DICTIONARY TYPES" -.PP -.Ss " Void_t*" -This type is used to pass objects between \fICdt\fP and application code. -\f5Void_t\fP is defined as \f5void\fP for ANSI-C and C++ -and \f5char\fP for older C compilation environments. -.PP -.Ss " Dt_t" -This is the type of a dictionary handle. -.PP -.Ss " Dtdisc_t" -This defines the type of a discipline structure which define the lay-out of -an object and functions to compare, hash, make, delete objects, etc. (see \f5dtdisc()\fP). -.PP -.Ss " Dtmethod_t" -This defines the type of a container method. -.PP -.Ss " Dtlink_t" -This is the type of a dictionary object holder (see \f5dtdisc()\fP.) -.PP -.Ss " Dtstat_t" -This is the type of a structure to return dictionary statistics (see \f5dtstat()\fP.) -.PP -.Ss "DICTIONARY CONTROL" -.PP -.Ss " Dt_t* dtopen(const Dtdisc_t* disc, const Dtmethod_t* meth)" -This creates a new dictionary. -\f5disc\fP is a discipline structure to describe object format. -\f5meth\fP specifies a manipulation method. -\f5dtopen()\fP returns the new dictionary or \f5NULL\fP on error. -See also the events \f5DT_OPEN\fP and \f5DT_ENDOPEN\fP below. -.PP -.Ss " int dtclose(Dt_t* dt)" -This deletes \f5dt\fP and its objects. -Note that \f5dtclose()\fP fails if \f5dt\fP is being viewed by -some other dictionaries (see \f5dtview()\fP). -\f5dtclose()\fP returns \f50\fP on success and \f5-1\fP on error. -See also the events \f5DT_CLOSE\fP and \f5DT_ENDCLOSE\fP below. -.PP -.Ss " void dtclear(Dt_t* dt)" -This deletes all objects in \f5dt\fP without closing \f5dt\fP. -.PP -.Ss " Dtdisc_t* dtdisc(Dt_t* dt, const Dtdisc_t* disc, int type)" -If \f5disc\fP is \f5NULL\fP, \f5dtdisc()\fP returns the current discipline. -Otherwise, it changes the discipline of \f5dt\fP to \f5disc\fP. -Objects may be rehashed, reordered, or removed as appropriate. -\f5type\fP can be any bit combination of \f5DT_SAMECMP\fP and \f5DT_SAMEHASH\fP. -\f5DT_SAMECMP\fP means that objects will compare exactly the same as before -thus obviating the need for reordering or removing new duplicates. -\f5DT_SAMEHASH\fP means that hash values of objects remain the same -thus obviating the need to rehash. -\f5dtdisc()\fP returns the previous discipline on success -and \f5NULL\fP on error. -.PP -.Ss " Dtmethod_t dtmethod(Dt_t* dt, const Dtmethod_t* meth)" -If \f5meth\fP is \f5NULL\fP, \f5dtmethod()\fP returns the current method. -Otherwise, it changes the storage method of \f5dt\fP to \f5meth\fP. -Objects may be rehashed, reordered, or removed as appropriate. -\f5dtmethod()\fP returns the previous method or \f5NULL\fP on error. -.PP -.Ss " Dt_t* dtview(Dt_t* dt, Dt_t* view)" -A viewpath allows a search or walk starting from a dictionary to continue to another. -\f5dtview()\fP first terminates any current view from \f5dt\fP to another dictionary. -Then, if \f5view\fP is \f5NULL\fP, \f5dtview\fP returns the terminated view dictionary. -If \f5view\fP is not \f5NULL\fP, a viewpath from \f5dt\fP to \f5view\fP is established. -\f5dtview()\fP returns \f5dt\fP on success and \f5NULL\fP on error. -.PP -It is an error to have dictionaries on a viewpath with different storage methods. -In addition, dictionaries on the same view path should -treat objects in a consistent manner with respect to comparison or hashing. -If not, undefined behaviors may result. -.PP -.Ss " int dtcustomize(Dt_t* dt, int type, Void_t* arg)" -This customizes a storage method. The \f5type\fP argument -indicates the type of customization and \f5arg\fP gives additional -information for the operation. Here are the types: -.Tp -\f5DT_SHARE\fP: -This turns on/off the share mode for a dictionary. -Concurrent accesses of a dictionary not in share mode -may exhibit undefined behaviors including memory segmentation. - -Share mode allows multiple accessors, threads or processes, to access objects. -Such objects could be in the same directory in the case of threads or shared -memory in the case of processes. -.Tp -\f5DT_OPTIMIZE\fP: -This causes the underlying method to optimize its internal -data structure. For example, the splay tree underlying \f5Dtoset\fP -would be balanced. -.PP -.Ss " int dtoptimize(Dt_t* dt)" -This is a short-hand for invoking \f5dtcustomize()\fP with the \f5DT_OPTIMIZE\fP event. -.PP -.Ss " int dtshare(Dt_t* dt, int type)" -This turns on or off share mode for dictionary \f5dt\fP depending on whether \f5type\fP -is positive or non-positive. It returns -1 on failure. -.PP -.Ss " int dtlock(Dt_t* dt, unsigned int key, int type)" -This globally locks/unlocks a dictionary using the given \f5key\fP. -It returns 0 on success and -1 on failure. -The value of \f5key\fP must not be 0. -The argument \f5type\fP is used as follows: -.Tp -\f5type < 0\fP: -Unlock the dictionary if it was locked with \f5key\fP. -An error will result if the dictionary was locked with a different key. -.Tp -\f5type == 0\fP: -Attempt to lock the dictionary with \f5key\fP if it is unlocked. -An error will result if the dictionary was already locked with a different key. -.Tp -\f5type > 0\fP: -Attempt to lock the dictionary with \f5key\fP. -If the dictionary is already locked with a different key, -the call will loop and wait until the lock is open to lock it. - -.PP -.Ss "STORAGE METHODS" -.PP -Storage methods are of type \f5Dtmethod_t*\fP. -\fICdt\fP supports the following methods: -.PP -.Ss " Dtoset" -.Ss " Dtobag" -Objects are ordered by comparisons. -\f5Dtoset\fP keeps unique objects. -\f5Dtobag\fP allows repeatable objects. -.PP -.Ss " Dtset" -.Ss " Dtbag" -Objects are unordered. -\f5Dtset\fP keeps unique objects. -\f5Dtbag\fP allows repeatable objects. -The underlying data structure is a hash table with chaining to handle collisions. -.PP -.Ss " Dtrhset" -.Ss " Dtrhbag" -These methods are like \f5Dtset\fP and \f5Dtbag\fP but are based on -a recursive hashing data structure that allows table extension without -object relocation. The data structure also supports lock-free -concurrent search operations for share dictionaries. -.PP -.Ss " Dtlist" -Objects are kept in a list. -\fIA current object\fP is always defined to be either the head of -the list or an object resulting from a recent search or insert operation. -The call \f5dtinsert()\fP will insert a new object -in front of such a current object -while the call \f5dtappend()\fP will append in back of it. -.PP -.Ss " Dtdeque" -Objects are kept in a deque. This is similar to \f5Dtlist\fP -except that objects are always inserted at the front and appended at the tail -of the list. -.PP -.Ss " Dtstack" -Objects are kept in a stack, i.e., in reverse order of insertion. -Thus, the last object inserted is at stack top -and will be the first to be deleted. -.PP -.Ss " Dtqueue" -Objects are kept in a queue, i.e., in order of insertion. -Thus, the first object inserted is at queue head -and will be the first to be deleted. -.PP -.Ss "DISCIPLINE" -.PP -Object format and associated management functions are -defined in the type \f5Dtdisc_t\fP: -.Cs - typedef struct - { ssize_t key, size; - ssize_t link; - Dtmake_f makef; - Dtfree_f freef; - Dtcompar_f comparf; - Dthash_f hashf; - Dtmemory_f memoryf; - Dtevent_f eventf; - } Dtdisc_t; -.Ce -.Ss " ssize_t key, size" -Each object \f5obj\fP is identified by a key used for object comparison or hashing. -\f5key\fP should be non-negative and defines an offset into \f5obj\fP. -If \f5size\fP is negative, the key is a null-terminated -string with starting address \f5*(Void_t**)((char*)obj+key)\fP. -If \f5size\fP is zero, the key is a null-terminated string with starting address -\f5(Void_t*)((char*)obj+key)\fP. -Finally, if \f5size\fP is positive, the key is a byte array of length \f5size\fP -starting at \f5(Void_t*)((char*)obj+key)\fP. -.PP -.Ss " ssize_t link" -Let \f5obj\fP be an object to be inserted into \f5dt\fP. -If \f5link\fP is negative, an object holder of type \f5Dtlink_t\fP -will be allocated to hold \f5obj\fP. -Otherwise, \f5obj\fP should have -a \f5Dtlink_t\fP structure embedded \f5link\fP bytes into it, -i.e., at address \f5(Dtlink_t*)((char*)obj+link)\fP. -.PP -.Ss " Void_t* (*makef)(Dt_t* dt, Void_t* obj, Dtdisc_t* disc)" -If \f5makef\fP is not \f5NULL\fP, -\f5dtinsert(dt,obj)\fP or \f5dtappend()\fP will call it -to make a copy of \f5obj\fP suitable for insertion into \f5dt\fP. -If \f5makef\fP is \f5NULL\fP, \f5obj\fP itself will be inserted into \f5dt\fP. -.PP -.Ss " void (*freef)(Dt_t* dt, Void_t* obj, Dtdisc_t* disc)" -If not \f5NULL\fP, -\f5freef\fP is used to destroy data associated with \f5obj\fP. -.PP -.Ss "int (*comparf)(Dt_t* dt, Void_t* key1, Void_t* key2, Dtdisc_t* disc)" -If not \f5NULL\fP, \f5comparf\fP is used to compare two keys. -Its return value should be \f5<0\fP, \f5=0\fP, or \f5>0\fP to indicate -whether \f5key1\fP is smaller, equal to, or larger than \f5key2\fP. -All three values are significant for method \f5Dtoset\fP and \f5Dtobag\fP. -For other methods, a zero value -indicates equality and a non-zero value indicates inequality. -If \f5(*comparf)()\fP is \f5NULL\fP, an internal function is used -to compare the keys as defined by the \f5Dtdisc_t.size\fP field. -.PP -.Ss " unsigned int (*hashf)(Dt_t* dt, Void_t* key, Dtdisc_t* disc)" -If not \f5NULL\fP, -\f5hashf\fP is used to compute the hash value of \f5key\fP. -It is required that keys compared equal will also have same hash values. -If \f5hashf\fP is \f5NULL\fP, an internal function is used to hash -the key as defined by the \f5Dtdisc_t.size\fP field. -.PP -.Ss " Void_t* (*memoryf)(Dt_t* dt, Void_t* addr, size_t size, Dtdisc_t* disc)" -If not \f5NULL\fP, \f5memoryf\fP is used to allocate and free memory. -When \f5addr\fP is \f5NULL\fP, a memory segment of size \f5size\fP is requested. -If \f5addr\fP is not \f5NULL\fP and \f5size\fP is zero, \f5addr\fP is to be freed. -If \f5addr\fP is not \f5NULL\fP and \f5size\fP is positive, -\f5addr\fP is to be resized to the given size. -If \f5memoryf\fP is \f5NULL\fP, \fImalloc(3)\fP is used. -.PP -.Ss " int (*eventf)(Dt_t* dt, int type, Void_t* data, Dtdisc_t* disc)" -If not \f5NULL\fP, \f5eventf\fP announces various events. -Each event may have particular handling of the return values from \f5eventf\fP. -But a negative return value typically means failure. -Following are the events: -.Tp -\f5DT_OPEN\fP: -This event is raised at the start of the process to open a new dictionary. -The argument \f5data\fP will be a pointer to an object of type \f5Void_t*\fP -initialized to \f5NULL\fP before the call. The return value of \f5eventf()\fP -is significant as follows: - -On a negative return value, \f5dtopen()\fP will return failure. - -On a zero return value, \f5eventf()\fP may set \f5*(Void_t**)data\fP to some non-\f5NULL\fP -value to indicate that the dictionary structure itself should be allocated -along with the \f5Dtdisc_t.data\fP section. -Otherwise, it will be allocated separately with \f5malloc(3)\fP. - -On a positive return value, the dictionary is being reconstructed -based on existing states of some previous dictionary. -In this case, \f5eventf()\fP should set \f5*(Void_t**)data\fP to point to -the field \f5Dt_t.data\fP of the corresponding previous dictionary (see \f5DT_CLOSE\fP below). -If the handle of the previous dictionary was created as discussed above -in the case of the zero return value, it will be exactly restored. -Otherwise, a new handle will be allocated with \f5malloc()\fP. -The ability to create different dictionaries sharing the same set of objects -allows for managing objects in shared and/or persistent memory. -.Tp -\f5DT_ENDOPEN\fP: -This event is raised at the end of the process to open a dictionary. -The return value of \f5eventf()\fP will be ignored. -.Tp -\f5DT_CLOSE\fP: -This event is raised at the start of the process to close dictionary \f5dt\fP. -The return value of \f5eventf\fP is significant as follows: - -On a negative return value, \f5dtclose()\fP will return failure. - -On a zero return value, all dictionary objects will be deleted and -and all associated memory will be freed. - -On a positive return value, allocated objects and memory will be kept intact. -This means that \f5dt->data\fP remains intact and can be reused in some future -dictionary (see \f5DT_OPEN\fP above). -Note, however, that \f5dt\fP itself would still be freed if it was allocated with \f5malloc(3)\fP. -.Tp -\f5DT_ENDCLOSE\fP: -This event is raised at the end of the process to close a dictionary. -The return value of \f5eventf()\fP will be ignored. -.Tp -\f5DT_DISC\fP: -The discipline of \f5dt\fP is being changed to a new one given in -\f5(Dtdisc_t*)data\fP. -.Tp -\f5DT_METH\fP: -The method of \f5dt\fP is being changed to a new one given in -\f5(Dtmethod_t*)data\fP. -.Tp -\f5DT_HASHSIZE\fP: -This event is applicable to -the methods \f5Dtset\fP, \f5Dtbag\fP, \f5Dtrhset\fP and \f5Dtrhbag\fP. -It is typically issued when the respective internal data structure of -a method is about to be initialized. -If the return value of the event handling function is positive, -\f5*(ssize_t*)data\fP is examined for further action; -else, it is ignored. -A positive return value means that the event function wishes to suggest a table size. -It does that by setting \f5*(ssize_t*)data\fP to the desired size. -Then, the actual table size will be the maximum of the absolute value -of \f5*(ssize_t*)data\fP and some predefined value set by the method. -In addition, if \f5*(ssize_t*)data\fP was negative, -the \f5Dtset\fP and \f5Dtbag\fP methods will never resize the hash table. -.Tp -\f5DT_ERROR\fP: -This event announces an error that occurred during some operations. -The argument \f5(char*)data\fP is a null-terminated string describing the error. -.PP -.Ss "#define DTOFFSET(struct_s,member)" -This macro function computes the offset of \f5member\fP from the start -of structure \f5struct_s\fP. It is useful for getting the offset of -a \f5Dtlink_t\fP embedded inside an object. -.PP -.Ss "#define DTDISC(disc,key,size,link,makef,freef,comparf,hashf,memoryf,eventf)" -This macro function initializes the discipline pointed to by \f5disc\fP -with the given values. -.PP -.Ss "OBJECT OPERATIONS" -.PP -.Ss " Void_t* dtinsert(Dt_t* dt, Void_t* obj)" -.Ss " Void_t* dtappend(Dt_t* dt, Void_t* obj)" -These functions add an object prototyped by \f5obj\fP into \f5dt\fP. -\f5dtinsert()\fP and \f5dtappend()\fP perform the same function -for all methods except for \f5Dtlist\fP (see \f5Dtlist\fP for details). -If there is an existing object in \f5dt\fP matching \f5obj\fP -and the storage method is \f5Dtset\fP, \f5Dtrhset\fP or \f5Dtoset\fP, -\f5dtinsert()\fP and \f5dtappend()\fP will simply return the matching object. -Otherwise, a new object is inserted according to the method in use. -See \f5Dtdisc_t.makef\fP for object construction. -The new object or a matching object as noted will be returned on success -while \f5NULL\fP is returned on error. -.PP -.Ss " Void_t* dtdelete(Dt_t* dt, Void_t* obj)" -If \f5obj\fP is \f5NULL\fP, methods \f5Dtstack\fP and \f5Dtqueue\fP -delete respectively stack top or queue head while other methods do nothing. -If \f5obj\fP is not \f5NULL\fP, an object matching \f5obj\fP is deleted. -See \f5Dtdisc_t.freef\fP for object destruction. -\f5dtdelete()\fP returns the deleted object (even if it was deallocated) -or \f5NULL\fP on error. -.PP -.Ss " Void_t* dtattach(Dt_t* dt, Void_t* obj)" -This function is similar to \f5dtinsert()\fP but \f5obj\fP itself -will be inserted into \f5dt\fP even if a discipline -function \f5makef\fP is defined. -.PP -.Ss " Void_t* dtdetach(Dt_t* dt, Void_t* obj)" -This function is similar to \f5dtdelete()\fP but the object to be deleted -from \f5dt\fP will not be freed (via the discipline \f5freef\fP function). -.PP -.Ss " Void_t* dtsearch(Dt_t* dt, Void_t* obj)" -.Ss " Void_t* dtmatch(Dt_t* dt, Void_t* key)" -These functions find an object matching \f5obj\fP or \f5key\fP either from \f5dt\fP or -from some dictionary accessible from \f5dt\fP via a viewpath (see \f5dtview()\fP.) -\f5dtsearch()\fP and \f5dtmatch()\fP return the matching object or -\f5NULL\fP on failure. -.PP -.Ss " Void_t* dtfirst(Dt_t* dt)" -.Ss " Void_t* dtnext(Dt_t* dt, Void_t* obj)" -\f5dtfirst()\fP returns the first object in \f5dt\fP. -\f5dtnext()\fP returns the object that follows an object matching \f5obj\fP. -Objects are ordered based on the storage method in use. -For \f5Dtoset\fP and \f5Dtobag\fP, objects are ordered by object comparisons. -For \f5Dtstack\fP, objects are ordered in reverse order of insertion. -For \f5Dtqueue\fP, objects are ordered in order of insertion. -For \f5Dtlist\fP, objects are ordered by list position. -For \f5Dtset\fP, \f5Dtbag\fP, \f5Dtrhset\fP and \f5Dtrhbag\fP, -objects are ordered by some internal order defined at the time when these -functions are called. - -Objects in a dictionary or a viewpath can be walked using -a \f5for(;;)\fP loop as below. -.Cs - for(obj = dtfirst(dt); obj; obj = dtnext(dt,obj)) -.Ce -.PP -.Ss " Void_t* dtlast(Dt_t* dt)" -.Ss " Void_t* dtprev(Dt_t* dt, Void_t* obj)" -\f5dtlast()\fP and \f5dtprev()\fP are like \f5dtfirst()\fP and \f5dtnext()\fP -but work in reverse order. -For \f5Dtset\fP, \f5Dtbag\fP, \f5Dtrhset\fP and \f5Dtrhbag\fP, -both reverse and forward orders are the same. -Note that dictionaries on a viewpath are still walked in the order -of the viewpath. -.PP -.Ss " Void_t* dtleast(Dt_t* dt, Void_t* obj)" -.Ss " Void_t* dtmost(Dt_t* dt, Void_t* obj)" -\f5dtleast()\fP returns the smallest object greater or equal to \f5obj\fP. -\f5dtmost()\fP returns the largest object smaller or equal to \f5obj\fP. -Again, object ordering depends on the storage method in use. -For example, with \f5Dtoset\fP and \f5Dtobag\fP, the ordering of objects -is well-defined and it is possible to call \f5dtleast()\fP or \f5dtmost()\fP -on an object not in the dictionary and still get a meaningful result. -On the other hand, with \f5Dtset\fP or \f5Dtrhset\fP, such a call will -essentially be the same as \f5dtsearch()\fP because without matching -an object, it cannot be determined what comes before or after. -.PP -.Ss " dtwalk(Dt_t* dt, int (*userf)(Dt_t*, Void_t*, Void_t*), Void_t* data)" -This function calls \f5(*userf)(walk,obj,data)\fP on each object in \f5dt\fP and -other dictionaries viewable from it. -\f5walk\fP is the dictionary containing \f5obj\fP. -If \f5userf()\fP returns a \f5<0\fP value, -\f5dtwalk()\fP terminates and returns the same value. -\f5dtwalk()\fP returns \f50\fP on completion. -.PP -.Ss " Dtlink_t* dtflatten(Dt_t* dt)" -.Ss " Dtlink_t* dtlink(Dt_t* dt, Dtlink_t* link)" -.Ss " Void_t* dtobj(Dt_t* dt, Dtlink_t* link)" -Using \f5dtfirst()/dtnext()\fP or \f5dtlast()/dtprev()\fP -to walk a single dictionary can incur significant cost due to function calls. -For efficient walking of a single directory (i.e., no viewpathing), -\f5dtflatten()\fP and \f5dtlink()\fP can be used. -Objects in \f5dt\fP are made into a linked list and walked as follows: -.Cs - for(link = dtflatten(dt); link; link = dtlink(dt,link) ) -.Ce -.PP -Note that \f5dtflatten()\fP returns a list of type \f5Dtlink_t*\fP, -not \f5Void_t*\fP. That is, it returns a dictionary holder pointer, -not a user object pointer -(although both are the same if the discipline field \f5link\fP is zero.) -The macro function \f5dtlink()\fP -returns the dictionary holder object following \f5link\fP. -The macro function \f5dtobj(dt,link)\fP -returns the user object associated with \f5link\fP, -Beware that the flattened object list is unflattened on any -dictionary operations other than \f5dtlink()\fP. -.PP -.Ss " Dtlink_t* dtextract(Dt_t* dt)" -.Ss " Dtlink_t* dtrestore(Dt_t* dt, Dtlink_t* list)" -\f5dtextract()\fP extracts the list of objects from \f5dt\fP and makes it appear empty. -\f5dtrestore()\fP repopulates \f5dt\fP with -a list of objects previously obtained via \f5dtextract()\fP. -It is important that the same discipline and method are in use at both -extraction and restoration. Otherwise, undefined behaviors may result. -These functions return \f5NULL\fP on error. - -.PP -.Ss "DICTIONARY INFORMATION" -.PP -.Ss " Dt_t* dtvnext(Dt_t* dt)" -This returns the dictionary that \f5dt\fP is viewing, if any. -.Ss " ssize_t dtvcount(Dt_t* dt)" -This returns the number of dictionaries that view \f5dt\fP. -.Ss " Dt_t* dtvhere(Dt_t* dt)" -This returns the dictionary \f5v\fP viewable from \f5dt\fP -where an object was found from the most recent search or walk operation. -.Ss " ssize_t dtsize(Dt_t* dt)" -This function returns the number of objects stored in \f5dt\fP. -.PP -.Ss " ssize_t dtstat(Dt_t *dt, Dtstat_t* st)" -This function reports dictionary statistics. -It returns the number of objects stored in \f5dt\fP. -.PP -\f5Dtstat_t\fP contains the below fields: -.Tp -\f5int meth\fP: -This returns the method used for the dictionary, e.g., \f5DT_SET\fP, \f5DT_OSET\fP, etc. -.Tp -\f5ssize_t size\fP: -This has the number of objects in the dictionary. -.Tp -\f5ssize_t mlev\fP: -This returns the maximum number of levels in the data structure used for object storage, i.e., -the binary tree or the recursive hash table. -For a hash table with chaining (i.e., \f5Dtset\fP and \f5Dtbag\fP), -it gives the length of the longest chain. -.Tp -\f5ssize_t lsize[]\fP: -This gives the object counts at each level. -For a hash table with chaining (i.e., \f5Dtset\fP and \f5Dtbag\fP), -a level is defined as objects at that position in their chains. -Since chains can be arbitrarily long, the report is limited -to objects at a level less than \f5DT_MAXSIZE\fP. -.Tp -\f5ssize_t tsize[]\fP: -For a hash table using a trie structure, this counts the number of -sub-tables at each level. For example, \f5tsize[0]\fP should be 1 -only for this hash table type. -.PP -.Ss "HASH FUNCTIONS" -.PP -.Ss " unsigned int dtcharhash(unsigned int h, char c)" -.Ss " unsigned int dtstrhash(unsigned int h, char* str, int n)" -These functions compute hash values from bytes or strings. -\f5dtcharhash()\fP computes a new hash value from byte \f5c\fP and seed value \f5h\fP. -\f5dtstrhash()\fP computes a new hash value from string \f5str\fP and seed value \f5h\fP. -If \f5n\fP is positive, \f5str\fP is a byte array of length \f5n\fP; -otherwise, \f5str\fP is a null-terminated string. -.PP -.SH IMPLEMENTATION NOTES -\f5Dtlist\fP, \f5Dtstack\fP and \f5Dtqueue\fP are based on doubly linked list. -\f5Dtoset\fP and \f5Dtobag\fP are based on top-down splay trees. -\f5Dtset\fP and \f5Dtbag\fP are based on hash tables with -move-to-front collision chains. -\f5Dtrhset\fP and \f5Dtrhbag\fP are based on a recursive hashing data structure -that avoids table resizing. -.PP -.SH AUTHOR -Kiem-Phong Vo, kpv@research.att.com diff --git a/usr/src/contrib/ast/src/lib/libast/man/chr.3 b/usr/src/contrib/ast/src/lib/libast/man/chr.3 deleted file mode 100644 index 8d57648b49..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/chr.3 +++ /dev/null @@ -1,126 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH CHR 3 -.SH NAME -chr \- character constant conversion routines -.SH SYNOPSIS -.EX -#include <ast.h> - -int chresc(const char* \fIs\fP, char** \fIe\fP); -int chrtoi(const char* \fIs\fP); -.EE -.SH DESCRIPTION -.L chresc -converts and returns the next character constant in the 0-terminated string -.IR s . -If -.I e -is not 0 then -.I *e -is set to point to the next character in -.I s -on return. -0 is returned and -.I e -is not modified when the end of -.I s -is reached. -.PP -.L chrtoi -converts the 0-terminated string -.I s -to an -.I int -and returns the value. -The characters in -.I s -are converted in order from the left and shifted into the -.I int -value until up to the number of characters in an -.I int -is reached. -This operation is inherently machine-dependent, -but at least its defined in one place. -.PP -The following -.B \e -escape sequences are recognized: -.TP -.RI \e ooo -The character represented by the octal code -.IR ooo . -.TP -.RI \ex xx -The character represented by the hex code -.IR xx . -.TP -.L \ea -Alert (bell). -.TP -.L \eb -Backspace. -.TP -.L \ef -Formfeed. -.TP -.L \en -Newline. -.TP -.L \er -Carriage return. -.TP -.L \et -Horizontal tab. -.TP -.L \ev -Vertical tab. -.TP -.L \eE -ESC (escape). -.TP -.L \e\e -Backslash. -.PP -Other characters following -.B \e -are undefined (although for backwards compatibility they -translate to themselves). -.SH "SEE ALSO" -str(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/compat.3 b/usr/src/contrib/ast/src/lib/libast/man/compat.3 deleted file mode 100644 index eb5e8a7b21..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/compat.3 +++ /dev/null @@ -1,103 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH COMPATIBILITY 3 -.SH NAME -compatibility \- ast library compatibility routines -.SH SYNOPSIS -.EX -#include <ast.h> - -int atexit(void(*)(void)); -char* confstr(int); -int dup2(int, int); -long fpathconf(int, int); -int getgroups(int, int*); -char* getwd(char*); -int killpg(int, int); -int link(const char*, const char*); -int lstat(const char*, struct stat*); -int memcmp(const char*, const char*, unsigned int); -char* memcpy(char*, const char*, int); -char* memset(char*, char, int); -int mkdir(const char*, mode_t); -int mkfifo(const char*, mode_t); -int mknod(const char*, mode_t); -char* mktemp(char*); -int mount(const char*, const char*, int); -long pathconf(const char*, int); -int perror(const char*); -FILE* popen(const char*, const char*); -int readlink(const char*, char*, int); -int remove(const char*); -int rename(const char*, const char*); -int rmdir(const char*); -int setpgid(pid_t, pid_t); -int sigmask(int); -int sigsetmask(long); -int sigunblock(int); -char* strchr(const char*, int); -char* strrchr(const char*, int); -double strtod(const char*, char**); -long strtol(const char*, char**, int); -int symlink(const char*, const char*); -long sysconf(int); -int system(const char*); -char* tmpnam(char*); -int unlink(const char*); -int vfork(void); -int waitpid(pid_t, int*, int); -.EE -.SH DESCRIPTION -These routines are described in the ANSI C, POSIX, BSD and System V manual -sections 2 and 3. -The interfaces are preserved and present in all libast implementations. -Where conflicts exist the POSIX syntax and semantics are implied. -The appropriate error value is returned and -.I errno -is set to -.L EINVAL -when emulation is either too expensive or not possible. -.SH CAVEATS -If you -.L "#undef foo" -and then call -.L foo -you may end up with the local implementation of -.LR foo , -and then you get what you payed for. diff --git a/usr/src/contrib/ast/src/lib/libast/man/error.3 b/usr/src/contrib/ast/src/lib/libast/man/error.3 deleted file mode 100644 index df47d342ba..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/error.3 +++ /dev/null @@ -1,283 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH ERROR 3 -.SH NAME -error \- error and debug trace message formatter -.SH SYNOPSIS -.EX -#include <error.h> - -Error_info_t error_info; - -void error(int \fIlevel\fP, ...); -void errorv(const char* \fIlibrary\fP, int \fIlevel\fP, va_alist \fIargs\fP); -void liberror(const char* \fIlibrary\fP, int \fIlevel\fP, ...); - -#include <debug.h> - -debug(\fIstatement\fP) -message((int \fIlevel\fP, ...)) -libmessage((const char* \fIlibrary\fI, int \fIlevel\fP, ...)) -.EE -.SH DESCRIPTION -.L error -is the error and debug trace message formatter. -.I level -is the severity level. -Messages with -.I "level < error_info.trace" -are suppressed. -.I error_info.trace -is initially -.LR 0 . -The remaining arguments are passed on to -.LR printf . -A -.I newline -is appended to the message text, so none should appear in the -.L printf -format. -If -.I error_info.id -is not -.L 0 -then messages with -.I "level > 0" -are prefixed by -.IR error_info.id: . -.PP -Before the message text is output to standard error -it is passed to the function -.LR "char* ERROR_translate(const char* \fItext\fP, int \fIflag\fP)" . -By default -.L ERROR_translate -returns the -.L text -argument, but on some systems it may do language translation via lookup -on the original source text. -.RL ( error -calls -.L ERROR_translate -with a 0 -.L flag -argument). -.PP -.I level -may be one of: -.TP -.B <0 -Negative values are for debug tracing. -Debug messages are prefixed with -.BI debug level. -If -.I "errno != error_info.last_errno" -then -.I error_info.last_errno -is set to -.I errno -and the error text for errno is appended to the message. -.TP -.B "ERROR_INFO [0]" -Information only; no prefixes are added to the message. -.TP -.B "ERROR_WARNING [1]" -.L "warning:" -is added after -.L error_info.id -and -.I error_info.warnings -is incremented. -.TP -.I "ERROR_ERROR [2]" -(soft error) -.I error_info.errors -is incremented. -.TP -.B ">= ERROR_FATAL [3]" -(hard error) -.I error_info.errors -is incremented and -.L exit(\fIlevel\fP\-2) -is called after the message is emitted. -.TP -.B "ERROR_PANIC [77]" -(unrecoverable internal error) -.L "panic:" -is added after -.IR error_info.id . -.PP -The following may be inclusive-or'd into -.I level -for alternate behavior: -.TP -.L ERROR_SYSTEM -The error text for -.I errno -is appended to the message. -.TP -.L ERROR_OUTPUT -The next argument is the file descriptor where the error message -should be emitted. -.TP -.L ERROR_SOURCE -Then next two arguments are a file name and line number that are added -to the message after -.IR error_info.id . -.TP -.L ERROR_USAGE -A usage message is emitted. -.TP -.L ERROR_PROMPT -The trailing -.I newline -is suppressed. -.TP -.L ERROR_NOID -The -.I error_info.id -prefix is suppressed. -.TP -.L ERROR_LIBRARY -The message is from a library routine. -.SH ENVIRONMENT -The elements of the global struct -.I error_info -control error output and actions. -Parts of -.I error_info -can be initialized from the -.L ERROR_OPTIONS -environment variable. -.L ERROR_OPTIONS -contains space separated -.IR name [ =value ] -options, described below. -.TP -.I "int core" -If -.I "error_info.core != 0" -then -.I "level >= error_info.core" -generates a core dump. -Initialized by -.EX -ERROR_OPTIONS="core=\fIlevel\fP" -.EE -where -.I level -can be a number or one of -.LR error , -.LR fatal , -or -.LR panic . -.I error_info.core -is a handy way to get a stack trace at the exact point of error. -.TP -.I "int error_info.trace" -If -.I "error_info.trace != 0" -and -.I "level < error_info.trace" -then the error message text is suppressed. -.L exit() -may still be called if appropriate for -.IR level . -Initialized by -.EX -ERROR_OPTIONS="trace=\fIlevel\fP" -.EE -where -.I error_info.trace -is set to the negative of -.IR level . -.PP -Library error messages, suppressed by default, are enabled by -.EX -ERROR_OPTIONS="library" -.EE -The system -.I errno -message text can be forced for each message by -.EX -ERROR_OPTIONS="system" -.EE -.SH "EXTENDED DESCRIPTION" -.L "<debug.h>" -provides debugging message macros when -.L DEBUG -or -.L _TRACE_ -are defined -.RL ( _TRACE_ -is defined by -.I makerules -when -.L CCFLAGS -contains -.LR \-g ). -All of the macros expand to nothing when both -.L DEBUG -and -.L _TRACE_ -are not defined. -Otherwise -.L debug -expands its arg and -.L libmessage -and -.L message -call -.L liberror -and -.L error -respectively if -.IR "error_info.trace<0" . -Notice that -.L libmessage -and -.L message -are macro hacks that require double parentheses ((...)) around the -arguments. -.SH EXAMPLE -To enable debugging message level -3, library messages, and system -.I errno -text for all commands: -.EX -export ERROR_OPTIONS="trace=3 library system" -.EE diff --git a/usr/src/contrib/ast/src/lib/libast/man/find.3 b/usr/src/contrib/ast/src/lib/libast/man/find.3 deleted file mode 100644 index a14ceaee0f..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/find.3 +++ /dev/null @@ -1,89 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH FIND 3 -.SH NAME -find \- fastfind algorithm interface -.SH SYNOPSIS -.EX -#include <find.h> - -void* findopen(const char* \fIpattern\fP); -char* findnext(void* \fIhandle\fP); -void findclose(void* \fIhandle\fP); -.EE -.SH DESCRIPTION -These routines access the data generated by the -.I fastfind -algorithm. -The data itself is generated by a standalone program that is run daily -via -.I cron -or -.IR at . -.PP -.L findopen -returns a handle to a -.I fastfind -stream for the -.I ksh -file pattern -.IR pattern . -.L findnext -returns the next pathname that matches the pattern specified by -.IR handle . -.L findnext -returns -.L 0 -when no more pathnames match the pattern. -Finally, -.L findclose -closes the -.I fastfind -stream for -.IR handle . -.SH BUGS -These rotuines are only as good as the -.I fastfind -information which is in the system administration domain. -.SH "SEE ALSO" -tw(1), -find(1), -strmatch(3) -.br -James A. Woods, \fIFast Find Algorithm\fP, Usenix ;login:, February/March, 1983, p. 8 diff --git a/usr/src/contrib/ast/src/lib/libast/man/fmt.3 b/usr/src/contrib/ast/src/lib/libast/man/fmt.3 deleted file mode 100644 index dbe1aab2ec..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/fmt.3 +++ /dev/null @@ -1,213 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH FMT 3 -.SH NAME -fmt \- string formatting routines -.SH SYNOPSIS -.EX -#include <ast.h> -#include <ls.h> - -char* fmtbase(long \fInumber\fP, int \fIbase\fP, int \fIprefix\fP); -char* fmtdev(struct stat* \fIst\fP); -char* fmtelapsed(unsigned long \fIcount\fP, int \fIpersec\fP) -char* fmterror(int \fIerrno\fP); -char* fmtesc(const char* \fIstring\fP); -char* fmtfs(struct stat* \fIst\fP); -char* fmtgid(int \fIgid\fP); -char* fmtmatch(const char* \fIre\fP); -char* fmtmode(int \fImode\fP, int \fIexternal\fP); -char* fmtperm(int \fIperm\fP); -char* fmtre(const char* \fIpattern\fP); -char* fmtsignal(int \fIsig\fP); -char* fmttime(const char* \fIformat\fP, time_t \fItm\fP); -char* fmtuid(int \fIuid\fP); -.EE -.SH DESCRIPTION -These routines return a pointer to a formatted string for various numeric -and string entities. -Some routines may cache information to speed up the next call. -Most of the routines return a pointer to a private buffer, the -contents of which are overwritten on the next call to that routine. -Most -.L fmt -routines have a corresponding -.L str -routine that converts in the other direction. -There is nothing spectacular about this collection other than that -it provides a single place where the exact format is spelled out. -.PP -.L fmtbase -formats a base -.I base -representation for -.IR number . -If -.I "prefix != 0" -then the base prefix is included in the formatted string. -If -.I "number == 0" -or -.I "base == 0" -then the output is signed base 10. -.PP -.L fmtdev -returns the device handle name specified by the -.L stat -structure -.IR st . -This is the device information displayed by -.IR "ls \-l" . -.PP -.L fmtelapsed -formats the elapsed time for -.I (count/persec) -seconds. -The two largest time units are used, limiting the return value length -to at most 6 characters. -The units are: -.RS -.TP -.B s -seconds -.TP -.B m -minutes -.TP -.B h -hours -.TP -.B days -.TP -.B weeks -.TP -.B M -months -.TP -.B Y -years -.TP -.B S -scores -.RE -.PP -.L fmterror -returns the system error message text for the error number -.IR errno . -.PP -.L fmtesc -formats non-ASCII characters in -.I string -into C-style -.B \e -sequences. -These sequences are understood by -.L chresc -and -.LR chrtoi . -.PP -.L fmtfs -returns the file system type name corresponding to the -.L stat -structure -.IR st . -.PP -.L fmtgid -returns the group name for -.IR gid . -.PP -.L fmtmatch -returns the -.L strmatch -equivalent pattern for the regular expression pattern -.IR re . -0 is returned for invalid -.IR re . -.PP -.L fmtmode -returns the -.I "ls \-l" -mode string for the file mode bits in -.IR mode . -If -.I "external != 0" -then -.I mode -is -.IR modecanon (3) -canonical. -.PP -.L fmtperm -returns the -.I chmod -permission string for the permission bits in -.IR perm . -.PP -.L fmtre -returns the regular expression -equivalent pattern for the -.L strmatch -pattern -.IR pattern . -0 is returned for invalid -.IR pattern . -.PP -.L fmtsignal -returns the signal name, sans -.LR SIG , -for the signal number -.IR sig . -If -.I "sig < 0" -then the description text for -.I \-sig -is returned. -.PP -.L fmttime -returns the results of -.I "tmfmt(buf,sizeof(buf),format,tm)" -in the private buffer -.IR buf . -.PP -.L fmtuid -returns the user name for -.IR uid . -.SH "SEE ALSO" -modecanon(3), -str(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/fmtls.3 b/usr/src/contrib/ast/src/lib/libast/man/fmtls.3 deleted file mode 100644 index 50d872b8e1..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/fmtls.3 +++ /dev/null @@ -1,143 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STRLS 3 -.SH NAME -fmtls \- format file information in buffer -.SH SYNOPSIS -.EX -#include <ls.h> - -char* fmtls(char* \fIbuf\fP, char* \fIname\fP, struct stat* \fIst\fP, char* \fIinfo\fP, char* \fIlink\fP, int \fIflags\fP); -.EE -.SH DESCRIPTION -.L fmtls -formats -.IR ls (1) -style file information into the buffer -.IR buf . -A pointer to the trailing 0 in -.I buf -is returned. -.I name -is the file name. -.I st -is a pointer to the -.B "struct stat -status information for -.I name -obtained from one of the -.IR stat (2) -routines. -.I info -is an additional string that will appear before -.I name -in -.I buf -and -.I link -is the name of the related hard or soft link file. -Both -.I info -and -.I link -may be 0. -.I flags -controls the format style and may be a combination of the following: -.PP -.TP -.B LS_ATIME -Use -.I st->st_atime -rather than -.I st->st_mtime -for -.BR LS_LONG . -.TP -.B LS_CTIME -Use -.I st->st_mtime -rather than -.I st->st_mtime -for -.BR LS_LONG . -.TP -.B LS_BLOCKS -List the number of blocks. -.TP -.B LS_INUMBER -List the file serial number (inode number). -.TP -.B LS_LONG -List the file mode, link count, user and group name, -size or major/minor device number, and date along with the -file name. -.TP -.B LS_MARK -The file name is appended with -.L / -for directories, -.L @ -for symbolic links, -and -.L * -for executable files. -.TP -.B LS_NOGROUP -Omit the group name from -.BR LS_LONG . -.TP -.B LS_NOUSER -Omit the user name from -.BR LS_LONG . -.PP -The user and group fields are each -.B LS_W_NAME -characters wide, -the -.B LS_INUMBER -field is -.B LS_W_INUMBER -characters wide, -and the -.B LS_BLOCKS -field is -.B LS_W_BLOCKS -characters wide. -.SH "SEE ALSO" -ls(1), stat(2), strmode(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/fs3d.3 b/usr/src/contrib/ast/src/lib/libast/man/fs3d.3 deleted file mode 100644 index 7dfd448e5e..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/fs3d.3 +++ /dev/null @@ -1,92 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH FS3D 3 -.SH NAME -fs3d \- 3D (nDFS) on/off switch -.SH SYNOPSIS -.EX -#include <fs3d.h> - -int fs3d(int \fIop\fP); -.EE -.SH DESCRIPTION -.L fs3d -controls and queries the -.B 3D -file system -.RB (aka nDFS ) -enable state. -.L 0 -is returned if the current process cannot mount -.B 3D -files. -.I op -may be one of: -.TP -.B FS3D_TEST -Returns -.L "FS3D_ON [1]" -if -.B 3D -is enabled, -.L "FS3D_OFF [0]" -otherwise. -.TP -.B FS3D_ON -Enables -.B 3D -and returns the previous -.L 3D -state (either -.B FS3D_ON -or -.BR FS3D_OFF ). -.TP -\fBFS3D_LIMIT(\fIlimit\fB)\fR -Sets the viewpath level limit to -.IR limit . -The previous limit is returned. -.TP -.B FS3D_INIT -Re-initialize the -.B 3D -tables. -Used for debugging. -.SH "SEE ALSO" -3D(1) diff --git a/usr/src/contrib/ast/src/lib/libast/man/ftwalk.3 b/usr/src/contrib/ast/src/lib/libast/man/ftwalk.3 deleted file mode 100644 index f339ab71a0..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/ftwalk.3 +++ /dev/null @@ -1,235 +0,0 @@ -.fp 5 CW -.TH FTWALK 3 -.SH NAME -\fBftwalk\fR \- file tree walker -.SH SYNOPSIS -.ta .75i 1.5i 2.25i 3i 3.75i 4.5i 5.25i 6i -.PP -.nf -\f5 -#include <ftwalk.h> - -int ftwalk(char* path, int (*userf)(struct FTW* ftw), int options, - int (*comparf)(struct FTW* ftw1, struct FTW* ftw2)); - - -int ftwflags(void); -\fR -.fi -.SH DESCRIPTION -.PP -\fIFtwalk\fR traverses a directory hierarchy using depth-first search. -Upon visiting each file or directory in the hierarchy, it calls -the user function \fIuserf\fP to process that file or directory. -On a directory object, \fIuserf\fR may be called twice, once in preorder -and once in postorder. -On a terminal object such as a file or an unreadable directory, -\fIuserf\fP is called only once. -Cycles due to hard links or symbolic links are detected -to avoid infinite loops. -.PP -\fIPath\fR is the starting point of the search. -It may be an absolute path name or a path name relative to -the current directory. -If \fIpath\fR is a null pointer or points to an empty string, it is treated -as if it points to the current (dot) directory. -.PP -\fIOptions\fR consists of zero or more of the following bits: -.IP -FTW_CHILDREN: -This implies preorder calls to \fIuserf\fR on directory objects. -On such a call to \fIuserf\fR, -the field \fIftw->link\fR (below) points to a link list of -the children of the respective directory. -Upon returning from \fIuserf\fP, -if the field \fIftw->status\fR of any child object -is set to FTW_SKIP (below), that child is pruned from the search. -.IP -FTW_DELAY: When \fBFTW_CHILDREN\fP is turned on, -the fields \fIftw->statb\fP (\fIstruct stat\fP) of children objects -remain undefined until these objects are visited. -.IP -FTW_DOT: Do not use \fIchdir\fR(2) during the traversal. -Normally \fIchdir\fR is used so that -the base name of the object about to be processed can be used -in accessing its data. -This can enhance \fIftwalk\fR efficiency but certain program effects -such as core dumps may be generated in unexpected places -or may not even be generated at all. -Whenever \fIchdir\fR generates an error, if possible, -the current directory is restored to the starting directory -(see FTW_NAME and FTW_PATH). -.IP -FTW_MULTIPLE: The \fIpath\fP argument is treated as a \fIchar**\fP -pointer to a null-terminated array of path names. -All hierarchies rooted at these paths will be searched -.IP -FTW_POST: Calls to the user function are issued only in postorder. -That is, \fIuserf\fP is called on a directory only after its descendants have -been processed. -The absence of this bit indicates that calls to the user functions -are issued in preorder. That is, \fIuserf\fP is -called on a directory before its descendants are processed. -.IP -FTW_PHYSICAL: Use \fIlstat\fR(2) instead of \fIstat\fR(2) to get -file status and allow detection of symbolic links. -In addition, if each component -of the absolute path to the starting object has search permission, -the absolute path is used for early detection of cycles. -.IP -FTW_META|FTW_PHYSICAL: Use \fIstat\fR(2) for top level file status and -\fIlstat\fR(2) for all other files. -Used to implement the POSIX -.B \-H -option for commands like -.IR ls . -.IP -FTW_TWICE: Calls to the user function are issued in both preorder and postorder -for directory objects. -.IP -FTW_USER: The first of 6 user defined option bits. -These bits are ignored by \fIftwalk\fP. -.PP -\fIUserf\fR is a user supplied function that is -called upon different visits of an object. -If the return value of \fIuserf\fR is non-zero, -\fIftwalk\fR returns immediately with the same value. -The \fIuserf\fP prototype is: -.PP -.nf - int userf(struct FTW* ftw) -.fi -.PP -\fBstruct FTW\fP contains at least the following elements: -.PP -.nf - struct FTW* link; /* link list of children */ - struct FTW* parent; /* parent object on the search path */ - union - { - long number; /* local number */ - void* pointer; /* local pointer */ - } local; /* user defined */ - struct stat statb; /* stat buffer of this object */ - char* path; /* full pathname */ - short pathlen; /* strlen(path) */ - unsigned short info; /* type of object */ - unsigned short status; /* status of object */ - short level; /* depth of object on the search path */ - short namelen; /* strlen(name) */ - char name[]; /* file name of object */ -.fi -.PP -The \fIlink\fR field is normally NULL. -If the option FTW_CHILDREN was turned on, -it points to the start of the list of children -of the directory being visited in preorder. -Finally, if the directory being visited causes a cycle, -\fIlink\fR points to the object on the search path that is -identical to this directory. Note that if FTW_PHYSICAL was turned on, -this may point to a directory that is an ancestor of the starting -object. -.PP -The \fIparent\fR field points to the parent object -on the search path. For convenience, a parent object is also supplied for -the starting object. -In this case, except for the \fIlocal\fR field which is initialized -to 0 and the \fIlevel\fR field which contains a negative number, -the rest of the structure may be undefined. -.PP -The \fIinfo\fR field indicates the type of the object -being visited and the type of the visit. The types are: -.IP -FTW_D: A directory being visited in preorder, i.e., -none of its children has been visited by the search. -.IP -FTW_DNX: A directory being visited in preorder that does not have -search permission. -.IP -FTW_DP: A directory being visited in postorder, i.e., all of its -descendants have been completely processed. -.IP -FTW_DC: A directory that causes cycles. This is a terminal object. -.IP -FTW_DNR: A directory that cannot be opened for reading. This is a terminal object. -.IP -FTW_F: An ordinary file. -.IP -FTW_SL: A symbolic link. -Unless FTW_FOLLOW (below) is issued by the user function, -this object is terminal. -.IP -FTW_NS: \fIStat\fR failed on this object. -The stat buffer \fIstatb\fR is undefined. -This object is terminal. -.PP -The \fIstatus\fR field of \fIstruct FTW\fR is used to communicate information -between \fIftwalk\fR and \fIuserf\fR. On calls to \fIuserf\fR, it has one of -two values: -.IP -FTW_NAME: The name of the object as defined in \fIftw->name\fR should be used for -accessing its file information. This is because \fIchdir\fR(2) has been used -to set the current directory to a suitable place (see FTW_CHDIR). -.IP -FTW_PATH: The argument \fIpath\fR of \fIuserf\fR should be used -for accessing the file information of the object. -.PP -Upon returning, \fIuserf\fR may set the \fIstatus\fR field -to one of the following values: -.IP -FTW_AGAIN: If this is a directory object being visited in postorder, -it will be processed \fIagain\fR as if it had not been visited. -.IP -FTW_NOPOST: If this is a directory object being visited in preorder, -the user function will not be called on its postorder visit. -.IP -FTW_SKIP: This object and its descendants are pruned from the search. -.IP -FTW_FOLLOW: If this object is a symbolic link, -follow the link to its physical counterpart. -.PP -\fIComparf\fR, if not NULL, is a pointer to a function -used to define a search ordering for children of a directory. -If FTW_CHILDREN is turned on, the ordering of the children of -a directory is done before the preorder call to \fIuserf\fR on that directory. -Therefore, in that case, \fIftw->link\fR will point to the smallest child. -.PP -The \fIcomparf\fP prototype is: -.PP -.nf - int comparf(struct FTW* ftw1, struct FTW* ftw2) -.fi -.PP -\fIComparf\fR should return a value <0, 0, or >0 to indicate whether -\fIftw1\fR is considered smaller, equal, or larger than \fIftw2\fR. -.PP -\fIFtwalk\fR normally returns 0. -On hard errors such as running out of memory, it returns -1. -\fIFtwalk\fR may also return other values as discussed with respect -to \fIuserf\fR. -.PP -\fIFtwflags\fR returns a combination of \fB0, FTW_META, FTW_PHYSICAL\fR -according to the -preferences specified by -\fBastconf("PATH_RESOLVE",0,0)\fR: -.TP -.B logical -0 -.TP -.B metaphysical -.B "FTW_META|FTW_PHYSICAL" -.TP -.B physical -.B FTW_PHYSICAL -.SH HISTORY -\fIFtwalk\fR performs similar functions as that of -the routine \fIftw\fR provided in System V. -However, it is more general than \fIftw\fR -and suitable for use as a base in implementing -popular tools such as \fIls, find, tar, du,\fR and \fIrm\fR. -\fIFtwalk\fR also handles symbolic links and hard links gracefully. -.SH AUTHORS -Phong Vo, Glenn Fowler, Dave Korn -.SH SEE ALSO -find(1), rm(1), du(1), ls(1), tar(1), stat(2), symlink(2), -astfeature(3), ftw(3), pathcd(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/getcwd.3 b/usr/src/contrib/ast/src/lib/libast/man/getcwd.3 deleted file mode 100644 index 340329690d..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/getcwd.3 +++ /dev/null @@ -1,67 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH GETCWD 3 -.SH NAME -getcwd \- return absolute path to current directory -.SH SYNOPSIS -.EX -#include <ast.h> - -char* getcwd(char* \fIbuf\fP, size_t \fIlen\fP); -.EE -.SH DESCRIPTION -.L getcwd -copies the absolute path name of the current directory info into -.I buf -of length -.IR len . -The return path may be longer than -.LR PATH_MAX . -If -.I "buff == 0" -then space is allocated via -.IR malloc (3) -and -.I len -extra characters are reserved after the generated path name. -A pointer to the path name is returned, -.L 0 -on error. -.SH "SEE ALSO" -pathcd(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/hash.3 b/usr/src/contrib/ast/src/lib/libast/man/hash.3 deleted file mode 100644 index 162d62d7fb..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/hash.3 +++ /dev/null @@ -1,644 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH HASH 3 -.SH NAME -hash \- hash table support (obsolete: use \fBcdt\fP instead) -.SH SYNOPSIS -.L "#include <hash.h>" -.SH DESCRIPTION -The -.I hash -routines manipulate collections of dynamic, scoped hash tables. -.PP -A hash table provides an association between a -.I key -and its -.IR value . -A -.I key -is a sequence of -.L char -elements and a -.I value -is a user supplied pointer to the value. -Each hash table has a dynamic number of slots, -each pointing to the head of a forward linked -.IR "collision chain" . -.PP -Hashing occurs as follows: -a -.I "hash function" -takes a -.I key -as an argument and returns a non-negative index. -The index modulo the table size produces a -slot that points to a -.IR "collision chain" . -The collision chain is sequentially searched until a match is found for -.IR key . -The hash tables are automatically resized as new entries are added. -.PP -Each hash table has one key type. -The default key type is a pointer to a null-terminated string. -The alternate key type is a pointer to a fixed length byte buffer, -declared for a given table by the -.L hashalloc() -function described below. -.PP -Hash table information is partitioned into two parts for efficient scoping. -The -.I root -part contains fixed information that is shared among a set of related -hash tables. -The remaining information is maintained on a per-table basis. -.PP -These basic types are defined in the header file -.B hash.h -(alternate names are listed in parenthesis): -.TP -.L "Hash_table_t (HASHTABLE)" -The per-table information. -The readonly public elements are: -.RS -.TP -.L "int buckets" -The number of table entries. -.TP -.L "char* name" -The hash table name. -.TP -.L "root" -The root information. -The public elements are: -.RS -.TP -.L "int root->accesses" -The number of lookups. -.TP -.L "int root->collisions" -The number of lookup collisions. -.RE -.TP -.L "Hash_table_t* scope" -The table that this scope covers, -.L NULL -if the table is not a scope. -.TP -.L "int size" -The current hash table size. -.RE -.TP -.L "Hash_bucket_t (HASHBUCKET)" -A collision chain hash bucket. -The public structure elements are: -.RS -.TP -.L "char* hashname(Hash_bucket_t*)" -Returns a pointer to the hash bucket key given the bucket pointer. -.TP -.L "char* value" -The value associated with the key. -.RE -.TP -.L "Hash_header_t (HASHHEADER)" -The hash bucket header that must be the first element in all user defined -buckets. -.L HASH_VALUE -may not be used with user defined buckets. -.TP -.L "Hash_position_t (HASHPOSITION)" -Stores the hash table position for -.LR hashscan . -The public elements are: -.RS -.TP -.L "Hash_bucket_t* bucket" -The current hash bucket pointer. -.RE -.PP -The routines are: -.TP -.L "Hash_table_t* hashalloc(Hash_table_t* ref, int op, ...)" -Creates a new hash table and returns a pointer to the table. -.IR malloc (3) -is used to allocate space for the table. -.L NULL -is returned if the table cannot be created. -.L ref -is a pointer to a reference hash table that provides -default values for unspecified information. -The new hash table and -.L ref -share the same root information. -If -.L ref -is -.L NULL -then new root information is created for the new table. -The remaining arguments appear in -.I op-arg -pairs, followed by a final -.L 0 -argument. -The -.I op-arg -pairs are: -.RS -.TP -.L "HASH_alloc, (char(*)()) alloc" -.L alloc -is a function that is called to process -.L Hash_bucket_t -.L value -assignments. -The single argument is -.L "char* value" -and the processed -.L char* -value is returned. -.TP -.L "HASH_clear, int flags" -.L flags -are the -.L ref -flags to be cleared in the new hash table. -See -.L HASH_set -below. -.TP -.L "HASH_compare, (int(*)()) compare" -Specifies an alternate -.I key -comparison function. -The arguments and return value for -.L compare -are the same as for -.IR strncmp (3) -if -.L HASH_namesize -is specified and -.IR strcmp (3) -otherwise. -The first argument is the -.I key -from the current hash bucket on the -.I "collision chain" -and the second argument is the user supplied -.IR key . -.TP -.L "HASH_free, (int(*)()) free" -.L free -is a function that is called when a hash bucket is freed. -If -.L HASH_BUCKET -was set in -.L hashalloc -then the hash bucket pointer is passed, otherwise the bucket -.L value -pointer is passed. -.TP -.L "HASH_hash, (int(*)()) hash" -Specifies an alternate -.I key -hash function. -A -.L char* -key argument (and, if -.L HASH_namesize -is specified, an -.L int -key size argument) is passed to -.LR hash . -The return value must be a non-negative -.LR int . -.TP -.L "HASH_meanchain, int meanchain" -Specifies the mean collision chain length. -The hash table is automatically resized when this value is exceeded. -The default mean chain length is 2. -.TP -.L "HASH_name, char* name" -Associates -.L name -with the hash table. -Used by -.LR hashdump) . -.TP -.L "HASH_namesize, int namesize" -The fixed size in bytes for -.I keys -in the table. -If -.L namesize -is 0 (the default) then the -.I keys -are interpreted as null-terminated strings. -.TP -.L "HASH_set, int flags" -Changes the hash table flags by -.IR or ing -in -.LR flags . -The flags, which may be -.IR or ed -together, are: -.RS -.TP -.L HASH_ALLOCATE -Keys for new hash table entries are to be copied to data areas obtained from -.IR malloc (3). -.TP -.L HASH_FIXED -Fixes the hash table size, disabling any automatic table resizing. -.TP -.L HASH_SCOPE -The new hash table is a scope that is to be pushed on top of -.LR ref . -.L ref -must be -.RL non- NULL . -.RE -.TP -.L "HASH_va_list, va_list ap" -.L ap -is a -.L va_list -variable argument list pointer -(see -.LR <stdarg.h> ). -.RE -.TP -.L "Hash_table_t* hashfree(Hash_table_t* tab)" -The hash table -.L tab -is freed. -The scope covered table pointer is returned, -.L NULL -if -.L tab -is not a scope. -.TP -.L "char* hashlook(Hash_table_t* tab, char* name, int flags, char* value)" -Operates on the key -.L name -in the hash table -.L tab -according to -.L flags -and -.LR value . -A -.L Hash_bucket_t -pointer is returned unless otherwise noted. -There are three basic lookup operations: -.RS -.TP -.L HASH_CREATE -.L name -is entered into the top level scope if it does not already exist. -If -.L name -also appears in a lower scope and -.L HASH_ALLOC -is set for the table then the new bucket will share the -.L name -field value with the lower scope. -.TP -.L HASH_DELETE -.L name -is deleted from the top level scope if it exists. -.L NULL -is returned. -.TP -.L HASH_LOOKUP -The scopes are searched in order from top to bottom for -.L name . -The bucket pointer for the first occurrence is returned. -.L NULL -is returned if -.L name -is not found. -.RE -The basic operations may be qualified by the following -(the qualifiers are restricted to the basic operations in -the parenthesized list): -.RS -.TP -.L "HASH_BUCKET (HASH_CREATE,HASH_DELETE,HASH_LOOKUP)" -.L name -is a pointer to a bucket that has already been entered into the table. -.TP -.L "HASH_FIXED (HASH_CREATE)" -.L value -is taken to be the size of the hash bucket to be created for -.L name -in the top level scope. -The minimum bucket size is silently restricted to -.LR sizeof(Hash_header_t) . -.TP -.L "HASH_INSTALL (HASH_CREATE)" -.L name -is a pointer to a bucket that has not been entered into the table. -.TP -.L "HASH_NOSCOPE (HASH_LOOKUP)" -The lookup is restricted to the top level scope. -.TP -.L "HASH_OPAQUE (HASH_CREATE,HASH_DELETE)" -Sets -.L (HASH_CREATE) -or clears -.L (HASH_DELETE) -the -.I opaque -property for the bucket. -An opaque bucket is not visible in lower scopes. -.TP -.L "HASH_SCOPE (HASH_CREATE,HASH_DELETE)" -All scopes are searched for the bucket. -If the bucket is not found for -.L HASH_CREATE -then a new bucket is created in the lowest scope. -.TP -.L "HASH_VALUE (HASH_CREATE,HASH_LOOKUP)" -For -.L HASH_CREATE -the bucket -.L value -field is set to -.L value -and the bucket -.L name -value is returned. -For -.L HASH_LOOKUP -the bucket -.L value -field is returned, -.L NULL -if the bucket is not found. -.RE -If -.L name -.L NULL -then the name from the most recent -.L hashlook() -is used, avoiding recomputation of some internal parameters. -.TP -.L "char* hashget(Hash_table_t* tab, char* name)" -Returns the value -associated with the key -.L name -in the hash table -.LR tab . -If -.L name -is -.L NULL -then the name from the most recent -.L hashget() -is used, avoiding recomputation of some internal parameters. -.L NULL -is returned if -.L name -is not in the table. -All scope covered tables are searched. -.TP -.L "Hash_bucket_t* hashlast(Hash_table_t* tab)" -Returns a pointer to the most recent hash bucket for -.LR tab . -The value is set by -.LR hashlook() , -.L hashscan() -and -.LR hashwalk() . -.TP -.L "char* hashput(Hash_table_t* tab, char* name, char* value)" -Set the value of the key -.L name -to -.L value -in the top level scope of the hash table -.LR tab . -.L name -is entered into the top level scope if necessary. -The (possibly re-allocated) key name pointer is returned -(see -.LR HASH_ALLOCATE ). -If -.L name -is 0 then the most recent lookup -.L name -to -.L hashlook() -or -.L hashget() -is used. -This eliminates a re-hash and re-lookup of -.LR name . -.TP -.L "int hashwalk(Hash_table_t* tab, int flags, (int(*)()) walker, char* handle)" -The function -.L walker -is applied to each entry (not covered by a scope starting at -.LR tab ) -in the hash table -.LR tab . -If -.L flags -is -.L HASH_NOSCOPE -then only the top level hash table is used, otherwise the walk includes -all scope covered tables. -.L walker -is called with -.L char* -.I key -as the first argument, -.L char* -.I value -as the second argument, and -.L char* -.I handle -as the third argument. -.I handle -may be -.LR 0 . -The walk terminates after the last entry or when -.L walker -returns a negative value. -The return value of the last call to -.L walker -is returned. -Only one walk may be active within a collection of scoped tables. -.TP -.L "Hash_position_t* hashscan(Hash_table_t* tab, int flags)" -Returns a -.L Hash_position_t -pointer for a sequential scan on the hash table -.LR tab . -If -.L flags -is -.L HASH_NOSCOPE -then only the top level hash table is used, otherwise the scan includes -all scope covered tables. -Only one scan may be active within a collection of scoped tables. -.L hashdone() -must be called to terminate the scan. -.L 0 -is returned on error. -.TP -.L "Hash_bucket_t* hashnext(Hash_position_t* pos)" -Returnes a pointer to the next bucket in the sequential scan set up by -.L hashscan() -on -.LR pos . -If no elements remain then -.L 0 -is returned. -.TP -.L "void hashdone(Hash_position_t* pos)" -Completes a scan initiated by -.L hashscan() -on -.LR pos . -.TP -.L "int hashset(Hash_table_t* tab, int flags)" -Sets the flags for the hash table -.L tab -by -.IR or ing -in -.LR flags . -Only -.L HASH_ALLOCATE -and -.L HASH_FIXED -may be set. -.TP -.L "int hashclear(Hash_table_t* tab, int flags)" -Clears the flags for the hash table -.L tab -by masking out -.LR flags . -Only -.L HASH_ALLOCATE -and -.L HASH_FIXED -may be cleared. -.TP -.L "void hashdump(Hash_table_t* tab, int flags)" -Dumps hash table accounting info to standard error. -If -.L tab -is -.L NULL -then all allocated hash tables are dumped, otherwise only information on -.L tab -is dumped. -If -.L flags -is -.L HASH_BUCKET -then the hash bucket -.I key-value -pairs for each collision chain are also dumped. -.TP -.L "void hashsize(Hash_table_t* tab, int size)" -Changes the size of the hash table -.L tab -to -.L size -where -.L size -must be a power of 2. -Explicit calls to this routine are not necessary as hash tables -are automatically resized. -.TP -.L "int strhash(char* name)" -Hashes the null terminated character string -.L name -using a linear congruent pseudo-random number generator algorithm -and returns a non-negative -.L int -hash value. -.TP -.L "int memhash(char* buf, int siz)" -Hashes the buffer -.L buf -of -.L siz -bytes using a linear congruent pseudo-random number generator algorithm -and returns a non-negative -.L int -hash value. -.TP -.L "long strsum(char* name, long sum)" -Returns a running 31-bit checksum of the string -.L name -where -.L sum -is -.L 0 -on the first call and -the return value from a previous -.L memsum -or -.L strsum -call otherwise. -The checksum value is consistent across all implementations. -.TP -.L "long memsum(char* buf, int siz, long sum)" -Returns a running 31-bit checksum of buffer -.L buf -of -.L siz -bytes where -.L sum -is -.L 0 -on the first call and -the return value from a previous -.L memsum -or -.L strsum -call otherwise. -The checksum value is consistent across all implementations. -.SH "SEE ALSO" -sum(1) diff --git a/usr/src/contrib/ast/src/lib/libast/man/iblocks.3 b/usr/src/contrib/ast/src/lib/libast/man/iblocks.3 deleted file mode 100644 index 0c615f86c4..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/iblocks.3 +++ /dev/null @@ -1,62 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH IBLOCKS 3 -.SH NAME -iblocks \- compute number file blocks used -.SH SYNOPSIS -.EX -#include <ls.h> - -long _iblocks(struct stat* \fIst\fP); -.EE -.SH DESCRIPTION -.L _iblocks -returns the number of blocks used by the file whose -.IR stat (2) -information is pointed to by -.IR st . -The count includes both data and indirect blocks. -.PP -This routine is used by -.B <ls.h> -on system without the -.LI "struct stat" st_blocks -field. -.SH "SEE ALSO" -ls(1), stat(2) diff --git a/usr/src/contrib/ast/src/lib/libast/man/int.3 b/usr/src/contrib/ast/src/lib/libast/man/int.3 deleted file mode 100644 index 8d457c083d..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/int.3 +++ /dev/null @@ -1,68 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH INT 3 -.SH NAME -int \- integral type macros -.SH SYNOPSIS -.EX -#include <int.h> -.EE -.SH DESCRIPTION -This header defines macros for the local integral types. -.LR int_1 , -.LR int_2 -and -.L int_4 -are always defined to integral types with a size of -1, 2 and 4 bytes respectively. -The macros -.LI int_ n -where -.I n -is a power of 2 greater than 4 are defined if the type is supported. -.L int_max -is defined to be the largest support integral type. -.L int_swap -is the -.IR swap (3) -operation that converts a local -.L int -to canonical big-endian representation. -.SH "SEE ALSO" -swap(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/ip6.3 b/usr/src/contrib/ast/src/lib/libast/man/ip6.3 deleted file mode 100644 index 1dadb05d9d..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/ip6.3 +++ /dev/null @@ -1,85 +0,0 @@ -.fp 5 B -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH IP6 3 -.SH NAME -ip6 \- IP V6 address support -.SH SYNOPSIS -.EX -#include <ip6.h> - -char* fmtip6(unsigned char* addr, int bits); -int strtoip6(const char* str, char** end, unsigned char* addr, unsigned char* bits); -.EE - -.SH DESCRIPTION -.L fmtip6() -formats the IPV6 address -.L addr -with optional prefix bits -.L bits -(0 if not a prefix) into a thread-specific 0-terminated temporary buffer and returns a pointer -to the formatted value. - -.PP -.L strtoip6() -converts a formatted IPV6 address from the 0-terminated string -.L str -into a host order IPV6 address in -.L addr -which must be a buffer of at least -.L IP6ADDR -bytes. -If -.L bits -is not 0 then an optional -.BI / bits -(prefix size in bits) is parsed and -.L *bits -is set to the number of prefix bits. -If -.L end -is not 0 then -.L *end -will point to the first unparsed character in -.L str -on return. -0 is returned on success, -1 on failure. - -.SH "SEE ALSO" -dss(1) diff --git a/usr/src/contrib/ast/src/lib/libast/man/magic.3 b/usr/src/contrib/ast/src/lib/libast/man/magic.3 deleted file mode 100644 index e8bf0e328f..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/magic.3 +++ /dev/null @@ -1,493 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH MAGIC 3 -.SH NAME -magic \- magic file interface -.SH SYNOPSIS -.EX -#include <magic.h> - -Magic_t -{ - unsigned long flags; -}; - -Magic_t* magicopen(unsigned long \fIflags\fP); -void magicclose(Magic_t* \fImagic\fP); - -int magicload(Magic_t* \fImagic\fP, const char* \fIpath\fP, unsigned long \fIflags\fP); -int magiclist(Magic_t* \fImagic\fP, Sfio_t* \fIsp\fP); - -char* magictype(Magic_t* \fImagic\fP, const char* \fIpath\fP, struct stat* \fIst\fP); -.EE -.SH DESCRIPTION -These routines provide an interface to the -.IR file (1) -command magic file. -.L magicopen -returns a magic session handle that is passed to all of the other routines. -.I flags -may be -.TP -.L MAGIC_MIME -Return the MIME type string rather than the magic file description. -.TP -.L MAGIC_PHYSICAL -Don't follow symbolic links. -.TP -.L MAGIC_STAT -The stat structure -.I st -passed to -.I magictype -will contain valid -.I stat (2) -information. -See -.L magictype -below. -.TP -.L MAGIC_VERBOSE -Enable verbose error messages. -.PP -.L magicclose -closes the magic session. -.PP -.L magicload -loads the magic file named by -.I path -into the magic session. -.I flags -are the same as with -.LR magicopen . -More than one magic file can be loaded into a session; -the files are searched in load order. -If -.I path -is -.L 0 -then the default magic file is loaded. -.PP -.L magiclist -lists the magic file contents on the -.IR sfio (3) -stream -.IR sp . -This is used for debugging magic entries. -.PP -.L magictype -returns the type string for -.I path -with optional -.IR stat (2) -information -.IR st . -If -.I "st == 0" -then -.L magictype -calls -.L stat -on a private stat buffer, -else if -.L magicopen -was called with the -.L MAGIC_STAT -flag then -.I st -is assumed to contain valid stat information, otherwise -.L magictype -calls -.L stat -on -.IR st . -.L magictype -always returns a non-null string. -If errors are encounterd on -.I path -then the return value will contain information on those errors, e.g., -.LR "cannot stat" . -.SH FORMAT -The magic file format is a backwards compatible extension of an -ancient System V file implementation. -However, with the extended format it is possible to write a single -magic file that works on all platforms. -Most of the net magic files floating around work with -.LR magic , -but they usually double up on -.I le -and -.I be -entries that are automatically handled by -.LR magic . -.PP -A magic file entry describes a procedure for determining a single file type -based on the file pathname, -.I stat (2) -information, and the file data. -An entry is a sequence of lines, each line being a record of -.I space -separated fields. -The general record format is: -.EX -[op]offset type [mask]expression description [mimetype] -.EE -.L # -in the first column introduces a comment. -The first record in an entry contains no -.LR op ; -the remaining records for an entry contain an -.LR op . -Integer constants are as in C: -.L 0x* -or -.L 0X* -for hexadecimal, -.L 0* -for octal and decimal otherwise. -.PP -The -.L op -field may be one of: -.TP -.L + -The previous records must match but the current record is optional. -.L > -is an old-style synonym for -.LR + . -.TP -.L & -The previous and current records must match. -.TP -.L { -Starts a nesting block that is terminated by -.LR } . -A nesting block pushes a new context for the -.L + -and -.L & -ops. -The -.L { -and -.L } -records have no other fields. -.TP -\fIid\f5{\fR -A function declaration and call for the single character identifier -.IR id . -The function return is a nesting block end record -.LR } . -Function may be redefined. -Functions have no arguments or return value. -.TP -\fIid\f5()\fR -A call to the function -.IR id . -.PP -The -.L offset -field is either the offset into the data upon which the current entry operates -or a file metadata identifier. -Offsets are either integer constants or offset expressions. -An offset expression is contained in (...) and is a combination of -integral arithmetic operators and the -.L @ -indirection operator. -Indirections take the form -.LI @ integer -where integer is the data offset for the indirection value. -The size of the indirection value is taken either from one of the suffixes -.LR B (byte, 1 char), -.LR H (short, 2 chars), -.LR L (long, 4 chars), -pr -.LR Q (quead, 8 chars), -or from the -.L type -field. -Valid file metadata identifiers are: -.TP -.L atime -The string representation of -.LR stat.st_atime . -.TP -.L blocks -.LR stat.st_blocks . -.TP -.L ctime -The string representation of -.LR stat.st_ctime . -.TP -.L fstype -The string representation of -.LR stat.st_fstype . -.TP -.L gid -The string representation of -.LR stat.st_gid . -.TP -The -.L stat.st_mode -file mode bits in -.IR modecanon (3) -canonical representation (i.e., the good old octal values). -.TP -.L mtime -The string representation of -.LR stat.st_mtime . -.TP -.L nlink -.LR stat.st_nlink . -.TP -.L size -.LR stat.st_size . -.TP -.L name -The file path name sans directory. -.TP -.L uid -The string representation of -.LR stat.st_uid . -.PP -The -.L type -field specifies the type of the data at -.LR offset . -Integral types may be prefixed by -.L le -or -.L be -for specifying exact little-endian or big-endian representation, -but the internal algorithm automatically loops through the -standard representations to find integral matches, -so representation prefixes are rarely used. -However, this looping may cause some magic entry conflicts; use the -.L le -or -.L be -prefix in these cases. -Only one representation is used for all the records in an entry. -Valid types are: -.TP -.L byte -A 1 byte integer. -.TP -.L short -A 2 byte integer. -.TP -.L long -A 4 byte integer. -.TP -.L quad -An 8 byte integer. -Tests on this type may fail is the local compiler does not support -an 8 byte integral type and the corresponding value overflows 4 bytes. -.TP -.L date -The data at -.L offset -is interpreted as a 4 byte seconds-since-the-epoch date and -converted to a string. -.TP -.L edit -The -.L expression -field is an -.IR ed (1) -style substitution expression -\fIdel old del new del \fP [ \fI flags \fP ] -where the substituted value is made available to the -.L description -field -.L %s -format. -In addition to the -.I flags -supported by -.IR ed (3) -are -.L l -that converts the substituted value to lower case and -.L u -that converts the substituted value to upper case. -If -.I old -does not match the string data at -.L offset -then the entry record fails. -.TP -.L match -.L expression -field is a -.IR strmatch (3) -pattern that is matched against the string data at -.LR offset . -.TP -.L string -The -.L expression -field is a string that is compared with the string data at -.LR offset . -.PP -The optional -.L mask -field takes the form -.LI & number -where -.I number -is -.I anded -with the integral value at -.L offset -before the -.L expression -is applied. -.PP -The contents of the expression field depends on the -.LR type . -String type expression are described in the -.L type -field entries above. -.L * -means any value and applies to all types. -Integral -.L type -expression take the form [\fIoperator\fP] \fIoperand\P where -.I operand -is compared with the data value at -.L offset -using -.IR operator . -.I operator -may be one of -.LR < . -.LR <= , -.LR == , -.LR >= -or -.LR > . -.I operator -defaults to -.L == -if omitted. -.I operand -may be an integral constant or one of the following builtin function calls: -.TP -.L magic() -A recursive call to the magic algorithm starting with the data at -.LR offset . -.TP -\f5loop(\fIfunction\fP,\fIoffset\fP,\fIincrement\fP)\fR -Call -.I function -starting at -.I offset -and increment -.I offset -by -.I increment -after each iteration. -Iteration continues until the description text does not change. -.PP -The -.L description -field is the most important because it is this field that is presented -to the outside world. -When constructing description -fields one must be very careful to follow the style layed out in the -magic file, lest yet another layer of inconsistency creep into the system. -The description for each matching record in an entry are concatenated -to form the complete magic type. -If the previous matching description in the current entry does not end with -.I space -and the current description is not empty and does not start with -.I comma , -.I dot -or -.I backspace -then a -.I space -is placed between the descriptions -(most optional descriptions start with -.IR comma .) -The data value at -.L offset -can be referenced in the description using -.L %s -for the string types and -.L %ld -or -.L %lu -for the integral types. -.PP -The -.L mimetype -field specifies the MIME type, usually in the form -.IR a / b . -.SH FILES -.L ../lib/file/magic -located on -.L $PATH -.SH EXAMPLES -.EX -0 long 0x020c0108 hp s200 executable, pure -o{ -+36 long >0 , not stripped -+4 short >0 , version %ld -} - -0 long 0x020c0107 hp s200 executable -o() - -0 long 0x020c010b hp s200 executable, demand-load -o() -.EE -The function -.LR o() , -shared by 3 entries, -determines if the executable is stripped and also extracts the version number. -.EX -0 long 0407 bsd 386 executable -&mode long &0111!=0 -+16 long >0 , not stripped -.EE -This entry requires that the file also has execute permission. -.SH "SEE ALSO" -file(1), mime(4), tw(1), modecanon(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/mem.3 b/usr/src/contrib/ast/src/lib/libast/man/mem.3 deleted file mode 100644 index 70da0db525..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/mem.3 +++ /dev/null @@ -1,98 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH MEM 3 -.SH NAME -mem \- fixed string routines -.SH SYNOPSIS -.EX -#include <ast.h> - -void mematoe(void* \fIout\fP, const void* \fIin\fP, size_t \fIn\fP); -void* memdup(const void* \fIbuf\fP, size_t \fIn\fP) -void memetoa(void* \fIout\fP, const void* \fIin\fP, size_t \fIn\fP); -void* memzero(void* \fIbuf\fP, size_t \fIn\fP); -.EE -.SH DESCRIPTION -.L mematoe -converts -.I n -ASCII characters in -.I in -to EBCDIC characters in -.IR out . -.I in -and -.I out -may be the same. -.PP -.L memdup -copies the -.I n -byte buffer -.I buf -to a new location provided by -.IR malloc (3) -and returns a pointer to the new copy. -0 is returned if -.IR malloc (3) -fails. -.PP -.L memetoa -converts -.I n -EBCDIC characters in -.I in -to ASCII characters in -.IR out . -.I in -and -.I out -may be the same. -.PP -.L memzero -sets the first -.I n -bytes in -.I buf -to -.IR 0 . -.SH "SEE ALSO" -Proposed Bell Laboratories ASCII/EBCDIC standard, April 16, 1979. -.br -str(3), vmalloc(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/mime.3 b/usr/src/contrib/ast/src/lib/libast/man/mime.3 deleted file mode 100644 index f540b2e3f3..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/mime.3 +++ /dev/null @@ -1,117 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH MIME 3 -.SH NAME -mime \- mime/mailcap interface -.SH SYNOPSIS -.EX -#include <mime.h> - -Mime_t -{ - unsigned long flags; -}; - -Mime_t* mimeopen(unsigned long \fIflags\fP); -void mimeclose(Mime_t* \fImime\fP); - -int mimeload(Mime_t* \fImime\fP, const char* \fIpath\fP, unsigned long \fIflags\fP); -int mimelist(Mime_t* \fImime\fP, Sfio_t* \fIsp\fP, const char* \fIpattern\fP); - -char* mimeview(Mime_t* \fImime\fP, const char* \fIview\fP, const char* \fIname\fP, const char* \fItype\fP, const char* \fIopts\fP); -int mimeset(Mime_t* \fImime\fP, char* \fIline\fP, unsigned long \fIflags\fP); -.EE -.SH DESCRIPTION -These routines provide an interface to the MIME type database. -.L mimeopen -returns a mime session handle that is passed to all of the other routines. -The -.I flags -argument is currently unused. -.PP -.L mimeclose -closes the mime session. -.PP -.L mimeload -loads the mime file named by -.I path -into the mime session. -.I flags -may be one of: -.TP -.L MIME_LIST -The -.I path -argument is a -.B : -separated list of pathnames, each of which is loaded. -Non-existent files are ignored -.L MIME_LIST -set. -.TP -.L MIME_REPLACE -Replace existing entries by new entries with the same type. -Otherwise original entries take precedence. -.PP -More than one mime file can be loaded into a session; -the files are searched in load order. -If -.I path -is -.L 0 -then the default mime file is loaded. -.PP -.L mimelist -lists the mime file contents on the -.IR sfio (3) -stream -.IR sp . -This is used for debugging mime entries. -.PP -.L mimetype -returns the type string for -.IR path . -.L mimetype -always returns a non-null string. -If errors are encounterd on -.I path -then the return value will be -.LR "error" . -.SH "SEE ALSO" -file(1), mime(4) diff --git a/usr/src/contrib/ast/src/lib/libast/man/modecanon.3 b/usr/src/contrib/ast/src/lib/libast/man/modecanon.3 deleted file mode 100644 index 4a5d128f9c..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/modecanon.3 +++ /dev/null @@ -1,104 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH MODECANON 3 -.SH NAME -modecanon \- canonical file mode representation -.SH SYNOPSIS -#include <modex.h> - -int modei(int \fIexternal\fP); -int modex(int \fIinternal\fP); -.EE -.SH DESCRIPTION -POSIX threw out the file type bit macros and replaced them with -function-like macros that test file type. -This is bad in many ways, the worst of which is that it provides -no way for a user program to synthesize file types in the mode bits. -.IR pax (1), -.IR tar (1) -and -.IR cpio (1) -are examples of user programs that must convert between the internal mode -representation and a private external representation. -These routines provide a canonical external representation -with macros to access and synthesize the bits in the external -representation. -.PP -.L modei -takes an external mode representation -.I external -and returns the equivalent internal representation. -.PP -.L modex -takes an internal mode representation -.I internal -and returns the equivalent external representation. -.PP -The traditional bit access macro (\f5S_\fP prefix changes to \f5X_\fP) are: -.L X_IFMT , -.L X_IFSOCK , -.L X_IFLNK , -.L X_IFCTG , -.L X_IFREG , -.L X_IFBLK , -.L X_IFDIR , -.L X_IFCHR , -.L X_IFIFO , -.L X_IPERM , -.L X_ISUID , -.L X_ISGID , -.L X_ISVTX , -.L X_IRUSR , -.L X_IWUSR , -.L X_IXUSR , -.L X_IRGRP , -.L X_IWGRP , -.L X_IXGRP , -.L X_IROTH , -.L X_IWOTH , -.L X_IXOTH , -.L X_IRWXU , -.L X_IRWXG -and -.L X_IRWXO . -.LI X_ITYPE( mode ) -returns the type bits for -.IR mode . -.SH "SEE ALSO" -pax(1), stat(2) diff --git a/usr/src/contrib/ast/src/lib/libast/man/optget.3 b/usr/src/contrib/ast/src/lib/libast/man/optget.3 deleted file mode 100644 index 90afcb8f76..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/optget.3 +++ /dev/null @@ -1,68 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH OPTGET 3 -.SH NAME -optget \- option parse assist -.SH SYNOPSIS -.EX -#include <option.h> - -Opt_t -{ -}; - -Optdisc_t -{ - unsigned long version; - unsigned long flags; - char* catalog; - Optinfo_f infof; -}; - -Opt_t opt_info; - -void optinit(Optdisc_t* \fIdisc\fP, Error_f \fIerrorf\fP); -int optget(char** \fIargv\fP, const char* \fIusage\fP); -int optstr(const char* \fIstring\fP, const char* \fIusage\fP); -int optjoin(char** \fIargv\fP, ... [int (*\fIoptfun\fP)(char** \fIargv\fP, int \fIlast\fP)]); -char* optusage(const char* \fIopts\fP); -int optesc(Sfio_t* \fIsp\fP, const char* \fIstring\fP, int \fIflags\fP); -.EE -.SH DESCRIPTION -.SH "SEE ALSO" diff --git a/usr/src/contrib/ast/src/lib/libast/man/path.3 b/usr/src/contrib/ast/src/lib/libast/man/path.3 deleted file mode 100644 index 8721888bb5..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/path.3 +++ /dev/null @@ -1,391 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH PATH 3 -.SH NAME -path \- file path routines -.SH SYNOPSIS -.EX -#include <ast.h> - -char* pathaccess(char* \fIpath\fP, const char* \fIdirs\fP, const char* \fIa\fP, const char* \fIb\fP, int \fImode\fP); -char* pathbin(void); -char* pathcanon(char* \fIpath\fP, int \fIflags\fP); -char* pathcat(char* \fIpath\fP, const char* \fIdirs\fP, int \fIsep\fP, const char* \fIa\fP, const char* \fIb\fP); -char* pathcd(char* \fIpath\fP, const char* \fIhome\fP); -int pathcheck(const char* \fIpackage\fP, const char* \fItool\fP, Pathcheck_t* \fIpc\fP); -int pathgetlink(const char* \fIname\fP, char* \fIbuf\fP, int \fIsiz\fP); -char* pathkey(char* \fIkey\fP, char* \fIattr\fP, const char* \fIlang\fP, const char* \fIpath\fP); -char* pathnext(char* \fIpath\fP, char* \fIextra\fP, long* \fIvisits\fP); -char* pathpath(char* \fIpath\fP, const char* \fIp\fP, const char* \fIa\fP, int \fImode\fP); -char* pathprobe(char* \fIpath\fP, char* \fIattr\fP, const char* \fIlang\fP, const char* \fItool\fP, const char* \fIproc\fP, int \fIop\fP); -char* pathrepl(char* \fIpath\fP, const char* \fImatch\fP, const char* \fIreplace\fP); -int pathsetlink(const char* \fItext\fP, char* \fIname\fP); -char* pathshell(void); -int pathstat(const char* \fIpath\fP, struct stat* \fIst\fP); -char* pathtemp(char* \fIpath\fP, const char* \fIdir\fP, const char* \fIpfx\fP); -.EE -.SH DESCRIPTION -These routines operate on file path names. -Path buffers are assumed to be of size -.LR PATH_MAX . -.L <ast.h> -always defines -.LR PATH_MAX , -even if it indeterminant on the local system. -Yes, this was probably a bad choice, but it was made about 10 years ago. -We will probably move to a <stk.h> based implementation. -.PP -.L pathaccess -constructs a path in -.L path -to the file -.L a/b -with access -.L mode -using the -.L : -separated directories in -.IR dirs . -Both -.I a -and -.I b -may be -.LR 0 . -.L mode -is the inclusive-or of: -.TP -.L F_OK -File exists. -.TP -.L R_OK -Read permission on file. -.TP -.L W_OK -Write permission on file. -.TP -.L X_OK -Execute permission on file. -.TP -.L PATH_REGULAR -A regular file. -.TP -.L PATH_ABSOLUTE -Generated path name is rooted at -.LR / . -.I path -is returned, 0 on error. -.PP -.L pathbin -returns a pointer to the -.L : -separated list of directories to search for executable commands. -The -.L PATH -environment variable is first consulted. -If not defined then -.L confstr(_CS_PATH,...) -is used. -A valid string is always returned. -.PP -.L pathcanon -canonicalizes the path -.I path -in place. -A pointer to the trailing 0 in the canonicalized path is returned. -A canonical path has: -redundant -.L . -and -.L / -removed; -.L .. -moved to the front; -.L /.. -preserved for super root hacks; -.L ... -resolved if -.IR fs3d (3) -is enabled. -.I flags is the inclusive-or of: -.TP -.L PATH_DOTDOT -Each -.L .. -is checked for access. -.TP -.L PATH_EXISTS -Path must exist at each component. -.TP -.L PATH_PHYSICAL -Symbolic links are resolved at each component. -.PP -0 is returned on error. -If an error occurs and either of -.L PATH_DOTDOT -or -.L PATH_EXISTS -is set then -.I path -will contain the components following the failure point. -.PP -.L pathcat -concatenates the first -.I sep -separated path component in -.I dirs -with the path components -.I a -and -.I b -into -.LR path . -The path is constructed in -.I path -by separating each path component with -.IR / . -Both -.I a -and -.I b -may be -.LR 0 . -A pointer to the next -.I sep -separated component in -.I dirs -is returned, -.L 0 -when there are no more components. -.L pathcat -is used by -.LR pathaccess . -.PP -.L pathcd -sets the current working directory to -.I path -via -.IR chdir (2). -If -.I path -is longer than -.L PATH_MAX -then it is split up into a sequence of relative paths and -.I chdir -is called on each of these. -For any given system, if you got to a directory, then -.L pathcd -can get you back, modulo permission and link changes. -.PP -.L pathcheck -is a stub for license libraries. -See -.IR license (3). -.PP -.L pathgetlink -returns the 0-terminated symbolic link text for -.I path -in the buffer -.I bu -of size -.IR siz . -The link text length is returned on success, \-1 on error. -Weird -.I universe (1) -interactions with dynamic symbolic links are handled -by converting non-standard dynamic link text to -.LI .../$( UNIVERSE )/... -.L pathsetsymlink -converts in the other direction. -.PP -.L pathkey -generates in -.I key -a 14 character lookup key (plus terminating 0) for the language -.I lang -processor in -.IR path . -A poihter to the key is returned, 0 on error. -If -.I "key == 0" -then space is allocated via -.IR malloc (3). -Key specific attribute -.I name=value -pairs are copied into -.I attr -if -.IR "attr != 0" . -.PP -.L pathpath -constructs in -.I path -a path to -.I p -with -.IR access (2) -mode -.I mode -using the directories from -.LR pathbin() . -If \fIa != 0\fP then -.IR a , -.IR argv [0] -(if available via -.IR optget (3)), -and the -.L _ -environment variable (set by -.IR ksh (1) ) -are used for related root searching. -If -.I p -also contains a -.L / -then -.I ../p -is searched for. -.PP -.L pathprobe -generates in -.I path -the full path name of the -.I tool -specific -.IR probe (1) -information file for the -.I lang -langauge processor -.IR proc . -If -.I "path == 0" -then space is allocated via -.IR malloc (3). -Probe attribute -.I name=value -pairs are copied into -.I attr -if -.IR "attr != 0" . -.I op -may be one of: -.TP -.B \-1 -return the path name with no access checks or generation -.TP -.B 0 -message emitted information must be generated via -.IR probe (1) -.TP -.B 1 -no message emitted information must be probed via -.IR probe (1) -.PP -0 is returned if the information does not exist and cannot be generated. -.PP -.L pathrepl -does an in-place replacement of the first occurrence of -.I /match/ -with -.I /replace/ -in -.IR path . -.PP -.L pathsetlink -creates a symbolic link -.I text -in the path -.IR name . -See -.L pathgetlink -above for weird -.IR universe (1) -interactions hidden by this routine. -.PP -.L pathshell -returns a pointer to the pathname for the shell for the current process. -The -.L SHELL -environment variable is first consulted, but is rejected under suspicious -ownership/setuid conditions of if it seems to point to -.IR csh (1) ; -otherwise -.L confstr(_CS_SHELL,...) -is used. -A valid string is always returned. -.PP -.L pathstat -first tries -.LI stat( path,st ) -and if that fails it tries -.LI lstat( path,st ). -The -.L stat -or -.L lstat -return value is returned. -.PP -.L pathtemp -generates in -.I path -a temporary file path name of the form -.I dir/pfx<pid>.<suf> -where the length of -.IR pfx , -if !=0, is limited to 5, the length of -.I <pid> -(the base 64 representation of the current process id) -is limited to 3, and -.I <suf> -(an internally generated suffix that avoid file confilicts) -is limited to 3. -The generated path name conforms to the classic UNIX 14 char and the DOS -.LR 8.3 -limitations. -Both -.I dir -and -.I pfx -may be -.LR 0 . -.IR access (2) -is used to avoid file conflicts but the generated path name is not created, -so you could lose in a race. -.SH "SEE ALSO" -3d(1), access(2), confstr(3), fs3d(3), lstat(2), stat(2) diff --git a/usr/src/contrib/ast/src/lib/libast/man/preroot.3 b/usr/src/contrib/ast/src/lib/libast/man/preroot.3 deleted file mode 100644 index 025fc221c0..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/preroot.3 +++ /dev/null @@ -1,151 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH PREROOT 3 -.SH NAME -preroot \- preroot support -.SH SYNOPSIS -.EX -#include <preroot.h> - -char* getpreroot(char* \fIpath\fP, char* \fIcmd\fP); -int ispreroot(char* \fIdir\fP); -int realopen(char* \fIpath\fP, int \fImode\fP, int \fIperm\fP); -void setpreroot(char** \fIargv\fP, char* \fIdir\fP); -.EE -.SH DESCRIPTION -The -.I preroot -routines manipulate the process preroot. -.I preroot -is a kernel supported per-process two level viewpath. -All pathnames rooted at -.L / -are first searched for in the process preroot directory -and then in the system root directory. -Setting the process preroot is a priveleged operation controlled by the -.IR /etc/preroot (1) -command. -.PP -.L <preroot.h> -defines the symbol -.B FS_PREROOT -for those systems that support preroot. -The following routines are valid only when -.B FS_PREROOT -is defined: -.TP -.L getpreroot -returns a pointer to the absolute pathname of the preroot directory -for the executable -.IR cmd . -The result is placed in -.IR path . -If -.I path -is -.B 0 -then -.IR malloc (3) -is used to allocate the pathname space. -.B 0 -is returned if -.I cmd -has no preroot or if an error was encountered. -In this case -.I errno -is set to indicate the error. -.TP -.L ispreroot -Non-zero is returned if -.I dir -is the current process preroot. -If -.I dir -is -.B 0 -then non-zero is returned if the current process has a preroot. -.TP -.L realopen -temporarily disables the process preroot and does an -.IR open (3) -relative to the system root directory. -The return value from -.I open -is returned. -If there is no preroot then -.I realopen -is equivalent to -.IR open . -.TP -.L setpreroot -calls -.IR execvp (3) -as -.L "execvp(a\fIrgv\fP[0],\fIargv\fP)" -with the process preroot set to -.IR dir . -.I argv -must be a -.BR 0 -terminated -argument array. -If -.I argv -is -.B 0 -then the value of -.I opt_argv -from -.IR optget (3) -is used. -.L setpreroot -returns immediately if -.I dir -is already the process preroot. -.SH "SEE ALSO" -/etc/preroot(1) -.SH BUGS -Preroot semantics should be preserved when reading directories. -The -.I ast -.IR directory (3) -routines do this. -.IR 3d (1) -viewpathing does -.I preroot -the right way. diff --git a/usr/src/contrib/ast/src/lib/libast/man/proc.3 b/usr/src/contrib/ast/src/lib/libast/man/proc.3 deleted file mode 100644 index 64c1a6ef49..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/proc.3 +++ /dev/null @@ -1,319 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH PROC 3 -.SH NAME -proc \- process control routines -.SH SYNOPSIS -.EX -#include <proc.h> - -Proc_t* procopen(const char* \fIcommand\fP, char** \fIargv\fP, char** \fIenvv\fP, long* \fIopv\fP, long \fIflags\fP); -int procfree(Proc_t* \fIproc\fP); -int procclose(Proc_t* \fIproc\fP); -int procrun(const char* \fIcommand\fP, char** \fIargv\fP); -.EE -.SH DESCRIPTION -These routines provide a portable interface to process creation and execution. -They work on systems with -.IR fork (2) -and -.IR exec (2) -as well as on systems with only -.IR spawnve (2) -or -.IR spanwveg (3). -.PP -.L procopen -runs -.I command -with arguments -.IR argv , -environment modifications in -.IR envv , -file descriptor, signal and process group operations in -.I opv -and flags in -.IR flags . -.PP -.I command -is searched for using the -.L PATH -environment variable from the calling environment. -If -.I command -is -.L 0 -then the current shell is used (see -.IR pathshell (3)). -If -.I envv -is not -.L 0 -then it is a -.L 0 -terminated vector of -\fIname\fP[=\fIvalue\fP] -strings that are added to the -.I command -environment using -.IR setenviron (3). -If -.I name -appears in the parent environment then its value is replaced with the new -.IR value . -If -.RI = value -is omitted then -.I name -is removed from the child environment. -The -.L _ -environment variable is set to contain the pathname for -.I command -and will appear at the top of the child environment. -.PP -If -.I opv -is not -.L 0 -then it is a 0 terminaled vector of operations to perform. -In the following -.I context -is a combination of -.L PROC_FD_CHILD -and -.L PROC_FD_PARENT -for the child and parent process context respectively. -Valid operations are: -.TP -\f5PROC_FD_CLOSE(\fIfd\fP,\fIcontext\fP)\fR -The file descriptor -.I fd -is closed in -.IR context . -.TP -\f5PROC_FD_DUP(\fIfrom\fP,\fIto\fP,\fIcontext\fP)\fR -The file descriptor -.I from -is -.IR dup (2)'d -into the file descriptor -.I to -in -.IR context . -.TP -\f5PROC_SIG_DFL(\fIsig\fP)\fR -The signal handler for -.I sig -is set to -.L SIG_DFL -in the child context. -.TP -\f5PROC_SIG_IGN(\fIsig\fP)\fR -The signal handler for -.I sig -is set to -.L SIG_IGN -in the child context. -.TP -\f5PROC_SYS_PGRP(\fIpgid\fP)\fR -The child process group is set to -.IR pgid . -.I pgid -may have the following values: -.TP -.L <0 -The child process becomes a session leader. -.TP -.L 0 -The child process is in the parent process group. -.TP -.L 1 -The child process becomes a process group leader. -.TP -.L >1 -The child process joins the process group -.IR pgid . -.TP -\f5PROC_SYS_UMASK(\fImask\fP)\fR -The child process group file creation mask is set to -.IR mask . -.PP -.I flags -is the inclusive-or of the following: -.TP -.L PROC_ARGMOD -.I "argv[-1]" -and -.I "argv[0]" -may be modified. -This is an optimization that avoids an environment vector -.I realloc(3) -when -.I command -is a shell script. -.TP -.L PROC_BACKGROUND -Standard shell -.L & -setup is done for the child process. -.TP -.L PROC_CLEANUP -Parent process redirection file discriptors are closed on error. -.TP -.L PROC_DAEMON -Standard daemon setup is done for the child process. -.TP -.L PROC_ENVCLEAR -The child environment is cleared before -.I envv -is added. -.TP -.L PROC_GID -The child effective group id is set to the real group id. -.TP -.L PROC_IGNORE -Parent pipe errors are ignored. -.TP -.L PROC_OVERLAY -The current process is overlayed by -.I command -if possible -(i.e., the -.IR fork (2) -call is omitted). -.TP -.L PROC_PARANOID -Paranoid: -.I command -is searched using the default standard -.LR PATH ; -the child environment variable -.L PATH -is set to the default standard; -the -.L PROC_GID -and -.L PROC_UID -modes are set; -only -.L /bin/sh -is used to execute -.I command -if it is a shell script. -.TP -.L PROC_PRIVELEGED -If the effective user id is -.L 0 -then the child real user id is set to -.L 0 -and the child real group id is set to the effective group id. -.TP -.L PROC_READ -.I proc.rfd -is connected to -.IR command 's -standard output. -.TP -.L PROC_SESSION -The child process becomes a session group leader. -(Equivalent to the -.I opv -entry -.LR PROC_SYS_PGRP(-1) .) -.TP -.L PROC_UID -The child effective user id is set to the real user id. -.TP -.L PROC_WRITE -.I proc.wfd -is connected to -.IR commands 's -standard input. -.PP -The return value is a pointer to a structure with the following members: -.TP -.L "pid_t \fIpid\fP" -The child process id. -.TP -.L "pid_t \fIpgrp\fP" -The child process group. -.TP -.L "int \fIrfd\fP" -A read file descriptor connected to -.IR command 's -standard output. -.TP -.L "int \fIwfd\fP" -A write file descriptor connected to -.IR command 's -standard input. -.PP -If an error occurs then -.L 0 -is returned. -.PP -.L procclose -waits for the process -.I proc -to complete and then closes the command stream -.IR proc . -The command exit status is returned. -.L -1 -is returned if the child portion of -.L procopen -failed. -.PP -.L procfree -frees the process stream without waiting for -.I command -to complete. -Presumably some other mechanism will be used to wait for -.IR proc.pid . -.PP -.L procrun -combines -.L procopen -and -.L procclose -with the flags -.L PROC_GID|PROC_UID -and returns the command exit status. -.SH "SEE ALSO" -popen(3), sfpopen(3), spawnveg(3), system(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/re.3 b/usr/src/contrib/ast/src/lib/libast/man/re.3 deleted file mode 100644 index 2e1010e434..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/re.3 +++ /dev/null @@ -1,214 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH RE 3 -.SH NAME -recomp, reexec, ressub, refree, reerror \(mi regular expression library -.SH SYNOPSIS -.EX -#include <re.h> - -Re_program_t* recomp(char* \fIpattern\fP, int \fIflags\fP); -int reexec(Re_program_t* \fIre\fP, char* \fIsource\fP); -void ressub(Re_program_t* \fIre\fP, Sfio_t* \fIsp\fP, char* \fIold\fP, char* \fInew\fP, int \fIflags\fP); -void reerror(char* \fImessage\fP); -void refree(Re_program_t* \fIre\fP); -.EE -.SH DESCRIPTION -.L recomp -compiles a regular expression in -.I pattern -and returns a pointer to the compiled regular expression. -The space is allocated by -.IR malloc (3) -and may be released by -.LR refree . -Regular expressions are as in -.IR egrep (1) -except that newlines are treated as ordinary -characters and -.L $ -matches the end of a null-terminated string. -.I flags -may be -.L RE_EDSTYLE -which specifies -.IR ed (1) -style special characters, -.LR \e( , -.LR \e) , -.LR \e? , -.L \e+ -and -.L \e| -for the -.IR egrep (1) -.LR ( , -.LR ) , -.LR ? , -.L + -and -.LR | , -respectively. -.PP -.L reexec -matches the null-terminated -.I source -string against the compiled regular expression -.I re -from a previous call to -.LR recomp . -If it matches, -.L reexec -returns a non-zero value. -If -.I flags -is -.L RE_MATCH -then the array -.I re\->match -is filled with character pointers to the substrings of -.I source -that correspond to the -parenthesized subexpressions of -.IR pattern : -.I re\->match[i].sp -points to the beginning and -.I re\->match[i].ep -points just beyond -the end of substring -.IR i . -(Subexpression -.I i -begins at the -.IR i th -matched left parenthesis, counting from 1.) -Pointers in -.I re\->match[0] -pick out the substring that corresponds to -the entire regular expression. -Unused elements of -.I re\->match -are filled with zeros. -Matches involving -.LR * , -.LR + , -and -.L ? -are extended as far as possible. -A maximum of 9 subexpressions will be matched. -The structure of elements of -.I re\->match -is: -.nf -.ta 8n - typedef struct - { - char* sp; - char* ep; - } rematch; -.fi -.LP -.L ressub -places in the -.IR sfio (3) -stream -.I sp -a substitution instance of -.I old -to -.I new -in -.I source -in the context of the last -.L reexec -performed on -.IR re\->match . -Each instance of -.LI \e n , -where -.I n -is a digit, is replaced by the -string delimited by -.LI re\->match[ n ].sp -and -.LI re\->match[ n ].ep . -Each instance of -.L & -is replaced by the string delimited by -.I re\->match[0].sp -and -.IR re\->match[0].ep . -If -.L RE_ALL -is set in -.I flags -then all occurrences of -.I old -are replaced by -.IR new . -If -.L RE_LOWER -.RL [ RE_UPPER ] -is set in -.I flags -then -.I old -is converted to lower [upper] case. -.LP -.L reerror, -called whenever an error is detected in -.L recomp, -.L reexec, -or -.L ressub, -writes the string -.I msg -on the standard error file and exits. -.L reerror -may be replaced to perform -special error processing. -.SH DIAGNOSTICS -.L recomp -returns 0 for an invalid expression or other failure. -.L reexec -returns 1 if -.I source -is accepted, 0 otherwise. -.SH "SEE ALSO" -ed(1), grep(1), expr(1) diff --git a/usr/src/contrib/ast/src/lib/libast/man/regex.3 b/usr/src/contrib/ast/src/lib/libast/man/regex.3 deleted file mode 100644 index 7c15d21c46..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/regex.3 +++ /dev/null @@ -1,163 +0,0 @@ -.fp 5 B -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH REGEX 3 -.SH NAME -regex \- regular expression interface -.SH SYNOPSIS -.EX -#include <regex.h> - -int regcomp(regex_t* \fIre\fP, const char* \fIregex\fP, int \fIcflags\fP); -int regexec(const regex_t* \fIre\fP, const char* \fIstring\fP, size_t \fInmatch\fP, regmatch_t \fIpmatch\fP[], int \fIeflags\fP); -size_t regerror(int \fIcode\fP, const regex_t* \fIre\fP, char* \fIerrbuf\fP, size_t \fIerrbuf_size\fP); -void regfree(regex_t* \fIre\fP); - -regclass_t regclass(const char* \fIstr\fP, char** \fIend\fP); -int regaddclass(const char* \fIname\fP, regclass_t \fIclassf\fP); -int regcollate(const char* \fIstr\fP, char** \fIend\fP, char* \fIbuf\fP, int \fIsize\fP); - -int regcomb(regex_t* \fIre_1\fP, regex_t* \fIre_2\fP); -size_t regdecomp(regex_t* \fIre\fP, regflags_t \fIflags\fP, char* \fIbuf\fP, size_t \fIsize\fP); -int regdup(regex_t* \fIre_old\fP, regex_t* \fIre_new\fP); -regstat_t* regstat(const regex_t* \fIre\fP); - -regex_t* regcache(const char* \fIpattern\fP, regflags_t \fIflags\fP, int* \fIpcode\fP); - -int regncomp(regex_t* \fIre\fP, const char* \fIpattern\fP, size_t \fIsize\fP, regflags_t \fIflags\fP); -int regnexec(const regex_t* \fIre\fP, const char* \fIsubject\fP, size_t \fIsize\fP, size_t \fInmatch\fP, regmatch_t* \fImatch\fP, regflags_t \fIflags\fP); -int regrecord(const regex_t* \fIre\fP); -int regrexec(const regex_t* \fIre\fP, const char* \fIbuf\fP, size_t \fIsize\fP, size_t \fInmatch\fP, regmatch_t* \fImatch\fP, regflags_t \fIflags\fP, int \fIsep\fP, void* \fIhandle\fP, regrecord_t \fIrecordf\fP); -void regfatal(regex_t* \fIre\fP, int \fIlevel\fP, int \fIcode\fP); -void regfatalpat(regex_t* \fIre\fP, int \fIlevel\fP, int \fIcode\fP, const char* \fIpattern\fP); - -int regsubcomp(regex_t* \fIre\fP, const char* \fIstr\fP, const regflags_t* \fImap\fP, int \fIminmatch\fP, regflags_t \fIflags\fP); -int regsubexec(const regex_t* \fIre\fP, const char* \fIsubject\fP, size_t \fInmatch\fP, regmatch_t* match); -int regsubflags(regex_t* \fIre\fP, const char* \fIstr\fP, char** \fIend\fP, int \fIdelim\fP, const regflags_t* \fImap\fP, int* \fIpm\fP, regflags_t* \fIpf\fP); -void regsubfree(regex_t* \fIre\fP); -.EE - -.SH DESCRIPTION -.LR regcomp() , -.LR regexec() , -.LR regerror() , -and -.L regfree() -are the POSIX regular expression functions. -The remaining functions are -.B ast -extensions. -.B ast -also provides -.I flags -extensions to the -.LR regcomp() , -.LR regexec() -functions and -.I code -extensions to the -.L regerror() -function. - -.PP -.L regcache() -maintains a cache of compiled regular expressions for patterns of size -255 bytes or less. -The initial cache size is 8. -.L pattern -and -.L flags -are passed to -.L regcomp() -with an -.L re -pointer maintained by -.LR regcache() . -.LR pcode , -if not 0, points to the return value of the -.L regcomp() -call. -If the -.L regcomp() -call fails, -.L regcache() -returns 0 and -.L pcode -will point to the non-zero error code. -Do not call -.L regfree() -on the -.L re -returned by -.LR regcache() . -Both -.L pattern -and -.L flags -are used to match entries in the cache. -When the cache is full the least recently used -.L re -is freed (via -.LR regfree() ) -to make space for the new pattern. -Any -.L re -previously returned by -.L regcache() -may be freed (invalidated) on the next call to -.LR regcache() . -If -.L pattern -is longer that 255 bytes then it is still passed on to -.LR regcomp() , -but it will not be cached. -If -.L pattern -is 0 then the cache is flushed. -In addition, if the integer value of -.L flags -is greater than the current cache size, the cache size is increased -to that integer value. -0 is always returned when -.L pattern -is 0; -.L pcode -will point to a non-zero value on error. - -.SH "SEE ALSO" -strmatch(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/setenviron.3 b/usr/src/contrib/ast/src/lib/libast/man/setenviron.3 deleted file mode 100644 index 818f7fc0d4..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/setenviron.3 +++ /dev/null @@ -1,79 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH LIBAST 3 -.SH NAME -setenviron \- set environment value -.SH SYNOPSIS -.EX -#include <ast.h> - -char* setenviron(const char* \fIkey\fP); -.EE -.SH DESCRIPTION -.L setenviron -controls environment -.I name=value -pairs. -.L setenviron("\fIname=value\fP") -adds -.I name -to the environment and returns a pointer to a -.IR strdup (3) -copy of -.IR name=value . -.L setenviron("\fIname\fP") -removes -.I name -from the environment and returns the empty string. -.L setenviron(0) -reserves a few slots in an internal array and is usually called by -a parent process that expects many children. -0 is returned on error. -.L setenviron -preserves the -.IR ksh (1) -convention of -.L _ -as the first environment variable name. -.SH "SEE ALSO" -env(1), exec(2) -.SH BUGS -POSIX will eventually settle on an interface. -It has already picked a few of the names we did in .2 drafts. -This is about the third name change for ours. diff --git a/usr/src/contrib/ast/src/lib/libast/man/sfdisc.3 b/usr/src/contrib/ast/src/lib/libast/man/sfdisc.3 deleted file mode 100644 index f0ce5b0dcd..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/sfdisc.3 +++ /dev/null @@ -1,118 +0,0 @@ -.fp 5 CW -.TH SFDISC 3 "16 June 1993" -.SH NAME -\fBsfdisc\fR \- \fBsfio\fP disciplines -.SH SYNOPSIS -.de Tp -.fl -.ne 2 -.TP -.. -.de Ss -.fl -.ne 2 -.SS "\\$1" -.. -.ta 1.0i 2.0i 3.0i 4.0i 5.0i -.nf -.ft 5 -#include <sfdisc.h> - -extern Sfdisc_t* dcnewskable(Sfio_t* f); -extern int dcdelskable(Sfdisc_t* disc); - -extern Sfdisc_t* dcnewtee(Sfio_t* tee); -extern int dcdeltee(Sfdisc_t* disc); - -extern Sfdisc_t* dcnewfilter(char* cmd); -extern int dcdelfilter(Sfdisc_t* disc); - -extern Sfdisc_t* dcnewsubstream(Sfio_t* f, long offset, long extent); -extern int dcdelsubstream(Sfdisc_t* disc); - -extern Sfdisc_t* dcnewlzw(void); -extern int dcdellzw(Sfdisc_t* disc); - -extern Sfdisc_t* dcnewunion(Sfio_t** flist, int n); -extern int dcdelunion(Sfdisc_t* disc); -.ft 1 -.fi -.SH DESCRIPTION -.PP -I/O disciplines are used to extend the data processing power of -\fIsfio\fP streams. The convention for using the disciplines -in this package is to use the call \f5dcnewXXX()\fP to create -a discipline of the type \f5XXX\fP and to use \f5dcdelXXX()\fP -to destroy it. -A discipline is enable by inserting it into the desired -stream using the \f5sfdisc()\fP call. A discipline can be used on only -one stream. It is unsafe to share a discipline on two or more streams -since the discipline may maintain states between successive IO calls. -For multiple uses, \f5dcnewXXX()\fP should be used -to create a distinct discipline for each stream. -Each discipline structure is equipped with an exception handler -that causes self-destruction when the associated stream is closed. -.PP -.Ss " Sfdisc_t* dcnewskable(Sfio_t* f);" -.Ss " int dcdelskable(Sfdisc_t* disc);" -\f5dcnewskable()\fP creates a discipline that when inserted -on the stream \f5f\fP will ensure that \f5f\fP is seekable. -If \f5f\fP is originally unseekable, data will be shadowed -in a temporary file stream to allow seekability. -\f5dcnewskable()\fP returns the discipline on success and \f5NULL\fP on failure. - -.Ss " Sfdisc_t* dcnewtee(Sfio_t* tee);" -.Ss " int dcdeltee(Sfdisc_t* disc);" -\f5dcnewtee()\fP creates a discipline that -when inserted into a stream \f5f\fP will duplicate to the stream \f5tee\fP -any data written to \f5f\fP. -\f5dcnewtee()\fP returns the discipline on success and \f5NULL\fP on failure. - -.Ss " Sfdisc_t* dcnewfilter(char* cmd);" -.Ss " int dcdelfilter(Sfdisc_t* disc);" -\f5dcnewfilter()\fP creates a discipline that -when inserted into a stream \f5f\fP will run the command \f5cmd\fP -to process any input data before making it available to the application. -For example, \f5dcnewfilter("uncompress")\fP is an equivalent but slower -alternative to the lzw discipline below. -\f5dcnewfilter()\fP returns the discipline on success and \f5NULL\fP on failure. - -.Ss " Sfdisc_t* dcnewsubstream(Sfio_t* base, long offset, long extent);" -.Ss " int dcdelsubstream(Sfdisc_t* disc);" -\f5dcnewsubstream()\fP creates a discipline that -reserves a portion of the stream \f5base\fP starting at \f5offset\fP -with length \f5extent\fP and makes this portion appear as if it is -a stream. When this discipline is inserted into a stream, it will make -cause all IO operations on this stream to take place in the reserved -portion of the \f5base\fP stream. -\f5dcnewsubstream()\fP returns the discipline on success and \f5NULL\fP on failure. - -.Ss " Sfdisc_t* dcnewlzw(void); -.Ss " int dcdellzw(Sfdisc_t* disc);" -\f5dcnewlzw()\fP creates a discipline that when inserted into -a stream \f5f\fP will run the \fBuncompress\fP algorithm -on input data from \f5f\fP before making it available to the -application. This is useful to allow applications to process -data from a file packed with the UNIX \fBcompress\fP utility -as if the data is in plain text. -\f5dcnewlzw()\fP returns the discipline on success and \f5NULL\fP on failure. - -.Ss " Sfdisc_t* dcnewunion(Sfio_t** list, int n); -.Ss " int dcdelunion(Sfdisc_t* disc);" -\f5dcnewunion()\fP creates a discipline that concatenates -input data from all \f5n\fP streams in \f5list\fP. -When inserted into a stream \f5f\fP, this discipline will cause -all input operations on \f5f\fP to come from the merged data stream. -\f5dcnewunion()\fP returns the discipline on success and \f5NULL\fP on failure. - -.SH ACKNOWLEDGMENTS -Dave Korn contributed the substream discipline. -Jim Arnold contributed the lzw discipline. - -.SH NOTES -Since we are not sure of the legal responsibilities concerning the lzw patent, -the lzw discipline is not currently distributed with any release of sfio -outside of AT&T. - -.SH AUTHOR -Kiem-Phong Vo, kpv@research.att.com. diff --git a/usr/src/contrib/ast/src/lib/libast/man/sfio.3 b/usr/src/contrib/ast/src/lib/libast/man/sfio.3 deleted file mode 100644 index f22d0b76d3..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/sfio.3 +++ /dev/null @@ -1,2373 +0,0 @@ -.fp 5 CW -.TH SFIO 3 "01 June 2008" -.SH NAME -\fBsfio\fR \- safe/fast string/file input/output -.SH SYNOPSIS -.de Tp -.fl -.ne 3 -.TP -.. -.de Ss -.fl -.ne 3 -.SS "\\$1" -.. -.ta 1.0i 2.0i 3.0i 4.0i 5.0i -.Ss "LIBRARIES" -.nf -.ft 5 -#include <sfio.h> - -libsfio.a -lsfio -libstdio.a -lstdio -libsfio-mt.a -lsfio-mt -libstdio-mt.a -lstdio-mt -.ft 1 -.fi -.Ss "DATA TYPES" -.nf -.ft 5 -Void_t; -Sfoff_t; -Sflong_t; -Sfulong_t; -Sfdouble_t; - -Sfio_t; - -Sfdisc_t; -ssize_t (*Sfread_f)(Sfio_t*, Void_t*, size_t, Sfdisc_t*); -ssize_t (*Sfwrite_f)(Sfio_t*, const Void_t*, size_t, Sfdisc_t*); -Sfoff_t (*Sfseek_f)(Sfio_t*, Sfoff_t, int, Sfdisc_t*); -int (*Sfexcept_f)(Sfio_t*, int, Void_t*, Sfdisc_t*); - -Sffmt_t; -int (*Sffmtext_f)(Sfio_t*, Void_t*, Sffmt_t*); -int (*Sffmtevent_f)(Sfio_t*, int, Void_t*, Sffmt_t*); - -SFIO_VERSION -.ft 1 -.fi -.Ss "BIT FLAGS" -.nf -.ft 5 -SF_STRING -SF_READ -SF_WRITE -SF_APPENDWR (SF_APPEND) -SF_LINE -SF_SHARE -SF_PUBLIC -SF_MALLOC -SF_STATIC -SF_IOCHECK -SF_WHOLE -SF_MTSAFE -SF_IOINTR -.ft 1 -.fi -.Ss "OPENING/CLOSING STREAMS" -.nf -.ft 5 -Sfio_t* sfnew(Sfio_t* f, Void_t* buf, size_t size, int fd, int flags); -Sfio_t* sfopen(Sfio_t* f, const char* string, const char* mode); -Sfio_t* sfpopen(Sfio_t* f, const char* cmd, const char* mode); -Sfio_t* sftmp(size_t size); -int sfclose(Sfio_t* f); - - -.ft 1 -.fi -.Ss "THREAD SAFETY" -.nf -.ft 5 -int sfmutex(Sfio_t* f, int type); - -SFMTX_LOCK -SFMTX_TRYLOCK -SFMTX_UNLOCK -SFMTX_CLRLOCK -.ft 1 -.fi -.Ss "INPUT/OUTPUT OPERATIONS" -.nf -.ft 5 -int sfgetc(Sfio_t* f); -int sfputc(Sfio_t* f, int c); -int sfnputc(Sfio_t* f, int c, int n); -int sfungetc(Sfio_t* f, int c); - -Sfulong_t sfgetm(Sfio_t* f, Sfulong_t max); -int sfputm(Sfio_t* f, Sfulong_t v, Sfulong_t max); -Sfulong_t sfgetu(Sfio_t* f); -int sfputu(Sfio_t* f, Sfulong_t v); -Sflong_t sfgetl(Sfio_t* f); -int sfputl(Sfio_t* f, Sflong_t v); -Sfdouble_t sfgetd(Sfio_t* f); -int sfputd(Sfio_t* f, Sfdouble_t v); - -char* sfgetr(Sfio_t* f, int rsc, int type); -ssize_t sfputr(Sfio_t* f, const char* s, int rsc); -Sfoff_t sfmove(Sfio_t* fr, Sfio_t* fw, Sfoff_t n, int rsc); - -ssize_t sfread(Sfio_t* f, Void_t* buf, size_t n); -ssize_t sfwrite(Sfio_t* f, const Void_t* buf, size_t n); -Sfoff_t sfseek(Sfio_t* f, Sfoff_t offset, int type); -Void_t* sfreserve(Sfio_t* f, ssize_t n, int type); -.ft 1 -.fi -.Ss "DATA FORMATTING" -.nf -.ft 5 -int sfscanf(Sfio_t* f, const char* format, ...); -int sfsscanf(const char* s, const char* format, ...); -int sfvsscanf(const char* s, const char* format, va_list args); -int sfvscanf(Sfio_t* f, const char* format, va_list args); - -int sfprintf(Sfio_t* f, const char* format, ...); -char* sfprints(const char* format, ...); -char* sfvprints(const char* format, va_list args); -ssize_t sfaprints(char** sp, const char* format, ...); -ssize_t sfvaprints(char** sp, const char* format, va_list args); -int sfsprintf(char* s, int n, const char* format, ...); -int sfvsprintf(char* s, int n, const char* format, va_list args); -int sfvprintf(Sfio_t* f, const char* format, va_list args); - -Sffmt_t; - -SFFMT_LEFT -SFFMT_SIGN -SFFMT_BLANK -SFFMT_ZERO -SFFMT_THOUSAND -SFFMT_LONG -SFFMT_LLONG -SFFMT_SHORT -SFFMT_LDOUBLE -SFFMT_IFLAG -SFFMT_JFLAG -SFFMT_CENTER -SFFMT_CHOP -SFFMT_ALTER -SFFMT_SKIP -SFFMT_ARGPOS -SFFMT_VALUE - -int (*Sffmtext_f)(Sfio_t* f, Void_t* v, Sffmt_t* fe); -int (*Sffmtevent_f)(Sfio_t* f, int type, Void_t* v, Sffmt_t* fe); -void va_copy(va_list to, va_list fr); -long sffmtversion(Sffmt_t* fe, type); -.ft 1 -.fi -.Ss "BUFFERING, SYNCHRONIZATION" -.nf -.ft 5 -Void_t* sfsetbuf(Sfio_t* f, Void_t* buf, size_t size); -int sfsync(Sfio_t* f); -int sfpoll(Sfio_t** flist, int n, int timeout); -Sfio_t* sfpool(Sfio_t* f, Sfio_t* poolf, int mode); -int sfpurge(Sfio_t* f); -.ft 1 -.fi -.Ss "DISCIPLINE, EVENT HANDLING" -.nf -.ft 5 -Sfdisc_t* sfdisc(Sfio_t* f, Sfdisc_t* disc); -int sfraise(Sfio_t* f, int type, Void_t* data); -ssize_t sfrd(Sfio_t* f, Void_t* buf, size_t n, Sfdisc_t* disc); -ssize_t sfwr(Sfio_t* f, const Void_t* buf, size_t n, Sfdisc_t* disc); -Sfoff_t sfsk(Sfio_t* f, Sfoff_t offset, int type, Sfdisc_t* disc); - -SF_NEW -SF_READ -SF_WRITE -SF_SEEK -SF_CLOSING (SF_CLOSE) -SF_DPUSH -SF_DPOP -SF_DPOLL -SF_DBUFFER -SF_SYNC -SF_PURGE -SF_FINAL -SF_READY -SF_LOCKED -SF_ATEXIT -SF_EVENT -.ft 1 -.fi -.Ss "STREAM CONTROL" -.nf -.ft 5 -int sfresize(Sfio_t* f, Sfoff_t size); -int sfset(Sfio_t* f, int flags, int i); -int sfsetfd(Sfio_t* f, int fd); -Sfio_t* sfstack(Sfio_t* base, Sfio_t* top); -Sfio_t* sfswap(Sfio_t* f1, Sfio_t* f2); -.ft 1 -.fi -.Ss "STREAM INFORMATION" -.nf -.ft 5 -Sfoff_t sfsize(Sfio_t* f); -Sfoff_t sftell(Sfio_t* f); -ssize_t sfvalue(Sfio_t* f); -int sffileno(Sfio_t* f); - -int sfstacked(Sfio_t* f); -int sfeof(Sfio_t* f); -int sferror(Sfio_t* f); -int sfclrerr(Sfio_t* f); -int sfclrlock(Sfio_t* f); - -int sfnotify(void (*notify)(Sfio_t* f, int type, Void_t* data)); - -int sfwalk(Sfwalk_f walkf, Void_t* data, int type); -.ft 1 -.fi -.Ss "MISCELLANEOUS FUNCTIONS" -.nf -.ft 5 -ssize_t sfmaxr(ssize_t maxr, int s); -ssize_t sfslen(); -int sfulen(Sfulong_t v); -int sfllen(Sflong_t v); -int sfdlen(Sfdouble_t v); -ssize_t sfpkrd(int fd, Void_t* buf, size_t n, - int rsc, long tm, int action); -.ft 1 -.fi -.Ss "FULL STRUCTURE SFIO_T" -.nf -.ft 5 -#include <sfio_t.h> -#define SFNEW(buf,size,file,flags,disc) -.ft 1 -.fi -.Ss "EXAMPLE DISCIPLINES" -.nf -.ft 5 -#include <sfdisc.h> - -int sfdcdio(Sfio_t* f, size_t bufsize); -int sfdcdos(Sfio_t* f); -int sfdcfilter(Sfio_t* f, const char* cmd); -int sfdcseekable(Sfio_t* f); -int sfdcslow(Sfio_t* f); -int sfdcsubstream(Sfio_t* f, Sfio_t* parent, - Sfoff_t offset, Sfoff_t extent); -int sfdctee(Sfio_t* f, Sfio_t* tee); -int sfdcunion(Sfio_t* f, Sfio_t** array, int n); -int sfdclzw(Sfio_t* f); -int sfdcgzip(Sfio_t* f, int flags); -.ft 1 -.fi -.Ss "STDIO-COMPATIBILITY" -.nf -.ft 5 -#include <stdio.h> -cc ... -lstdio -lsfio -cc ... -lstdio-mt -lsfio-mt -.ft 1 -.fi -.SH DESCRIPTION -.PP -Sfio provides I/O functions to manage buffered streams. -Each Sfio stream is a \fIfile stream\fP, representing a file (see \f5open(2)\fP), -or a \fIstring stream\fP, representing a memory segment. -Beyond the usual I/O operations on streams, -Sfio provides I/O disciplines for extended data processing, -stream stacks for recursive stream processing, and -stream pools for automatic data synchronization. -Applications can extend the \f5sfprintf()/sfscanf()\fP functions -to define their own conversion patterns as well as redefine existing ones. -.PP -A discipline defines analogues of -the system calls \f5read(2), write(2)\fP and \f5lseek(2)\fP. -Such system calls or their discipline replacements are used to process stream data. -Henceforth, ``\fIsystem call\fP'' will refer to either a system call -or its discipline replacement. -.PP -A system call is said to cause an exception if its return value is non-positive. -Unless overridden by exception handlers (see \f5sfdisc()\fP), -an interrupted system call (\f5errno == EINTR\fP on UNIX systems) -will be automatically reinvoked to continue the ongoing operation. -.PP -The buffer of a stream is typically a memory segment allocated via \f5malloc(3)\fP -or supplied by the application. -File streams may also use memory mapping (\f5mmap(2)\fP) if that is more efficient. -When memory mapping is used, -the underlying file should not be truncated while the stream is active. -Memory mapping can be turned off using \f5sfsetbuf()\fP. -.PP -There are three \fIstandard streams\fP: -\f5sfstdin\fP for input (file descriptor \f50\fP on UNIX systems), -\f5sfstdout\fP for normal output (file descriptor \f51\fP), and -\f5sfstderr\fP for error output (file descriptor \f52\fP). - -.PP -.Ss "LIBRARIES" -.PP -This version of Sfio can be built and used for both uni-threaded and multi-threaded -environments. In the former case, streams are not protected from -simultaneous accesses by different threads. In the latter case, a stream -is typically locked with a mutex during access so that another thread -trying to access the same stream will block until the mutex is released. - -A program that does not use multiple threads can link with \fBlibsfio.a\fP -while a program that uses multiple threads should link with \fBlibsfio-mt.a\fP. -The libraries \fBlibstdio.a\fP and \fBlibstdio-mt.a\fP provide -corresponding Stdio functions to link with code already compiled using the -native header \fBstdio.h\fP instead of the one provided by Sfio. - -.PP -.Ss "DATA TYPES" -.PP -.Ss " Void_t*" -This defines a type suitable to exchange -data of unknown types between application and Sfio. -\f5Void_t\fP is a macro defined as \f5void\fP for ANSI-C and C++ and -\f5char\fP for other compilation environments. -.PP -.Ss " Sfoff_t" -This defines an integral type suitable to address -the largest possible file extent. -.PP -.Ss " Sfulong_t, Sflong_t, Sfdouble_t" -These are respectively the largest -unsigned integer, signed integer, and floating point value types on the local platform. -.PP -.Ss " Sfio_t" -This defines the type of a stream handle. -.PP -.Ss " Sfdisc_t" -.Ss " ssize_t (*Sfread_f)(Sfio_t*, Void_t*, size_t, Sfdisc_t*)" -.Ss " ssize_t (*Sfwrite_f)(Sfio_t*, const Void_t*, size_t, Sfdisc_t*)" -.Ss " Sfoff_t (*Sfseek_f)(Sfio_t*, Sfoff_t, int, Sfdisc_t*)" -.Ss " int (*Sfexcept_f)(Sfio_t*, int, Void_t*, Sfdisc_t*)" -\f5Sfdisc_t\fP defines a stream discipline structure. -\f5Sfread_f\fP, \f5Sfwrite_f\fP and \f5Sfseek_f\fP are the types -of discipline functions to replace the system calls: -\f5read(2)\fP, \f5write(2)\fP and \f5lseek(2)\fP. -\f5Sfexcept_f\fP is the type of an event-handling function. -See \f5sfdisc()\fP for more details. -.PP -.Ss " Sffmt_t" -.Ss " int (*Sffmtext_f)(Sfio_t*, Void_t*, Sffmt_t*)" -.Ss " int (*Sffmtevent_f)(Sfio_t*, int, Void_t*, Sffmt_t*)" -\f5Sffmt_t\fP defines a formatting environment that can be used -to extend scanning and printing in the \f5sfprint()/sfscanf()\fP -functions. \f5Sffmtext_f\fP and \f5Sffmtevent_f\fP define the types -of extension functions definable in \f5Sffmt_t\fP. -See \f5Sffmt_t\fP below for more details. -.PP -.Ss " SFIO_VERSION" -This is a macro value of type \f5long int\fP that defines -the current version number of Sfio. For example, the Sfio2000's -version number is \f520000515L\fP -(which also indicates its latest version date: 05/15/2000). - -.Ss "BIT FLAGS" -A number of bit flags control stream operations. -They are set either at stream initialization or by calling \f5sfset()\fP. -Following are the flags: -.Tp -\f5SF_STRING\fP: -The stream is memory-based. -.Tp -\f5SF_READ\fP, \f5SF_WRITE\fP, \f5SF_APPENDWR\fP (\f5SF_APPEND\fP): -Flags \f5SF_READ\fP and \f5SF_WRITE\fP indicate readability and writability. -Flag \f5SF_APPENDWR\fP asserts that the stream is a file opened in append mode -(see \f5open(2)\fP and \f5fcntl(2)\fP) -so that data is always output at the end of file. -On systems without direct support for append mode, -Sfio uses \f5lseek(2)\fP or its discipline replacement -to approximate this behavior. -.Tp -\f5SF_LINE\fP: -The stream is line-oriented. -For a \f5SF_WRITE\fP stream, -this means that buffered data is flushed -whenever a new-line character, \f5\en\fP, is output. -For a \f5SF_READ\fP stream, \f5SF_LINE\fP is only -significant during calls to functions in the \f5sfscanf()\fP family. -\f5SF_LINE\fP is set on initialization of -any stream representing a terminal device. -.Tp -\f5SF_SHARE\fP, \f5SF_PUBLIC\fP: -Flag \f5SF_SHARE\fP means that the underlying file descriptor -is shared by independent entities (for example, multiple processes). - -For a seekable file stream, \f5SF_SHARE\fP means that -the logical stream and the physical file positions will be made the same -before a system call to perform physical I/O. -There are different possibilities. -If \f5SF_PUBLIC\fP is not set, -the physical file position is made equal to the logical stream position. -If \f5SF_PUBLIC\fP is set, there are two cases. -If the physical file position has changed from its last known position, -the logical stream position is made equal to the new physical file position. -Finally, if the physical file location remains the same as its last known position, -the physical file position is made the same as the logical stream position. - -For an unseekable stream (e.g., pipes or terminal devices), if possible, -\f5SF_SHARE\fP means that -the block and record I/O operations (\f5sfread()\fP, \f5sfwrite()\fP, \f5sfmove()\fP, -\f5sfgetr()\fP, \f5sfputr()\fP, \f5sfreserve()\fP, \f5sfscanf()\fP -and \f5sfvprintf()\fP) will ensure: -(1) after each writing operation, the stream is synchronized and -(2) each reading operation only reads the requested amount. -Note, however, that (2) is not always possible -without proper OS facilities such as \f5recv(2)\fP or \f5streamio(4)\fP. - -A standard stream that is seekable will be initialized with \f5SF_SHARE|SF_PUBLIC\fP. -.Tp -\f5SF_MALLOC\fP: -The stream buffer was obtained via \f5malloc(3)\fP -and can be reallocated or freed. -.Tp -\f5SF_STATIC\fP: -The stream structure should not be freed when closed (\f5sfclose()\fP). -This flag is used by an applications that allocate their own -stream structures. Such applications must use the header file \f5sfio_t.h\fP -instead of \f5sfio.h\fP. -.Tp -\f5SF_IOCHECK\fP: -If the stream has a discipline exception handler, -exceptions will be raised in \f5sfsync()\fP, \f5sfpurge()\fP -or before a system call \f5read(2)\fP or \f5write(2)\fP (see \f5sfdisc()\fP). -.Tp -\f5SF_WHOLE\fP: -This flag guarantees that data written in any single \f5sfwrite()\fP or -\f5sfputr()\fP call will always be output as a whole to the output device. -This is useful in certain applications (e.g., networking) where a complex object -must be output without being split in different system calls. -Note that the respective stream still buffers data as much as the buffer can accomodate. -.Tp -\f5SF_MTSAFE\fP: -This flag indicates that the respective stream may be accessed by more than one threads. -A mutex lock will be used to ensure that only one thread at a time can access -the stream. Note that this flag can only be set at stream opening time -(see \f5sfopen()\fP, \f5sfpopen()\fP and \f5sfnew()\fP). -Certain fast macro functions such as \f5sfgetc()\fP and \f5sfputc()\fP will -no longer behave as macros. Thus, an application that requires such fast macro functions -should leave \f5SF_MTSAFE\fP off and performs explicit locking with \f5sfmutex()\fP. -.Tp -\f5SF_IOINTR\fP: -This flag indicates that I/O system calls should not be resumed -after being interrupted by signals. It is useful for -aborting I/O operations on such interruptions. Note, however, -than certain operating systems (e.g., BSD Unix systems) may automatically -resume interrupted system calls outside the scope of the library. On such systems, -\f5SF_IOINTR\fP will be ineffective. - -.PP -.Ss "OPENING/CLOSING STREAMS" -.PP -.Ss " Sfio_t* sfnew(Sfio_t* f, Void_t* buf, size_t size, int fd, int flags)" -This function creates or renews a stream. -It returns the new stream on success and \f5NULL\fP on error. -.Tp -\f5f\fP: -If \f5f\fP is \f5NULL\fP, a new stream is created. -Otherwise, \f5f\fP is reused. -In this case, if \f5flags\fP does not have \f5SF_EOF\fP, -\f5f\fP shall be closed via \f5sfclose()\fP before being reused. -During a stream renewal, buffer, pool and discipline stack are preserved. -Note that, except for \f5SF_STATIC\fP streams, -renewing a stream already closed will result in undefined behavior. -.Tp -\f5buf\fP, \f5size\fP: -These determine a buffering scheme. -See \f5sfsetbuf()\fP for more details. -.Tp -\f5fd\fP: -If \f5SF_STRING\fP is specified in \f5flags\fP, this is ignored. -Otherwise, \f5fd\fP is a file descriptor (e.g., from \f5open(2)\fP) -to use for raw data I/O. -Note that Sfio supports unseekable file descriptors -opened for both read and write, e.g., sockets. -.Tp -\f5flags\fP: -This is composed from \f5SF_EOF\fP and -bit values defined in the \fBBIT FLAGS\fP section. -Note, in particular, that a multi-threaded application should -set the bit \f5SF_MTSAFE\fP to protect the new stream from -being simultaneously accessed by multiple threads. - -.Ss " Sfio_t* sfopen(Sfio_t* f, const char* string, const char* mode)" - -If \f5string\fP is \f5NULL\fP, -\f5f\fP is a file stream and -\f5mode\fP does not imply a string stream, -\f5sfopen()\fP changes the modes of \f5f\fP according to \f5mode\fP. -In this case, \f5sfopen()\fP returns \f5f\fP on success and \f5NULL\fP on error. -This somewhat unusual usage of \f5sfopen()\fP is good for -resetting certain predefined modes in standard streams including -\fItext/binary\fP and \fIappend\fP that are inherited from some parent process. -Note also that \f5SF_READ\fP and \f5SF_WRITE\fP can only be reset if the stream -is not yet initialized. - -\f5sfopen()\fP is normally used to create a new stream or renew a stream. -In this case, it returns the new stream on success and \f5NULL\fP on error. -Below are the meanings of the arguments: -.Tp -\f5f\fP: -This is treated as in \f5sfnew()\fP. -.Tp -\f5string\fP: -This is a file name or a string to perform I/O on. -See above for when this is \f5NULL\fP. -.Tp -\f5mode\fP: -This is composed from the set of letters \f5{s, r, w, +, a, b, t, x, m, u}\fP. -When conflicting options are present in the same \f5mode\fP string, -the last one will take effect. - -\f5s\fP specifies opening a string stream. -\f5string\fP can be a null-terminated string or \f5NULL\fP. -Specifying \f5s\fP alone is equivalent to specifying \f5sr\fP. -If \f5s\fP is not specified, \f5string\fP defines a file name. - -\f5r\fP and \f5w\fP specify read and write modes. -Write mode creates and/or truncates the given file to make an empty file. -The \f5+\fP modifier indicates that the stream is opened for both read and write. - -\f5a\fP specifies append mode, i.e., data is always output at end of file. - -\f5b\fP and \f5t\fP specify binary and text modes. - -\f5x\fP specifies exclusive mode, i.e., -a file opened for writing should not already exist. - -\f5m\fP specifies that the stream needs to be protected from -simultaneous accesses by multiple threads. -This turns on the bit flag \f5SF_MTSAFE\fP. - -\f5u\fP specifies that the stream is guaranteed to be accessed -by only one thread at a time. The bit flag \f5SF_MTSAFE\fP is left off. -The absence of option \f5m\fP is the same as the presence of option \f5u\fP. - -.Ss " Sfio_t* sfpopen(Sfio_t* f, const char* cmd, const char* mode)" -This function opens a stream that corresponds to the coprocess \f5cmd\fP. -The argument \f5mode\fP should be composed from \f5r\fP, \f5w\fP, and \f5+\fP. -The argument \f5f\fP, if not \f5NULL\fP, is a stream to be renewed (see \f5sfnew()\fP). -\f5sfpopen()\fP returns the new stream or \f5NULL\fP on error. - -The standard input/output of \f5cmd\fP -is connected to the application via a pipe if the stream is opened for writing/reading. -If the stream is opened for both reading and writing, -there will be two different associated file descriptors, one for each type of I/O -(note the effect on \f5sffileno()\fP). - -On opening a coprocess for writing (i.e., \f5mode\fP contains \f5w\fP or \f5+\fP), -the signal handler for \f5SIGPIPE\fP in the parent application -will be set to \f5SIG_IGN\fP if it is \f5SIG_DFL\fP at that time. -This protects the parent application from being accidentally killed -on writing to a coprocess that closes its reading end. -Applications that need to detect such write errors should use -disciplines and exception handlers (see \f5sfdisc()\fP). - -The command \f5cmd\fP -is executed by an \fIinterpreter\fP which is either \f5/bin/sh\fP -or an executable command defined by the environment variable \f5SHELL\fP. -In either case, the interpreter is invoked with 2 arguments, respectively \f5-c\fP -and the given command \f5cmd\fP. When the interpreter is \f5/bin/sh\fP or -\f5/bin/ksh\fP, \f5sfpopen()\fP may execute the command \f5cmd\fP itself -if there are no shell meta-characters in \f5cmd\fP. - -.Ss " Sfio_t* sftmp(size_t size)" -This function creates a stream for temporary data. -It returns the new stream or \f5NULL\fP on error. - -A stream created by \f5sftmp()\fP can be completely or partially memory-resident. -If \f5size\fP is \f5SF_UNBOUND\fP, the stream is a pure string stream. -If \f5size\fP is zero, the stream is a pure file stream. -Otherwise, the stream is first created as a string stream but when -its buffer grows larger than \f5size\fP or on any attempt to change disciplines, -a temporary file is created. -Two environment variables, \f5TMPPATH\fP and \f5TMPDIR\fP, -direct where temporary files are created. -\f5TMPPATH\fP, if defined, -specifies a colon-separated set of directories to be -used in a round-robin fashion to create files. -If \f5TMPPATH\fP is undefined, -\f5TMPDIR\fP can be used to specify a single directory to create files. -If neither of \f5TMPPATH\fP and \f5TMPDIR\fP are defined, \f5/tmp\fP is used. - -.Ss " int sfclose(Sfio_t* f)" -This function closes the stream \f5f\fP and frees its resources. -\f5SF_STATIC\fP should be used if the stream space is to be preserved. -If \f5f\fP is the base of a stream stack (see \f5sfstack()\fP), -all streams on the stack are closed. -If \f5f\fP is a \f5sfpopen\fP-stream, -\f5sfclose()\fP waits until the associated command terminates -and returns its exit status. -\f5sfclose()\fP returns \f5-1\fP for failure and \f50\fP for success. - -\f5SF_READ|SF_SHARE\fP and \f5SF_WRITE\fP streams -are synchronized before closing (see \f5sfsync()\fP). -If \f5f\fP has disciplines, -their exception handlers will be called twice. -The first exception handler call has the \f5type\fP argument as one of -\f5SF_CLOSING\fP or \f5SF_NEW\fP (see \f5sfdisc()\fP.) -The latter, \f5SF_NEW\fP is used when a stream is being closed via \f5sfnew()\fP -so that it can be renewed. -The second call uses \f5type\fP as \f5SF_FINAL\fP -and is done after all closing operations have succeeded but before -the stream itself is deallocated. -In either case, if the exception handler returns a negative value, -\f5sfclose()\fP will immediately return this value. -If the exception handler returns a positive value, -\f5sfclose()\fP will immediately return a zero value. - -.PP -.Ss "THREAD SAFETY" -.PP -The libraries \f5libsfio.a\fP and \f5libstdio.a\fP (providing binary -compatibility to Stdio-based code) only support uni-threaded code. -Multi-threaded applications should link with -\f5libsfio-mt.a\fP and \f5libstdio-mt.a\fP. -When this is done, certain platforms may require additional -thread libraries for linkage. For example, Linux, Irix and Solaris -require \f5-lpthread\fP while HPUX requires \f5-lcma\fP. -Aside from linkage differences, the Sfio API remains identical in all cases. - -Note that unlike Stdio streams which are in thread-safe mode by default. -Sfio streams can be opened in either uni-threaded or multi-threaded mode. -A uni-threaded stream is more efficient than a multi-threaded one. -For example, functions such as \f5sfgetc()\fP and \f5sfputc()\fP -remain as macro or inline functions for a uni-threaded stream while -they will act as full function calls in a multi-threaded case. -The three standard streams \f5sfstdin/sfstdout/sfstderr\fP -are in multi-threaded mode by default -(however, see \f5sfopen()\fP for how this may be changed). -Other Sfio streams are normally opened uni-threaded unless -the flag \f5SF_MTSAFE\fP or the option \f5m\fP were specified. -Stdio-based code can also make a Stdio stream uni-threaded by -using the option \f5u\fP when opening a file. - -.PP -.Ss "int sfmutex(Sfio_t* f, int type)" -This function acquires or releases a mutex -(mutually exclusive) lock on the stream \f5f\fP. -It can be used by a thread to serialize a sequence of I/O operations -executed together in some critical section. -\f5sfmutex()\fP is implicitly used by -all Sfio operations on a stream with the flag \f5SF_MTSAFE\fP to -protect it from concurrent accesses via multiple threads. -\f5sfmutex()\fP returns \f50\fP on success and some non-zero value on failure. - -Each stream has a lock count which starts at \f50\fP. -When the count is positive, a single thread holds the stream. -Only this thread can further lock or unlock the stream. -A different thread attempting to acquire such a locked stream will suspend -until the lock count returns to \f50\fP. -Each successful locking operation increases the lock count -while each successful unlocking operation decreases it, -thus, allowing nesting of matching lock/unlock operations. - -The \f5type\fP argument of \f5sfmutex()\fP takes on the below values: -.Tp -\f5SFMTX_LOCK\fP: -Locking a stream if it is unlocked or increasing the lock count of the stream -if it is already locked by the same thread. This call will block until it is -possible to lock the stream. -.Tp -\f5SFMTX_TRYLOCK\fP: -This is the non-blocking version of \f5SFMTX_LOCK\fP. -If the stream is already locked by a different thread, \f5sfmutex()\fP will -immediately return with an error status. -.Tp -\f5SFMTX_UNLOCK\fP: -Decreasing the lock count and releasing the stream when the lock count reaches 0. -An attempt to unlock a stream without a previously successful lock may -result in undefined behavior in certain implementations. -The current Sfio implementation returns an error status. -.Tp -\f5SFMTX_CLRLOCK\fP: -Resetting the lock count to \f50\fP and releasing the stream. -As with \f5SFMTX_LOCK\fP, -an attempt to clear the lock count without a previously successful lock -may result in undefined behavior. -.PP -.Ss "INPUT/OUPUT OPERATIONS" -.PP -.Ss " int sfgetc(Sfio_t* f)" -.Ss " int sfputc(Sfio_t* f, int c)" -These functions read/write a byte from/to stream \f5f\fP. -\f5sfgetc()\fP returns the byte read or \f5-1\fP on error. -\f5sfputc()\fP returns \f5c\fP on success and \f5-1\fP on error. - -.Ss " ssize_t sfnputc(Sfio_t* f, int c, size_t n)" -This function attempts to write the byte \f5c\fP to \f5f\fP \f5n\fP times. -It returns the number of bytes actually written or \f5-1\fP on failure. - -.Ss " int sfungetc(Sfio_t* f, int c)" -This function pushes the byte \f5c\fP back into \f5f\fP. -If \f5c\fP matches the byte immediately before the current position in buffered data, -the current position is simply backed up (note the effect on \f5sftell()\fP and -\f5sfseek()\fP). There is no theoretical limit on the number of bytes that -can be pushed back into a stream. Pushed back bytes not part of -buffered data will be discarded on any operation that implies -buffer synchronization. -\f5sfungetc()\fP returns \f5c\fP on success and \f5-1\fP on failure. - -.Ss " Sfulong_t sfgetm(Sfio_t* f, Sfulong_t max)" -.Ss " int sfputm(Sfio_t* f, Sfulong_t v, Sfulong_t max)" -These functions read and write \f5Sfulong_t\fP values -encoded in a portable format given that the values are at most \f5max\fP. -Portability across a write architecture and a read architecture -requires that the bit order in a byte is the same on both architectures and -the written value is storable in an \f5Sfulong_t\fP on the read architecture. -\f5sfgetm()\fP returns the value read or \f5-1\fP on error. -\f5sfputm()\fP returns the number of bytes written or \f5-1\fP on error. - -.Ss " Sfulong_t sfgetu(Sfio_t* f)" -.Ss " int sfputu(Sfio_t* f, Sfulong_t v)" -These functions read and write \f5Sfulong_t\fP values -in a compact variable-length portable format. -Portability across a write architecture and a read architecture -requires that the bit order in a byte is the same on both architectures and -the written value is storable in an \f5Sfulong_t\fP on the read architecture. -\f5sfgetu()\fP returns the value read or \f5-1\fP on error. -\f5sfputu()\fP returns the number of bytes written or \f5-1\fP on error. -See also \f5sfulen()\fP. - -.Ss " Sflong_t sfgetl(Sfio_t* f)" -.Ss " int sfputl(Sfio_t* f, Sflong_t v)" -These functions are similar to \f5sfgetu()\fP and \f5sfputu()\fP -but for reading and writing (signed) \f5Sflong_t\fP values. -See also \f5sfllen()\fP. - -.Ss " Sfdouble_t sfgetd(Sfio_t* f)" -.Ss " int sfputd(Sfio_t* f, Sfdouble_t v)" -These functions read and write \f5Sfdouble_t\fP values. -In this case, portability depends on the input and output architectures -having the same floating point value representation. -Values are coded and decoded using \f5ldexp(3)\fP and \f5frexp(3)\fP -so they are constrained to the sizes supported by these functions. -See also \f5sfdlen()\fP. - -.Ss " char* sfgetr(Sfio_t* f, int rsc, int type)" -This function reads a record of data ending in the record separator \f5rsc\fP. -After \f5sfgetr()\fP returns, the length of the record even if it is incomplete -can be retrieved with \f5sfvalue()\fP. -\f5sfgetr()\fP returns the record on success and \f5NULL\fP on error. -See also \f5sfmaxr()\fP for limiting the amount of data read to construct a record. - -The \f5type\fP argument is composed of some subset of the below bit flags: -.Tp -\f5SF_STRING\fP: -A null byte will replace the record separator to make the record into a C string. -Otherwise, the record separator is left alone. -.Tp -\f5SF_LOCKR\fP: -Upon successfully obtaining a record \f5r\fP, -the stream will be locked from further access until it is released with -a call \f5sfread(f,r,0)\fP. -.Tp -\f5SF_LASTR\fP: -This should be used only after a failed \f5sfgetr()\fP to retrieve -the last incomplete record. In this case, \f5rsc\fP is ignored. - -.Ss " ssize_t sfputr(Sfio_t* f, const char* s, int rsc)" -This function writes the null-terminated string \f5s\fP to \f5f\fP. -If \f5rsc\fP is non-negative, \f5(unsigned char)rsc\fP is output after the string. -\f5sfputr()\fP returns the number of bytes written or \f5-1\fP on failure. - -.Ss " Sfoff_t sfmove(Sfio_t* fr, Sfio_t* fw, Sfoff_t n, int rsc)" -This function moves objects -from input stream \f5fr\fP to output stream \f5fw\fP. -\f5sfmove()\fP returns the number of objects moved or \f5-1\fP on failure. - -An object can be either a byte if the record separator argument -\f5rsc\fP is negative or a record of \f5rsc\fP is non-negative. -In the latter case, a record is incomplete if it does not end in \f5rsc\fP. -Generally speaking, a stream can have at most one incomplete record. -If \f5n\fP is negative, all complete objects of \f5fr\fP will be moved. -Otherwise, \f5n\fP indicates the number of objects to move. -If either \f5fr\fP or \f5fw\fP is \f5NULL\fP, it acts -as if it is a stream corresponding to \f5/dev/null\fP, -the UNIX device that has no read data and throws away any write data. -For example, the call \f5sfmove(f,(Sfio_t*)0,(Sfoff_t)(-1),'\en')\fP -counts the number of complete lines in stream \f5f\fP. - -.Ss " ssize_t sfread(Sfio_t* f, Void_t* buf, size_t n)" -This function reads up to \f5n\fP bytes from \f5f\fP into buffer \f5buf\fP. -It returns the number of bytes actually read or \f5-1\fP on error. - -.Ss " ssize_t sfwrite(Sfio_t* f, const Void_t* buf, size_t n)" -This function writes \f5n\fP bytes from \f5buf\fP to \f5f\fP. -If \f5f\fP is \f5SF_STRING\fP, and the buffer is not large enough, -an \f5SF_WRITE\fP exception shall be raised. -\f5sfwrite()\fP returns the number of bytes written or \f5-1\fP on failure. - -.Ss " Sfoff_t sfseek(Sfio_t* f, Sfoff_t offset, int type)" -This function sets a new I/O position for \f5f\fP. -It returns the new position or \f5-1\fP on failure. - -If the stream is a \f5SF_STRING\fP stream and the new -address is beyond the current buffer extent, -an \f5SF_SEEK\fP exception will be raised (see \f5sfdisc()\fP). - -The new position is determined based on \f5offset\fP and -\f5type\fP which is composed from the bit flags: -.Tp -\f50\fP or \f5SEEK_SET\fP: -\f5offset\fP is the desired position. -.Tp -\f51\fP or \f5SEEK_CUR\fP: -\f5offset\fP is relative to the current position (see \f5SF_PUBLIC\fP below). -.Tp -\f52\fP or \f5SEEK_END\fP: -\f5offset\fP is relative to the physical end of file. -.Tp -\f5SF_SHARE\fP: -The stream is treated as if it has the control bit \f5SF_SHARE\fP on. -This implies that a system call seek will be done to ensure that the -location seeking to is valid. -.Tp -\f5SF_PUBLIC\fP: -The stream is treated as if it has the control bit \f5SF_PUBLIC\fP on. -If the physical file position has changed from its last known location, -the current position is taken as the new physical position. -Otherwise, the current position is the logical stream position. - -.Ss " Void_t* sfreserve(Sfio_t* f, ssize_t n, int type)" -This function reserves a data block from the stream \f5f\fP. -It returns the reserved data block on success and \f5NULL\fP on failure. - -If \f5f\fP is a \f5SF_READ\fP stream, the data block is a segment of input data. -If \f5f\fP is a \f5SF_WRITE\fP stream, the data block is a buffer -suitable for writing output data. -For consistency, if \f5f\fP is opened with \f5SF_READ|SF_WRITE\fP, -it will normally be treated as if it is a \f5SF_READ\fP stream -(see \f5sfset()\fP for forcing a particular mode) but the returned -buffer can also be written into (more below). -However, it is possible to bias to \f5SF_WRITE\fP when the \f5type\fP -argument is non-negative by adding the \f5SF_WRITE\fP bit \f5type\fP. -In any case, a reserved data block is guaranteed to be valid only until -a future access to the stream \f5f\fP. - -When \f5f\fP is \f5SF_READ\fP, \f5SF_SHARE\fP and unseekable, -\f5sfreserve()\fP will attempt to peek at input data without -consuming it. This enables separate processes to share in reading -input from unseekable file descriptors (e.g., pipes or devices). -However, this use of \f5sfreserve()\fP may fail -on certain platforms that do not properly support -peeking on unseekable file descriptors. - -After a \f5sfreserve()\fP call, whether or not it succeeds, -\f5sfvalue(f)\fP gives the size of the available data block. -Any partially reserved data block after a failed \f5sfreserve()\fP -call can be obtained in another \f5sfreserve()\fP call with the argument -\f5type\fP being \f5SF_LASTR\fP. The second argument \f5n\fP -to \f5sfreserve()\fP will be ignored in this case. - -A \f5sfreserve()\fP call is successful if it can obtain a data block -of size at least the absolute value of \f5n\fP. -For a \f5SF_READ\fP atream, the argument \f5n\fP is treated as follows: -.Tp -\f5n < 0\fP: -\f5sfreserve()\fP attempts to get \fIat least\fP \f5|n|\fP bytes -into the buffer. -.Tp -\f5n == 0\fP: -If the argument \f5type\fP is \f50\fP, -\f5sfreserve()\fP attempts to get \fIat least\fP \f51\fP byte into the buffer -but does not consume it (as consistent with \f5n == 0\fP). -If \f5type != 0\fP, no attempt will be made to read data into the buffer. -For example, the call \f5sfreserve(f, 0, -1)\fP only returns the buffer status, -i.e., size of existing buffered data and pointer to such data, if any. -The call \f5sfreserve(f, 0, SF_LOCKR)\fP is similar but also locks the stream. -.Tp -\f5n > 0\fP: -\f5sfreserve()\fP will use attempt to get \fIat most\fP \f5n\fP bytes into -the buffer. Further, if \f5type == \f5SF_LOCKR\fP (see below), read attempts -end on a positive amount. - -For a successful reservation, the argument \f5type\fP dictates treatment -as follows: -.Tp -\f5type == SF_LASTR\fP: -After a \f5sfreserve()\fP call with \f5type != SF_LOCKR\fP fails, -there may be some left over data not accessible via conventional Sfio calls. -Immediately after such a failed call, -another call to \f5sfreserve\fP with \f5type == SF_LASTR\fP will return any left over -data and also advance the stream I/O position by the amount of returned data. -.Tp -\f5type < 0\fP: -If \f5n > 0\fP, the stream I/O position is advanced by \f5n\fP. -If \f5n < 0\fP, the stream I/O position is advanced by the amount -of available data. -For example, a successful \f5sfreserve(f, -1, -1)\fP call will return a -buffer of data and simultanously advance the stream I/O position by the amount -indicated by \f5sfvalue(f)\fP. -.Tp -\f5type == SF_LOCKR\fP: -The stream I/O position remains unchanged. -In addition, \f5f\fP will be locked from further access. -As appropriate to the stream type (\f5SF_READ\fP, \f5SF_WRITE\fP or both), -\f5f\fP can be unlocked later -with one of \f5sfread(f,rsrv,size)\fP or \f5sfwrite(f,rsrv,size)\fP -where \f5rsrv\fP is the reserved data block and \f5size\fP is the amount of -data to be consumed. For example, if \f5f\fP is a locked \f5SF_READ\fP stream, -the call \f5sfread(f,rsrv,1)\fP will reopen the stream and simultaneously -advance the stream I/O position by \f51\fP. -Finally, a stream opened for both reading and writing -can release the lock with either call (with associated operational semantics!) -For example, the below code reads 10 bytes of data from a stream -opened with both \f5SF_READ\fP and \f5SF_WRITE\fP, modifies the data in place, -then rewrites the new data back to the stream: - -.nf -.ft 5 - rsrv = sfreserve(f, 10, 1); - for(i = 0; i < 10; ++i) - rsrv[i] = toupper(rsrv[i]); - sfwrite(f, rsrv, 10); -.ft 1 -.fi - -.ne 6 -.PP -.Ss "DATA FORMATTING" -.PP -Data printing and scanning are done via the -\f5sfprintf()\fP and \f5sfscanf()\fP family of functions. -These functions are similar to their -ANSI-C \f5fprintf()\fP and \f5fscanf()\fP counterparts. -However, the Sfio versions have been extended for both portability and generality. -In particular, a notion of a formatting environment stack is introduced. -Each formatting element on the stack -defines a separate \fIformatting pair\fP of a format specification string, -\f5char* format\fP (the usual second argument in the formatting -functions), and an argument list, \f5va_list args\fP (the third argument -in functions \f5sfvprintf()\fP and \f5sfvscanf()\fP). -A formatting environment element may also specify extension functions -to obtain or assign arguments and to provide new semantics for pattern processing. -To simplify the description below, whenever we talk -about an argument list, unless noted otherwise, -it is understood that this means either the true -argument list when there is no extension function or the action to be taken -by such a function in processing arguments. -The manipulation of the formatting environment stack is done -via the pattern \f5!\fP discussed below. - -.Ss "%! and Sffmt_t" -The pattern \f5%!\fP manipulates the formatting environment stack to -(1) change the top environment to a new environment, -(2) stack a new environment on top of the current top, -or (3) pop the top environment. -The bottom of the environment stack always contains a virtual environment with the -original formatting pair and without any extension functions. - -The top environment of a stack, say \f5fe\fP, is automatically popped whenever -its format string is completely processed. -In this case, its event-handling function (if any) is called -as \f5(*eventf)(f,SF_FINAL,NIL(Void_t*),fe)\fP. -The top environment -can also be popped by giving an argument \f5NULL\fP to \f5%!\fP -or by returning a negative value in an extension function. -In these cases, the event-handling function is called -as \f5(*eventf)(f,SF_DPOP,form,fe)\fP where \f5form\fP is the remainder -of the format string. A negative return value from the event handling function -will prevent the environment from being popped. - -A formatting environment is a structure of type \f5Sffmt_t\fP -which contains the following elements: - -.nf -.ft 5 - Sffmtext_f extf; /* extension processor */ - Sffmtevent_f eventf; /* event handler */ - - char* form; /* format string to stack */ - va_list args; /* corresponding arg list */ - - int fmt; /* pattern being processed */ - ssize_t size; /* object size */ - int flags; /* formatting control flags */ - int width; /* width of field */ - int precis; /* precision required */ - int base; /* conversion base */ - - char* t_str; /* extfdata string */ - int n_str; /* length of t_str */ -.ft 1 -.fi - -The first four elements of \f5Sffmt_t\fP must be defined by the application -before the structure is passed to a formatting function. -The two function fields should not be changed during processing. -Other elements of \f5Sffmt_t\fP are set by the respective formatting function -before it calls the extension function \f5Sffmt_t.extf\fP and, subsequently, -can be modified by this function to redirect formatting or scanning. -For example, consider a call from a \f5sfprintf()\fP function to process an -unknown pattern \f5%t\fP (which we may take to mean ``time'') based on a -formatting environment \f5fe\fP. -\f5fe->extf\fP may reset \f5fe->fmt\fP to `\f5d\fP' upon returing -to cause \f5sfprintf()\fP to process the value being formatted as an integer. - -Below are the fields of \f5Sffmt_t\fP: -.Tp -\f5extf\fP: -\f5extf\fP is a function to extend scanning and formatting patterns. -Its usage is discussed below. -.Tp -\f5eventf\fP: -This is a function to process events as discussed earlier. -.Tp -\f5form\fP and \f5args\fP: -This is the formatting pair of a specification string and corresponding argument list. -When an environment \f5fe\fP is being inserted into the stack, -if \f5fe->form\fP is \f5NULL\fP, the top environment is changed to \f5fe\fP -and its associated extension functions -but processing of the current formatting pair continues. -On the other hand, if \f5fe->form\fP is not \f5NULL\fP, -the new environment is pushed onto the stack -so that pattern processing will start with the new formatting pair as well as -any associated extension functions. -During processing, whenever \f5extf\fP is called, -\f5form\fP and \f5args\fP will be set to the current values of -the formatting pair in use. -.Tp -\f5fmt\fP: -This is set to the pattern being processed or one of '.', 'I', '('. -.Tp -\f5size\fP: -This is the size of the object being processed. -.Tp -\f5flags\fP: -This is a collection of bits defining the formatting flags specified for the pattern. -The bits are: - -\f5SFFMT_LEFT\fP: Flag \f5-\fP in \f5sfprintf()\fP. - -\f5SFFMT_SIGN\fP: Flag \f5+\fP in \f5sfprintf()\fP. - -\f5SFFMT_BLANK\fP: Flag \fIspace\fP in \f5sfprintf()\fP. - -\f5SFFMT_ZERO\fP: Flag \f50\fP in \f5sfprintf()\fP. - -\f5SFFMT_THOUSAND\fP: Flag \f5'\fP in \f5sfprintf()\fP. - -\f5SFFMT_LONG\fP: Flag \f5l\fP in \f5sfprintf()\fP and \f5sfscanf()\fP. - -\f5SFFMT_LLONG\fP: Flag \f5ll\fP in \f5sfprintf()\fP and \f5sfscanf()\fP. - -\f5SFFMT_SHORT\fP: Flag \f5h\fP in \f5sfprintf()\fP and \f5sfscanf()\fP. - -\f5SFFMT_LDOUBLE\fP: Flag \f5L\fP in \f5sfprintf()\fP and \f5sfscanf()\fP. - -\f5SFFMT_IFLAG\fP: flag \f5I\fP in \f5sfprintf()\fP and \f5sfscanf()\fP. - -\f5SFFMT_JFLAG\fP: flag \f5j\fP in \f5sfprintf()\fP and \f5sfscanf()\fP. - -\f5SFFMT_CENTER\fP: flag \f5=\fP in \f5sfprintf()\fP and \f5sfscanf()\fP. - -\f5SFFMT_CHOP\fP: flag \f5-\fP in \fIprecis\fP in \f5sfprintf()\fP and \f5sfscanf()\fP. - -\f5SFFMT_ALTER\fP: Flag \f5#\fP in \f5sfprintf()\fP and \f5sfscanf()\fP. - -\f5SFFMT_SKIP\fP: Flag \f5*\fP in \f5sfscanf()\fP. - -\f5SFFMT_ARGPOS\fP: This indicates argument processing for \f5pos$\fP. - -\f5SFFMT_VALUE\fP: This is set by \f5fe->extf\fP -to indicate that it is returning a value to be formatted or -the address of an object to be assigned. - -.Tp -\f5width\fP: -This is the field width. -.Tp -\f5precis\fP: -This is the precision. -.Tp -\f5base\fP: -This is the conversion base. -.Tp -\f5t_str\fP and \f5n_str\fP: -This is the type string and its size. - -.Ss " int (*Sffmtext_f)(Sfio_t* f, Void_t* v, Sffmt_t* fe)" -This is the type of the extension function \f5fe->extf\fP to process -patterns and arguments. -Arguments are always processed in order and -\f5fe->extf\fP is called exactly once per argument. -Note that, when \f5pos$\fP (below) is not used anywhere in a format string, -each argument is used exactly once per a corresponding pattern. -In that case, \f5fe->extf\fP is called -as soon as the pattern is recognized and before any scanning or formatting. -On the other hand, when \f5pos$\fP is used in a format string, -an argument may be used multiple times. -In this case, all arguments shall be processed in order -by calling \f5fe->extf\fP exactly once per argument before any pattern processing. -This case is signified by the flag \f5SFFMT_ARGPOS\fP in \f5fe->flags\fP. - -In addition to the predefined formatting patterns and other application-defined -patterns, \f5fe->extf\fP may be called with \f5fe->fmt\fP being one -of `\f5(\fP' (left parenthesis), `\f5.\fP' (dot), and `\f5I\fP'. - -The left parenthesis requests a string to be used as the \f5extfdata\fP string discussed below. -In this case, upon returning, \f5fe->extf\fP should set the \f5fe->size\fP field -to be the length of the string or a negative value to indicate a null-terminated string. - -The `\f5I\fP' requests an integer to define the object size. - -The dot requests an integer for width, precision, base, or a separator. -In this case, the \f5fe->size\fP field will indicate how many dots have appeared -in the pattern specification. Note that, if the actual conversion pattern is 'c' or 's', -the value \f5*form\fP will be one of these characters. -.Tp -\f5f\fP: -This is the input/output stream in the calling formatting function. -During a call to \f5fe->extf\fP, the stream shall be unlocked -so that \f5fe->extf\fP can read from or write to it as appropriate. -.Tp -\f5v\fP: -For both \f5sfscanf()\fP and \f5sfprintf()\fP functions, -\f5v\fP points to a location suitable for storing any scalars or pointers. -On return, \f5fe->extf\fP treats \f5v\fP as discussed below. -.Tp -\f5fe\fP: -This is the current formatting environment. -.PP -The return value \f5rv\fP of \f5fe->extf\fP directs further processing. -There are two cases. -When \f5pos$\fP is present, a negative return value means to ignore \f5fe\fP -in further argument processing while a non-negative return value is treated -as the case \f5rv == 0\fP below. -When \f5pos$\fP is not present, \f5fe->extf\fP is called per argument -immediately before pattern processing and its return values are treated -as below: -.Tp -\f5rv < 0:\fP -The environment stack is immediately popped. -.Tp -\f5rv == 0:\fP -The extension function has not consumed (in a scanning case) or -output (in a printing case) data out of or into the given stream \f5f\fP. -The fields \f5fmt\fP, \f5flags\fP, \f5size\fP, -\f5width\fP, \f5precis\fP and \f5base\fP of \f5fe\fP -shall direct further processing. - -For \f5sfprintf()\fP functions, if \f5fe->flags\fP -has the bit \f5SFFMT_VALUE\fP, -\f5fe->extf\fP should have set \f5*v\fP to the value to be processed; -otherwise, a value should be obtained from the argument list. -Likewise, for \f5sfscanf()\fP functions, -\f5SFFMT_VALUE\fP means that -\f5*v\fP should have a suitable address; otherwise, -an address to assign value should be obtained from the argument list. - -When \f5pos$\fP is present, -if \f5fe->extf\fP changes \f5fe->fmt\fP, this pattern shall be used regardless of -the pattern defined in the format string. On the other hand, if \f5fe->fmt\fP -is unchanged by \f5fe->extf\fP, the pattern in the format string is used. -In any case, the effective pattern should be one of the standardly defined pattern. -Otherwise, it shall be treated as unmatched. -.Tp -\f5rv > 0:\fP -The extension function has accessed the stream \f5f\fP -to the extent of \f5rv\fP bytes. -Processing of the current pattern ceases except that, -for scanning functions, if \f5fe->flags\fP does not contain -the bit \f5SFFMT_SKIP\fP, the assignment count shall increase by 1. - -.Ss "void va_copy(va_list to, va_list fr)" -This macro function portably copies the argument list \f5fr\fP to -the argument list \f5to\fP. It should be used to set the field \f5Sffmt_t.args\fP. - -.Ss "long sffmtversion(Sffmt_t* fe, int type)" -This macro function initializes -the formatting environment \f5fe\fP with a version number if \f5type\fP is -non-zero. Otherwise, it returns the current value of the version number of \f5fe\fP. -This is useful for applications to find out -when the format of the structure \f5Sffmt_t\fP changes. -Note that the version number corresponds to the Sfio version number -which is defined in the macro value \f5SFIO_VERSION\fP. - -.Ss " int sfprintf(Sfio_t* f, const char* format, ...);" -.Ss " char* sfprints(const char* format, ...);" -.Ss " char* sfvprints(const char* format, va_list args);" -.Ss " ssize_t sfaprints(char** sp, const char* format, ...);" -.Ss " ssize_t sfvaprints(char** sp, const char* format, va_list args);" -.Ss " int sfsprintf(char* s, int n, const char* format, ...)" -.Ss " int sfvsprintf(char* s, int n, const char* format, va_list args);" -.Ss " int sfvprintf(Sfio_t* f, const char* format, va_list args);" -These functions format output data. -\f5sfprintf()\fP and \f5sfvprintf()\fP write to output stream \f5f\fP. -\f5sfsprintf()\fP and \f5sfvsprintf()\fP write to buffer \f5s\fP -which is of size \f5n\fP. -\f5sfprints()\fP and \f5sfvprints()\fP construct data in some Sfio-defined buffer. -\f5sfaprints()\fP and \f5sfvaprints()\fP are similar to \f5sfprints()\fP -and \f5sfvprints()\fP -but they return a string constructed via \f5malloc()\fP in \f5*sp\fP -and expect this string to be freed by the caller when no longer needed. -\f5sfvprintf()\fP is the underlying primitive for the other functions. -Except for \f5sfprints()\fP and \f5sfvprints()\fP -which return a null-terminated string or \f5NULL\fP, -other functions return the number of output bytes or \f5-1\fP on failure. - -The length of string constructed by \f5sfprints()\fP, \f5sfsprintf()\fP, or -\f5sfvsprintf()\fP can be retrieved by \f5sfslen()\fP. -.PP -The standard patterns are: -\f5n, s, c, %, h, i, d, p, u, o, x, X, g, G, e, E, f\fP and \f5!\fP. -Except for \f5!\fP which shall be described below, -see the ANSI-C specification of \f5fprintf(3)\fP for details on the other patterns. -Let \f5z\fP be some pattern type. A formatting pattern is defined as below: - -.nf -.ft 5 - %[pos$][flag][width][.precision[.base]][(extfdata)]z -.ft 1 -.fi - -.Tp -\f5pos$\fP: -A pattern can specify which argument in the argument list to use. -This is done via \f5pos$\fP where \f5pos\fP is the argument position. -Arguments are numbered so that the first argument after \f5format\fP is at position 1. -If \f5pos\fP is not specified, the argument following the most recently used one -will be used. -The pattern \f5%!\fP (see below) cannot be used subsequent to a usage of \f5pos$\fP. -Doing so may cause unexpected behaviors. -.Tp -\f5flag\fP: -The flag characters are -\f5h\fP, \f5hh\fP, \f5l\fP, \f5ll\fP, \f5L\fP, \f5I\fP, \f5j\fP, \f5t\fP, \f5z\fP, -\f5\-\fP, \f5+\fP, \fIspace\fP, \f50\fP, \f5'\fP, \f5=\fP and \f5#\fP. - -Flag \f5I\fP defines the size or type of the object being formatted. -There are two cases: (1) \f5I\fP by itself and (2) \f5I\fP -followed by either a decimal number or `*'. - -In the first case, for integer and floating point patterns, -the object type is taken to be the largest appropriate type -(i.e., one of \f5Sflong_t\fP, \f5Sfulong_t\fP or \f5Sfdouble_t\fP). -For conversion specifiers \f5s\fP and \f5c\fP, the flag is ignored. - -In the second case, a given decimal value would define a size while -`*' would cause the size to be obtained from the argument list. -Then, if the conversion specifier is \f5s\fP, this size defines the -length of the string or strings being formatted (see the discussion of \f5base\fP below). -For integer and floating point patterns, -the size is used to select a type from one of the below lists as -indicated by the conversion specifier: - -.nf -.ft 5 - Sflong_t, long, int, short - Sfulong_t, unsigned long, unsigned int, unsigned short - Sfdouble_t, double, float -.ft 1 -.fi - -The selection algorithm always matches types from left to right in any given list. -Although selection is generally based on sizes in bytes, -for compatibility with Microsoft-C, the size 64 -is matched with an appropriate type with the same number of bits, if any. -If the given size does not match any of the listed types, -it shall match one of \f5int\fP, \f5unsigned int\fP, and \f5double\fP -as defined by the formatting pattern. - -Below are a few examples of using the \f5I\fP flag. -The first example prints an \f5Sflong_t\fP integer. -This example is actually not portable and -only works on platforms where \f5sizeof(Sflong_t)\fP is 8. -The second example shows how to that portably. -The third example specifies printing a string of length 16. -This length shall be used regardless of whether or not the given string -is shorter or longer than 16. -The last example shows the use of the pattern \f5%n\fP to assign the amount -of data already output into a \f5short\fP integer \f5n_output\fP. - -.nf -.ft 5 - sfprintf(sfstdout,"%I8d", Sflong_obj); - sfprintf(sfstdout,"%I*d", sizeof(Sflong_obj), Sflong_obj); - sfprintf(sfstdout,"%I*s", 16, s); - sfprintf(sfstdout,"%d%I*n", 1001, sizeof(short), &n_output); -.ft 1 -.fi - -Flags \f5h\fP, \f5l\fP, \f5j\fP and \f5L\fP are the ANSI-C conventions to -select the types of input objects. -For example, \f5%hd\fP indicates a \f5short int\fP, -while \f5%ld\fP indicates a \f5long int\fP. - -Flag \f5hh\fP addresses the byte value types, i.e., \f5char\fP and \f5unsigned char\fP. - -Flags \f5z\fP, \f5t\fP and \f5j\fP address respectively -the types \f5size_t\fP, \f5ptrdiff_t\fP and \f5Sflong_t\fP. - -Flags \f5ll\fP and \f5L\fP address respectively -the largest integer and floating value types, i.e., -\f5Sfulong_t\fP, \f5Sflong_t\fP, and \f5Sfdouble_t\fP. - -Flag \f5-\fP left-justifies data within the field (otherwise, right-justification). - -Flag \f5+\fP means that a signed conversion will always begin with a plus or minus sign. - -Flag \fIspace\fP is ignored if \f5+\fP is specified; otherwise, -it means that if the first character of a signed conversion -is not a sign or if the result is empty, a space will be prepended. - -Flag \f50\fP means padding with zeros on the left. - -Flag \f5'\fP outputs thousands-separator used by the current locale. -\f5setlocale(3)\fP should have been used to set the desired locale. - -Flag \f5=\fP centers data within the field. - -Flag \f5#\fP indicates an alternative format processing. -For \f5%o\fP, the first digit is always a zero. -For \f5%x\fP and \f5%X\fP, a non-zero result will have a prefix -\f50x\fP or \f50X\fP. For \f5%e\fP, \f5%E\fP, \f5%f\fP, \f5%g\fP, and \f5%G\fP, -the result always contains a decimal point. For \f5%g\fP and \f5%G\fP, -trailing zeros will not be removed. For \f5%d\fP, \f5%i\fP and \f5%u\fP, -the form is \fIbase#number\fP where \fIbase\fP is the conversion base -and \fInumber\fP is represented by digits for this \fIbase\fP. -For example, a base \f52\fP conversion with \f5%#..2d\fP for \f510\fP -is \f52#1010\fP instead of \f51010\fP as printed with \f5%..2d\fP. -Finally, for \f5%c\fP, bytes will be printed in the C format. -For example, when the ASCII character set is used, -the byte value 10 will be printed as \f5\\n\fP while 255 is printed -as \f5\\377\fP. -.Tp -\f5width\fP: -This defines the width of the printing field. A value to be printed will -be justified and padded if necessary to fill out the field width. -.Tp -\f5precis\fP: -After a first dot appears, an integral value defines a precision. -For floating point value patterns, precision is the number of precision digits. -For \f5%c\fP, precision defines the number of times to repeat the -character being formatted. -For \f5%s\fP, precision defines the maximum number of characters to output; --\f5precis\fP also defines the maximum number of characters to output, but -retains the rightmost \f5precis\fP characters. -.Tp -\f5base\fP: -This is defined after exactly two dots have appeared. - -For \f5%i\fP, \f5%d\fP, and \f5%u\fP, -\f5base\fP should be an integer value in the inclusive range \f5[2,64]\fP -and defines a conversion base. -If \f5base\fP is not in this range, it is defined to be \f510\fP. -The digits to represent numbers are: - -.nf -.ft 5 - 01234567890 - abcdefghijklmnopqrstuvwxyz - ABCDEFGHIJKLMNOPQRSTUVWXYZ @_ -.ft 1 -.fi - -For \f5%s\fP and \f5%c\fP, \f5base\fP defines a separator. -Then, for \f5%s\fP, the input argument is taken to be a NULL-terminated array of strings -while, for \f5%c\fP, this is a null-terminated array of characters. -The strings or characters will be formatted one of a time based -on the usual width and precision rules. -After each formatted string or character, except for the last one, -the separator \f5base\fP is output if it is a non-zero. - -There are further restrictions on the syntax of \f5%s\fP and \f5%c\fP when -a separator is defined. -Below are the legitimate sequences for \f5%s\fP and \f5%c\fP after the second dot: - -.nf -\f5 s c\fP -\f5 *s *c\fP -\f5 \fP\fIz\fP\f5s \fP\fIz\fP\f5c\fP -.fi - -In the first case, no separator is defined so \f5base\fP is set to zero. -In the second case, \f5base\fP is obtained from the argument list. -In the third case, the character \fIz\fP -must be non-alphanumeric and \f5base\fP will be set to this character. - -The below example shows both the call and the result -of printing a \f5NULL\fP-terminated array -of three strings \f5apple\fP, \f5orange\fP, and \f5grape\fP: - -.nf -.ft 5 - sfprintf(sfstdout,"|%8..:s|",list); - | apple: orange: grape| -.ft 1 -.fi - -.Tp -\f5(extfdata)\fP: -This defines a string \f5extfdata\fP -to be passed to the extension function \f5Sffmt_t.extf\fP. -Parentheses shall be balanced. -If \f5extfdata\fP is \f5*\fP, the string is obtained from the argument list. - -.PP -.Ss " int sfscanf(Sfio_t* f, const char* format, ...)" -.Ss " int sfsscanf(const char* s, const char* format, ...)" -.Ss " int sfvsscanf(const char* s, const char* format, va_list args)" -.Ss " int sfvscanf(Sfio_t* f, const char* format, va_list args)" -These functions scan data items. -\f5sfscanf()\fP scans from the input stream \f5f\fP -while \f5sfsscanf()\fP and \f5sfvsscanf()\fP -scan from the null-terminated string \f5s\fP. -\f5sfvscanf()\fP is the underlying primitive that performs the actual scanning. -Item types are determined from patterns in string \f5format\fP. -These functions return -the number of items successfully scanned or \f5-1\fP on error. -.PP -A white space character (blank, tab, or new-line) in \f5format\fP -normally matches a maximal sequence of input white space characters. -However, if the input stream is in \f5SF_LINE\fP mode (see \f5sfset()\fP), -a new-line character only matches white spaces up to an input new-line character. -This is useful to avoid blocking when scanning typed inputs. -.PP -The standard scan patterns are: -\f5i, d, u, o, x, X, p, n, f, e, E, g, G, c, %, s, []\fP and \f5!\fP. -Except for \f5!\fP which shall be described below, -see the ANSI-C specification of \f5fscanf(3)\fP for details on other patterns. -Let \f5z\fP be some pattern type. A formatting pattern is specified as below: - -.nf -.ft 5 - %[*][pos$][width][.width.base][(extfdata)][flag]z -.ft 1 -.fi - -.Tp -\f5pos$\fP: -A pattern can specify which argument in the argument list to use. -This is done via \f5pos$\fP where \f5pos\fP is the argument position. -Arguments are numbered so that the first argument after \f5format\fP is at position 1. -If \f5pos\fP is not specified, the argument following the most recently used one -will be used. -The pattern \f5%!\fP (see below) cannot be used subsequent to a usage of \f5pos$\fP. -.Tp -\f5*:\fP -This discards the corresponding scanned item. -.Tp -\f5width\fP and \f5base\fP: -\f5width\fP defines the maximum number of bytes to scan -and \f5base\fP defines the base of an integral value being scanned. -The `.' (dot) notation also allows specifying a `*' (star) to obtain -the value from the argument list. The below example specifies scanning -4 bytes to obtain the value of an integer in base 10. At the end of scanning, -the variable \f5v\fP should have the value \f51234\fP. - -.nf -.ft 5 - sfsscanf("12345678","%.*.*d", 4, 10, &v); -.ft 1 -.fi - -.Tp -\f5(extfdata)\fP: -This defines a string \f5extfdata\fP -to be passed to the extension function \f5Sffmt_t.extf\fP. -Parentheses shall be balanced. -If \f5extfdata\fP is \f5*\fP, the string is obtained from the argument list. -.Tp -\f5flag:\fP -This is \f5#\fP, \f5I\fP, or some sequence of \f5h\fP, \f5l\fP, and \f5L\fP. - -Flag \f5#\fP is significant for pattern \f5%i\fP and \f5%[\fP. -For \f5%i\fP, it means that the \f5#\fP symbol does not have its usual -meaning in an input sequence \f5base#value\fP. -For example, the scanning result of \f5%#i\fP on input \f52#1001\fP is \f52\fP -and the next \f5sfgetc()\fP call will return \f5#\fP. -For \f5%[\fP, if the next character in the input stream does not match -the given scan set of characters, \f5#\fP causes a match to a null string -instead of a failure. - -Flag \f5I\fP defines the size or type of the object being formatted. -There are two cases: (1) \f5I\fP by itself and (2) \f5I\fP -followed by either a decimal number or `*'. - -In the first case, for integer and floating point patterns, -the object type is taken to be the largest appropriate type -(i.e., one of \f5Sflong_t\fP, \f5Sfulong_t\fP or \f5Sfdouble_t\fP). -For string patterns such as \f5%s\fP, the flag is ignored. - -In the second case, a given decimal value would define a size while -`*' would cause the size to be obtained from the argument list. -For string patterns such as \f5%s\fP or \f5%[\fP, this size defines the -length of the buffer to store scanned data. -Specifying a buffer size only limits the amount of data copied into the buffer. -Scanned data beyond the buffer limit will be discarded. -For integer and floating point patterns, -the size is used to select a type from one of the below lists as -indicated by the conversion specifier: - -.nf -.ft 5 - Sflong_t, long, int, short - Sfulong_t, unsigned long, unsigned int, unsigned short - Sfdouble_t, double, float -.ft 1 -.fi - -The selection algorithm always matches types from left to right in any given list. -Although selection is generally based on sizes in bytes, -for compatibility with Microsoft-C, the size 64 -is matched with an appropriate type with the same number of bits, if any. -If the given size does not match any of the listed types, -it shall match one of \f5int\fP, \f5unsigned int\fP, and \f5double\fP -as indicated by the formatting pattern. - -Below are examples of using the \f5I\fP flag. -The first example scans a 64-bit integer. -The second scans some floating point value -whose size is explicitly computed and given. -The last example scans a string into a buffer with the given size 128. -Note that if the scanned string is longer than 127, only the first 127 -bytes shall be copied into the buffer. The rest of the scanned data -shall be discarded. - -.nf -.ft 5 - sfscanf(sfstdin,"%I64d", &int64_obj); - sfscanf(sfstdin,"%I*f", sizeof(float_obj), &float_obj); - sfscanf(sfstdin,"%I*s", 128, buffer); -.ft 1 -.fi - -Flags \f5h\fP, \f5l\fP, and \f5L\fP are the ANSI-C conventions -for indicating the type of a scanned element. -For example, \f5%hd\fP means scanning a \f5short int\fP. -The flags \f5ll\fP and \f5L\fP mean respectively scanning an -integer or a floating point value with largest size -(i.e, \f5Sflong_t\fP or \f5Sfdouble_t\fP). -.PP -The \f5%i\fP, \f5%d\fP and \f5%u\fP patterns scan numbers in bases -from \f52\fP to \f564\fP. -\f5%i\fP scans integral values in self-describing formats. -Except for octal, decimal and hexadecimal numbers with the usual formats, -numbers in general bases are assumed to be of the form: \fIbase#value\fP -where \fIbase\fP is a number in base 10 and \fIvalue\fP -is a number in the given base. -For example, \f52#1001\fP is the binary representation of the decimal value \f59\fP. -If \fIbase\fP is \f536\fP or less, -the digits for \fIvalue\fP can be any combination of \f5[0-9], [a-z], [A-Z]\fP -where upper and lower case digits are not distinguishable. -If \fIbase\fP is larger than \f536\fP, the set of digits is: - -.nf -.ft 5 - 0123456789 - abcdefghijklmnopqrstuvwxyz - ABCDEFGHIJKLMNOPQRSTUVWXYZ @_ -.ft 1 -.fi - -.PP -.Ss "BUFFERING, SYNCHRONIZATION" -.PP -.Ss " Void_t* sfsetbuf(Sfio_t* f, Void_t* buf, size_t size)" -This function changes the buffering scheme for the stream \f5f\fP. -The stream will be synchronized before any buffer modification. -If a new buffer is successfully set and the old buffer has not been freed, -\f5sfsetbuf()\fP returns the old buffer. Otherwise, it returns \f5NULL\fP. -After a \f5sfsetbuf()\fP call, -\f5sfvalue()\fP returns the size of the returned buffer. - -Sfio attempts to read data in blocks likely to be serviced fast by the file system. -This means block sizes being multiples of a suitable alignment value -(e.g., 512, 1024 or 8192). By default, the alignment value -is computed via some internal mechanism depending on the local platform but -it can also be explicitly set via the call \f5sfsetbuf(f, (Void_t*)f, size)\fP. - -In invocations of \f5sfsetbuf()\fP other than the above case, -the \f5size\fP argument is treated as follows: -.Tp -\f5size == SF_UNBOUND\fP: -Sfio will pick a suitable buffer size. -If \f5buf\fP is \f5NULL\fP, -Sfio will also pick a suitable buffering scheme (such as memory mapping.) -If \f5buf\fP is not \f5NULL\fP, its actual value is ignored -but the buffer will be allocated via \f5malloc(3)\fP. -This can be used to avoid memory mapping. -.Tp -\f5size > 0\fP: -This is the suggested size to use for buffering or memory mapping. -If \f5buf\fP is \f5NULL\fP, -Sfio will pick a suitable buffering scheme as discussed above. -If \f5buf\fP is not \f5NULL\fP, then \f5buf\fP and \f5size\fP determine -a buffer of the given size. -.Tp -\f5size == 0\fP: -If \f5buf\fP is \f5NULL\fP, the stream will be unbuffered. -If \f5buf\fP is not \f5NULL\fP, -\f5sfsetbuf()\fP simply returns the stream buffer. -In this case, no attempt will be made to synchronize the stream. - -.Ss " int sfsync(Sfio_t* f)" -This function synchronizes the logical and physical views of stream \f5f\fP. -It returns a negative value for failure and \f50\fP for success. - -For a \f5SF_WRITE\fP stream, synchronization means to write out any buffered data. -For a seekable \f5SF_READ\fP file stream, -the physical file position is aligned with the logical stream position and, -if \f5SF_SHARE\fP is on, buffered data is discarded. -If \f5f\fP is \f5NULL\fP, all streams are synchronized. -If \f5f\fP is the base of a stream stack (see \f5sfstack()\fP), -all stacked streams are synchronized. -Note that a stacked stream can only be synchronized this way. -If \f5f\fP is in a pool (see \f5sfpool()\fP) but not being the head, -the pool head is synchronized. - -If \f5f\fP has flag \f5SF_IOCHECK\fP, the \f5SF_SYNC\fP event is raised -before and after synchronization. See \f5sfdisc()\fP for details. - -.Ss " int sfpoll(Sfio_t** flist, int n, int timeout)" -This function polls a set of streams to see if I/O operations -can be performed on them without blocking. -This is useful for multiplexing I/O over a set of streams. -If a stream has a discipline, the exception function may be called -before and after the stream is polled (see \f5sfdisc()\fP for details). -After a successful \f5sfpoll()\fP call, -for each ready stream \f5f\fP, \f5sfvalue(f)\fP returns -a bit combination of \f5SF_READ\fP and \f5SF_WRITE\fP to tell which I/O -mode is available. If \f5SF_READ\fP is available, an attempt to read -a byte will not block. If \f5SF_WRITE\fP is available, -an attempt to flush will not block. -\f5sfpoll()\fP returns the number of ready streams or \f5-1\fP on failure. -.Tp -\f5flist\fP and \f5n\fP: -\f5flist\fP is an array of \f5n\fP streams to be polled. -Upon return, ready streams are moved to the front -of \f5flist\fP in the same relative order. -.Tp -\f5timeout\fP: -This defines an elapse time in milliseconds -to wait to see if any stream is ready for I/O. -If \f5timeout\fP is negative, \f5sfpoll()\fP will block until some stream become ready. -Note that \f5SF_STRING\fP and normal file streams never block -and are always ready for I/O. -If a stream with discipline is being polled and -its readiness is as yet undetermined (e.g., empty buffer,) -the discipline exception function will be called with \f5SF_DPOLL\fP -before querying the operating system. - -.Ss " Sfio_t* sfpool(Sfio_t* f, Sfio_t* poolf, int mode)" -This function manipulates pools of streams. -In a pool, only one stream is at the head and can have buffered data. -All other streams in the pool will be synchronized. -A stream becomes head when it is used for some I/O operation. -\f5sfpool()\fP returns \f5NULL\fP on failure. -.Tp -\f5f\fP and \f5poolf\fP: -If \f5f\fP is \f5NULL\fP, -\f5sfpool()\fP simply returns the head of the pool containing \f5poolf\fP. -If \f5f\fP is not \f5NULL\fP and \f5poolf\fP is \f5NULL\fP, -\f5f\fP is deleted from its pool. -In this case, if no other stream from the same pool can become head, -\f5sfpool()\fP will return \f5NULL\fP; otherwise, it returns some stream -from the remainder of the pool. -If both \f5f\fP and \f5poolf\fP are not \f5NULL\fP, -\f5f\fP is moved from its current pool (if any) -into the same pool with \f5poolf\fP. -In this case, \f5poolf\fP is returned. -.Tp -\f5mode\fP: -If \f5poolf\fP is already in a pool, \f5mode\fP is ignored. -Otherwise, \f5mode\fP should be \f50\fP or \f5SF_SHARE\fP. -A \f5SF_SHARE\fP pool contains streams with \f5SF_WRITE\fP mode. -In addition, on change to a new head stream, -buffered write data of the current head -is transferred to the new head. - -.Ss " int sfpurge(Sfio_t* f)" -This function discards all buffered data -unless \f5f\fP is a \f5SF_STRING\fP stream. -Note that if \f5f\fP is a \f5SF_READ\fP stream based on an unseekable device, -purged data will not be recoverable. -If \f5f\fP is a \f5sfpopen\fP-stream opened for both read and write, -data of both the read and write pipe ends will be purged -(see \f5sfset()\fP to selectively turn off read or write mode -if one set of data is to be preserved.) -After purging, if \f5f\fP has flag \f5SF_IOCHECK\fP, -the event \f5SF_PURGE\fP is raised. -\f5sfpurge()\fP returns \f5-1\fP for failure and \f50\fP for success. - -.PP -.Ss "DISCIPLINE, EVENT-HANDLING" -.PP -A file stream uses the system calls \f5read(2)\fP, \f5write(2)\fP -and \f5lseek(2)\fP to read, write and position in the underlying file. -Disciplines enable application-defined I/O methods including exception handling and -data pre/post-processing. - -.Ss " Sfdisc_t* sfdisc(Sfio_t* f, Sfdisc_t* disc)" -Each stream has a discipline stack whose bottom is a virtual discipline -representing the actual system calls. -\f5sfdisc()\fP manipulates the discipline stack of stream \f5f\fP. -\f5f\fP will be synchronized before any discipline stack manipulation. -After a successful discipline stack manipulation, -the stream I/O position (see \f5sfseek()\fP and \f5sftell()\fP) -and extent (see \f5sfsize()\fP) are updated -to reflect that defined by the top discipline. -\f5sfdisc()\fP returns \f5NULL\fP on failure. - -If the value of \f5disc\fP is identical to the value of \f5f\fP, -then the top discipline on the discipline -stack is returned without any further action. -An application can then use this feature of \f5sfdisc()\fP -and the field \f5disc\fP (below) of the discipline structure -to traverse the entire discipline stack of a stream \f5f\fP as follows: - -.nf -.ft 5 - for(disc = sfdisc(f, (Sfdisc_t*)f); disc; disc = disc->disc) -.ft 1 -.fi - -If \f5disc\fP is \f5SF_POPDISC\fP or \f5(Sfdisc_t*)0\fP, -the top element of the stack, if any, is popped and its address is returned. -Otherwise, \f5disc\fP is pushed onto the discipline stack. -In this case, if successful, \f5sfdisc()\fP returns -the discipline that was pushed down. - -Note that a discipline can be used on only one stream at a time. -An application should take care to allocate different discipline -structures for use with different streams. -A discipline structure is of the type \f5Sfdisc_t\fP which -contains the following public fields: - -.nf -.ft 5 - Sfread_f readf; - Sfwrite_f writef; - Sfseek_f seekf; - Sfexcept_f exceptf; - Sfdisc_t* disc; -.ft 1 -.fi - -.PP -The first three fields of \f5Sfdisc_t\fP specify alternative I/O functions. -If any of them is \f5NULL\fP, it is inherited -from a discipline pushed earlier on the stack. -Note that a file stream always -has \f5read(2)\fP, \f5write(2)\fP, \f5lseek(2)\fP and \f5NIL(Sfexcept_f)\fP -as the \fIlogical bottom discipline\fP. -Arguments to I/O discipline functions -have the same meaning as that of the -functions \f5sfrd()\fP, \f5sfwr()\fP and \f5sfsk()\fP described below. -.PP -The exception function, \f5(*exceptf)()\fP announces exceptional events during -I/O operations. -It is called as \f5(*exceptf)(Sfio_t* f, int type, Void_t* value, Sfdisc_t* disc)\fP. -Unless noted otherwise, the return value of \f5(*exceptf)()\fP is used as follows: -.Tp -\f5<0\fP: -The on-going operation shall terminate. -.Tp -\f5>0\fP: -If the event was raised due to an I/O error, -the error has been repaired and the on-going operation shall continue normally. -For some events, e.g., \f5SF_DPOLL\fP, the return value may also have -additional meanings. -.Tp -\f5=0\fP: -The on-going operation performs default actions with respect to the raised event. -For example, on a reading error or reaching end of file, the top stream of a stack -will be popped and closed and the on-going operation continue with the new top -stream. -.PP -The argument \f5type\fP of \f5(*exceptf)()\fP -identifies the particular exceptional event: -.Tp -\f5SF_LOCKED\fP: -The stream cannot be accessed. -Note that this lock state is not related to the mutex lock -that protects a stream from multiple accesses by different threads -(see section THREAD SAFETY). Rather, the stream was frozen by -certain operations such as \f5sfreserve()\fP or \f5sfstack()\fP. -Thus, a stream can be in this state even if the application is uni-threaded. -.Tp -\f5SF_READ\fP, \f5SF_WRITE\fP: -These events are raised around reading and writing operations. - -If \f5SF_IOCHECK\fP is on, \f5SF_READ\fP and \f5SF_WRITE\fP -are raised immediately before \f5read(2) and write(2)\fP calls. -In this case, \f5*((ssize_t*)value)\fP is the amount of data to be processed. -The return value of \f5(*exceptf)()\fP, if negative, -indicates that the stream is not ready for I/O -and the calling operation will abort with failure. -If it is positive, the stream is ready for I/O -but the amount should be restricted to the amount specified by this value. -If the return value is zero, the I/O operation is carried out normally. - -\f5SF_READ\fP and \f5SF_WRITE\fP are also raised on operation failures. -In such a case, \f5*((ssize_t*)value)\fP -is the return value from the failed operation. -.Tp -\f5SF_SEEK\fP: -This event is raised when a seek operation fails. -.Tp -\f5SF_NEW\fP, \f5SF_CLOSING\fP (\f5SF_CLOSE\fP), \f5SF_FINAL\fP: -These events are raised during a stream closing. -\f5SF_NEW\fP is raised for a stream about to be closed to be renewed (see \f5sfnew()\fP). -\f5SF_CLOSING\fP is raised for a stream about to be closed. -\f5SF_FINAL\fP is raised after a stream has been closed and before -its space is to be destroyed (see \f5sfclose()\fP). -For these events, a non-zero return value from \f5(*exceptf)()\fP causes -\f5sfclose()\fP to return immediately with the same value. -.Tp -\f5SF_DPUSH\fP, \f5SF_DPOP\fP, \f5SF_DBUFFER\fP: -Events \f5SF_DPUSH\fP and \f5SF_DPOP\fP are raised when a -discipline is about to be pushed or popped. -\f5(Sfdisc_t*)value\fP is the to-be top discipline, if any. - -A stream buffer is always synchronized before pushing or popping a discipline. -If this synchronization fails, \f5SF_DBUFFER\fP will be raised with -\f5*((size_t*)value)\fP being the amount of data still in the buffer. -If the return value of \f5exceptf\fP is non-negative, -the push or pop operation will continue normally; -otherwise, \f5sfdisc()\fP returns failure. -.Tp -\f5SF_DPOLL\fP: -This event is raised by -\f5sfpoll()\fP to see if the stream is ready for I/O. -\f5*((int*)value)\fP indicates a time-out interval to wait. -A negative return value from the exception function means blocking. -A zero return value means that \f5sfpoll()\fP should -query the underlying file descriptor. -A positive return value means non-blocking. In addition, -this value will be a bit combination of \f5SF_READ\fP and \f5SF_WRITE\fP -to indicate what I/O modes are ready. -.Tp -\f5SF_READY\fP: -This event is raised by \f5sfpoll()\fP for each ready stream. -The third argument to the event handler is an integer composed with -the two bits \f5SF_READ\fP and \f5SF_WRITE\fP to indicate which -I/O modes are ready. -.Tp -\f5SF_SYNC\fP, \f5SF_PURGE\fP: -If \f5SF_IOCHECK\fP is set, -these events are raised respectively for a \f5sfsync()\fP or \f5sfpurge()\fP call. -In each case, the respective event is raised once before the appropriate -operation (synchronization or purging) with \f5((int)value)\fP being \f51\fP -and once after with \f5((int)value)\fP being \f50\fP. -Note that \f5sfsync()\fP is called for each -\f5SF_WRITE\fP or \f5SF_SHARE|SF_READ\fP stream on closing. - -.Tp -\f5SF_ATEXIT\fP: -This event is raised for each open stream before the process exits. - -.Ss " int sfraise(Sfio_t* f, int type, Void_t* data)" -If \f5f\fP is non-\f5NULL\fP, \f5sfraise()\fP calls all exception handlers -of \f5f\fP with the event \f5type\fP and associated \f5data\fP. -If an exception handler returns a non-zero value, -\f5sfraise()\fP immediate returns the same value. -Application-defined events should start from the value \f5SF_EVENT\fP -so as to avoid confusion with system-defined events, -\f5sfraise()\fP returns \f50\fP on success and \f5-1\fP on failure. - -If \f5f\fP is \f5NULL\fP, \f5sfraise()\fP iterates over all streams -and raise events as described above. In this case, -\f5sfraise()\fP returns \f50\fP on success and a negative value -on failure. The absolute value of the return value tells how many -streams failed on raising the given event. - -.Ss " ssize_t sfrd(Sfio_t* f, Void_t* buf, size_t n, Sfdisc_t* disc)" -.Ss " ssize_t sfwr(Sfio_t* f, const Void_t* buf, size_t n, Sfdisc_t* disc)" -.Ss " Sfoff_t sfsk(Sfio_t* f, Sfoff_t offset, int type, Sfdisc_t* disc)" -These functions provides safe methods for a discipline I/O function to invoke -earlier discipline I/O functions and to properly handle exceptions. -They should not be used in any other context. -\f5sfrd()\fP and \f5sfwr()\fP return the number of bytes read or written. -\f5sfsk()\fP returns the new seek position. -On error, all three functions return a negative value which should be \f5-1\fP -or the value returned by the exception handler. - -.PP -.Ss "STREAM CONTROL" -.PP -.Ss " int sfresize(Sfio_t* f, Sfoff_t size)" -This function resizes the stream \f5f\P so that its extent is \f5size\fP. -If the stream corresponds to a file, the file size is set to \f5size\fP -via the system call \f5ftruncate()\fP. -When a stream is made larger, the new data space is filled with zero's. -\f5sfresize()\fP returns \f50\fP on success and a negative value on failure. - -.Ss " int sfset(Sfio_t* f, int flags, int set)" -This function sets control flags for the stream \f5f\fP. -It returns the previous set of flags or \f50\fP on error. - -Settable flags are: -\f5SF_READ\fP, \f5SF_WRITE\fP, \f5SF_IOCHECK\fP, -\f5SF_LINE\fP, \f5SF_SHARE\fP, \f5SF_PUBLIC\fP, \f5SF_MALLOC\fP and -\f5SF_STATIC\fP. -Note that \f5SF_READ\fP and \f5SF_WRITE\fP can be turned on or off only -if the stream was opened as \f5SF_READ|SF_WRITE\fP. -Turning off one of them means that the stream is to be treated exclusively -in the other mode. It is not possible to turn off both. -If legal, an attempt to turn on either \f5SF_READ\fP or \f5SF_WRITE\fP -will cause the stream to be in the given I/O mode. -.Tp -\f5set == 0:\fP -If \f5flags\fP is zero, the current set of flags is simply returned. -Note that when a stream is first opened, not -all of its flags are initialized yet (more below). If \f5flags\fP is -non-zero, an attempt is made to turn off the specified flags. -.Tp -\f5set != 0:\fP -If \f5flags\fP is zero, the stream is initialized if not yet done so. -Then the current set of flags is returned. -If \f5flags\fP is non-zero, an attempt is made to turn on the -specified flags. - -.Ss " int sfsetfd(Sfio_t* f, int fd)" -This function changes the file descriptor of \f5f\fP. -Before a change is realized, -\f5(*notify)(f,SF_SETFD,newfd)\fP (see \f5sfnotify()\fP) is called. -\f5sfsetfd()\fP returns \f5-1\fP on failure and the new file descriptor on success. -.Tp -\f5fd >= 0\fP: -If the current file descriptor is non-negative, -it will be changed using \f5dup(3)\fP to a value larger or equal to \f5fd\fP. -Upon a successful change, the previous file descriptor will be closed. -If the current file descriptor is negative, it will be set to \f5fd\fP and -the stream will be reinitialized. -.Tp -\f5fd < 0\fP: -The stream is synchronized (see \f5sfsync()\fP) and its -file descriptor will be set to this value. -Then, except for \f5sfclose()\fP, the stream will be inaccessible -until a future \f5sfsetfd()\fP call resets the file descriptor to a non-negative value. -Thus, \f5sfsetfd(f,-1)\fP can be used to avoid closing the file descriptor -of \f5f\fP when \f5f\fP is closed. - -.Ss " Sfio_t* sfstack(Sfio_t* base, Sfio_t* top)" -This function stacks or unstacks stream. -Every stream stack is identified by a base stream -via which all I/O operations are performed. -However, an I/O operation always takes effect on the top stream. -If the top stream reaches the end of file or -has an unrecoverable error condition, -it is automatically popped and closed -(see also \f5sfdisc()\fP for alternative handling of these conditions). -.Tp -\f5base\fP: -This is the base stream of the stack. -If it is \f5NULL\fP, \f5sfstack()\fP does nothing and returns \f5top\fP. -.Tp -\f5top\fP: -If this is \f5SF_POPSTACK\fP or \f5(Sfio_t*)0\fP, -the stack is popped and \f5sfstack()\fP returns the popped stream. -Otherwise, \f5top\fP is pushed on top of the stack identified by \f5base\fP -and \f5sfstack()\fP returns the \f5base\fP stream. - -.Ss " Sfio_t* sfswap(Sfio_t* f1, Sfio_t* f2)" -This function swaps contents of \f5f1\fP and \f5f2\fP. -This fails if either stream is in a stream stack but not being a base stream. -If \f5f2\fP is \f5NULL\fP, a new stream is constructed as a duplicate of \f5f1\fP. -\f5sfswap()\fP returns \f5f2\fP or \f5f1\fP duplicate on success and -\f5NULL\fP on failure. - -.PP -.Ss "STREAM INFORMATION" -.PP -.Ss " Sfoff_t sfsize(Sfio_t* f)" -This function returns the size of stream \f5f\fP (see \f5sfnew()\fP). -If \f5f\fP is not seekable or if its size is not determinable, -\f5sfsize()\fP returns \f5-1\fP. - -.Ss " Sfoff_t sftell(Sfio_t* f)" -This function returns the current I/O position in stream \f5f\fP. -Note that if \f5f\fP is \f5SF_APPEND\fP -and a writing operation was just performed, -the current I/O position is at the physical end of file. -If \f5f\fP is unseekable, \f5sftell\fP returns the number of bytes -read from or written to \f5f\fP. -See also \f5sfungetc()\fP. - -.Ss " ssize_t sfvalue(Sfio_t* f)" -This function returns the string or buffer length -for \f5sfreserve()\fP, \f5sfsetbuf()\fP, and \f5sfgetr()\fP. - -.Ss " int sffileno(Sfio_t* f)" -This function returns the file descriptor of stream \f5f\fP. - -.Ss " int sfstacked(Sfio_t* f)" -This function returns a non-zero value -if stream \f5f\fP has been stacked. - -.Ss " int sfeof(Sfio_t* f)" -.Ss " int sferror(Sfio_t* f)" -.Ss " int sfclrerr(Sfio_t* f)" -\f5sfeof()\fP tells whether or not the stream has an end-of-file condition. -\f5sferror()\fP tells whether or not the stream has an error condition. -\f5sfclrerr()\fP clears both end-of-file and error conditions. -The end-of-file and error conditions are also cleared on an I/O operation. - -.Ss " int sfclrlock(Sfio_t* f)" -This function restores the stream back to a normal state. -This means clearing locks and possibly throwing away unprocessed data. -As such, this operation is unsafe and should be used with care. -For example, it may be used before a long jump (\f5longjmp(3)\fP) -out of some discipline I/O function to restore the internal stream states. -\f5sfclrlock()\fP returns the current set of flags. - -.Ss " int sfnotify((void(*)notify)(Sfio_t*, int, void*) )" -This sets a function \f5(*notify)()\fP to be called -as \f5(*notify)(f, type, data)\fP on various stream events. -Arguments \f5type\fP and \f5data\fP indicate the reason for the call and accompanying data: -.Tp -\f5SF_NEW\fP: -\f5f\fP is being opened and \f5data\fP is the underlying file descriptor. -.Tp -\f5SF_CLOSING\fP (\f5SF_CLOSE\fP): -\f5f\fP is the stream being closed and \f5data\fP is the underlying file descriptor. -.Tp -\f5SF_SETFD\fP: -The file descriptor of \f5f\fP is being changed to the one -defined by \f5data\fP (see \f5sfsetfd()\fP.) -.Tp -\f5SF_READ\fP: -An attempt to change \f5f\fP to read mode failed. -\f5data\fP is the file descriptor of the stream. -.Tp -\f5SF_WRITE\fP: -An attempt to change \f5f\fP to write mode failed. -\f5data\fP is the file descriptor of the stream. -.Tp -\f5SF_MTACCESS\fP: -When a notifying function was registered (see \f5sfnotify()\fP), -every Sfio call on a stream with flag \f5SF_MTSAFE\fP will -invoke the notifying function -once on entry after the stream is locked -as \f5(*notify)(f, SF_MTACCESS, Sfio_t** fp), and -once on return before unlocking as -as \f5(*notify)(f, SF_MTACCESS, (Sfio_t**)0). -In the call entry case, -the notification function could use the argument \f5fp\fP -to set a stream that would be used for performing the actual I/O operation. -In this way, certain global streams such as the standard streams \f5sfstdin\fP, -\f5sfstdout\fP and \f5sfstderr\fP could be made to act differently when used -in different streams. - -.Ss " int sfwalk(Sfwalk_f walkf, Void_t* data, int type)" -This function invokes \f5(*walkf)(f, data)\fP on every open stream \f5f\fP -whose flags as defined by \f5sfset()\fP contains all bit flags given in \f5type\fP. -On such a call, if the return value is negative, \f5sfwalk()\fP will terminate. -\f5sfwalk()\fP returns 0 if no stream was processed. -Otherwise, it returns the return value from the last invocation of \f5walkf()\fP. - -As an example, the call \f5sfwalk(walkf, data, SF_READ)\fP will iterate over all streams -opened for reading. Similarly, \f5sfwalk(walkf, data, SF_READ|SF_WRITE)\fP -iterates over all streams opened for both reading and writing. -Lastly, \f5sfwalk(walkf, data, 0)\fP iterates over all streams. - -.PP -.Ss "MISCELLANEOUS FUNCTIONS" -.PP -.Ss " ssize_t sfmaxr(ssize_t maxr, int set)" -Certain records may require too much memory for storage, thus, causing -undesirable side effects. Therefore, the library normally bounds the amount -of memory used by \f5sfgetr()\fP. A different memory bound -can be set via \f5sfmaxr()\fP. While a positive \f5maxr\fP hints to \f5sfgetr()\fP -to use only about that much memory to construct a record, a non-positive bound -allows \f5sfgetr()\fP to use as much memory as necessary. -\f5sfmaxr()\fP sets the value only if \f5set\fP is non-zero. -It returns the value before setting or the current value if not setting. - -.Ss " ssize_t sfslen()" -This function returns the length of a string just constructed -by \f5sfsprintf()\fP or \f5sfprints()\fP. See also \f5sfvalue()\fP. - -.Ss " int sfulen(Sfulong_t v)" -.Ss " int sfllen(Sflong_t v)" -.Ss " int sfdlen(Sfdouble_t v)" -These functions return respectively the number of bytes required to code the -\f5Sfulong_t\fP, \f5Sflong_t\fP or \f5Sfdouble_t\fP value \f5v\fP by \f5sfputu()\fP, -\f5sfputl()\fP or \f5sfputd()\fP. - -.Ss " ssize_t sfpkrd(int fd, char* buf, size_t n, int rsc, long tm, int action)" -This function acts directly on the file descriptor \f5fd\fP. -It does a combination of peeking on incoming data and a time-out read. -Upon success, it returns the number of bytes received. -A return value of \f50\fP means that the end-of-file condition has been detected. -A negative value represents an error. -.Tp -\f5buf\fP, \f5n\fP: -These define a buffer and its size to read data into. -.Tp -\f5rsc\fP: -If \f5>=0\fP, this defines a record separator. -If the last returned byte is not the record separator, then -the read data did not contain a complete record. Otherwise, -it contains one or more records. -See also \f5action\fP below. -.Tp -\f5tm\fP: -If \f5>=0\fP, this defines a time interval in milliseconds to wait for incoming data. -.Tp -\f5action\fP: -If \f5action > 0\fP, \f5sfpkrd()\fP will peek on incoming data but -will not read past it. Therefore, a future \f5sfpkrd()\fP or \f5read(2)\fP will see -the same data again. -If \f5action <= 0\fP, \f5sfpkrd()\fP will not peek and there are two cases. -If \f5rsc < 0\fP, an attempt is made to read \f5n\fP bytes. -If \f5rsc >= 0\fP, an attempt is made to read one record. - -.PP -.Ss "FULL STRUCTURE SFIO_T" -.PP -.Ss " #include <sfio_t.h>" -Most applications based on Sfio only need to include -the header file \f5sfio.h\fP which defines an abbreviated \f5Sfio_t\fP -structure without certain fields private to Sfio. -However, there are times (e.g., debugging) -when an application may require more details about the full \f5Sfio_t\fP structure. -In such cases, the header file \f5sfio_t.h\fP can be used in place of \f5sfio.h\fP. -Note that an application doing this will become sensitive to changes -in the internal architecture of Sfio. - -.Ss " #define SFNEW(buf,size,file,flags,disc)" -This macro function is defined in \f5sfio_t.h\fP for -use in static initialization of an \f5Sfio_t\fP structure. -It requires five arguments: -.Tp -\f5buf, size\fP: -These define a buffer and its size. -.Tp -\f5file\fP: -This defines the underlying file descriptor if any. -.Tp -\f5flags\fP: -This is composed from bit flags described above. -.Tp -\f5disc\fP: -This defines a discipline if any. - -.PP -.Ss "EXAMPLE DISCIPLINES" -.PP -The below functions create disciplines and insert them into -the given streams \f5f\fP. These functions return \f50\fP -on success and \f5-1\fP on failure. - -.Ss "int sfdcdio(Sfio_t* f, size_t bufsize)" -This creates a discipline that uses the direct IO feature -available on file systems such as SGI's XFS to speed up IO. -The argument \f5bufsize\fP suggests a buffer size to use for data transfer. - -.Ss "int sfdcdos(Sfio_t* f)" -This creates a discipline to read DOS text files. -It basically transforms pairs of \er\en to \en. - -.Ss "int sfdcfilter(Sfio_t* f, const char* cmd)" -This creates a discipline that sends data from \f5f\fP -to the given command \f5cmd\fP to process, then reads back the processed data. - -.Ss "int sfdcseekable(Sfio_t* f)" -This creates a discipline that makes an unseekable reading stream seekable. - -.Ss "int sfdcslow(Sfio_t* f)" -This creates a discipline that makes all Sfio operations return immediately -on interrupts. This is useful for dealing with slow devices. - -.Ss "int sfdcsubstream(Sfio_t* f, Sfio_t* parent, Sfoff_t offset, Sfoff_t extent)" -This creates a discipline that makes \f5f\fP acts as if it -corresponds exactly to the subsection of \f5parent\fP -starting at \f5offset\fP with size \f5extent\fP. - -.Ss "int sfdctee(Sfio_t* f, Sfio_t* tee)" -This creates a discipline that copies to the stream \f5tee\fP -any data written to \f5f\fP. - -.Ss "int sfdcunion(Sfio_t* f, Sfio_t** array, int n)" -This creates a discipline that makes \f5f\fP act as if it is -the concatenation of the \f5n\fP streams given in \f5array\fP. - -.Ss "int sfdclzw(Sfio_t* f)" -This creates a discipline that would decompress data in \f5f\fP. -The stream \f5f\fP should have data from a source compressed by -the Unix \fBcompress\fP program. - -.Ss "int sfdcgzip(Sfio_t* f, int opt)" -This creates a discipline for reading/writing data compressed by zlib. -The argument \f5opt\fP defines the optimization level. - -.PP -.Ss "STDIO-COMPATIBILITY" -.PP -Sfio provides compatibility functions for all various popular -Stdio implementations at source and binary level. -The source Stdio-compatibility interface -provides the header file \f5stdio.h\fP that defines -a set of macros or inlined functions to map Stdio calls to Sfio ones. -This mapping may benignly extend or change the meaning of certain -original Stdio operations. For example, the Sfio's version of -\f5popen()\fP allows a coprocess to be opened for both reading and writing -unlike the original call which only allows a coprocess to be opened for a single mode. -Similarly, the Sfio's \f5fopen()\fP call can be used to create -string streams in addition to file streams. -.PP -The standard streams \f5stdin\fP, \f5stdout\fP and \f5stderr\fP -are mapped via \f5#define\fP to \f5sfstdin\fP, \f5sfstdout\fP and \f5sfstderr\fP. -The latter are typically declared of the type \f5Sfio_t*\fP. -Certain older Stdio applications require these to be declared -as addresses of structures so that static initializations of -the sort ``\f5FILE*\ f\ =\ stdin;\fP'' would work. -Such applications should use the compile time flag \f5SF_FILE_STRUCT\fP -to achieve the desired effect. -.PP -The binary Stdio-compatibility libraries, \f5libstdio.a\fP and \f5libstdio-mt.a\fP, -provide complete implementations of Stdio functions suitable -for linking applications already compiled with native header \f5stdio.h\fP. -These functions are also slightly altered or extended -as discussed above. -.PP -Below are the supported Stdio functions: -.PP -.nf -.ft 5 -FILE* fopen(const char* file, const char* mode); -FILE* freopen(const char* file, const char* mode, FILE* stream); -FILE* fdopen(int filedesc, const char* mode); -FILE* popen(const char* command, const char* mode); -FILE* tmpfile(); -int fclose(FILE* stream); -int pclose(FILE* stream); - -void flockfile(FILE* stream) -int ftrylockfile(FILE* stream) -void funlockfile(FILE* stream) - -void setbuf(FILE* stream, char* buf); -int setvbuf(FILE* stream, char* buf, int mode, size_t size); -void setbuffer(FILE* stream, char* buf, size_t size); -int setlinebuf(FILE* stream); -int fflush(FILE* stream); -int fpurge(FILE* stream); - -int fseek(FILE* stream, long offset, int whence); -void rewind(FILE* stream); -int fgetpos(FILE* stream, fpos_t* pos); -int fsetpos(FILE* stream, fpos_t* pos); -long ftell(FILE* stream); - -int getc(FILE* stream); -int fgetc(FILE* stream); -int getchar(void); -int ungetc(int c, FILE* stream); -int getw(FILE* stream); -char* gets(char* s); -char* fgets(char* s, int n, FILE* stream); -size_t fread(Void_t* ptr, size_t size, size_t nelt, FILE* stream); - -int putc(int c, FILE* stream); -int fputc(int c, FILE* stream); -int putchar(int c); -int putw(int w, FILE* stream); -int puts(const char* s, FILE* stream); -int fputs(const char* s, FILE* stream); -size_t fwrite(const Void_t* ptr, size_t size, size_t nelt, FILE* stream); - -int fscanf(FILE* stream, const char* format, ...); -int vfscanf(FILE* stream, const char* format, va_list args); -int _doscan(FILE* stream, const char* format, va_list args); -int scanf(const char* format, ...); -int vscanf(const char* format, va_list args); -int sscanf(const char* s, const char* format, ...); -int vsscanf(const char* s, const char* format, va_list args); - -int fprintf(FILE* stream, const char* format, ...); -int vfprintf(FILE* stream, const char* format, va_list args); -int _doprnt(FILE* stream, const char* format, va_list args); -int printf(const char* format, ...); -int vprintf(const char* format, va_list args); -int sprintf(const char* s, const char* format, ...); -int snprintf(const char* s, int n, const char* format, ...); -int vsprintf(const char* s, const char* format, va_list args); -int vsnprintf(const char* s, int n, const char* format, va_list args); - -int feof(FILE* stream); -int ferror(FILE* stream); -int clearerr(FILE* stream); -.ft 1 -.fi - -.PP -.Ss "RECENT CHANGES" -.PP -A few exception types have been added. In particular, exception handlers shall -be raised with \f5SF_LOCKED\fP on accessing a stream frozen either by -an ongoing operation or a previous operation (e.g., \f5sfgetr()\fP). -Before a process exits, the event \f5SF_ATEXIT\fP is raised for each open stream. -.PP -A number of disciplines were added for various processing functions. -Of interests are disciplines to use the direct I/O feature on IRIX6.2, -read DOS text files, and decompress files compressed by Unix \fIcompress\fP. -.PP -Various new stream and function flags have been added. For example, -the third argument of \f5sfgetr()\fP is now a set of bit flags and not -just a three-value object. However, the old semantics of this argument -of \f5sfgetr()\fP is still supported. -.PP -The \f5sfopen()\fP call has been extended so that sfopen(f,NULL,mode) can be -used to changed the mode of a file stream before any I/O operations. -This is most useful for changing the modes of the standard streams. -.PP -The buffering strategy has been significantly enhanced for streams -that perform many seek operations. Also, the handling of stream and -file positions have been better clarified so that applications that -share file descriptors across streams and/or processes can be sure that -the file states will be consistent. -.PP -The strategy for mapping between Sfio and Stdio streams in the binary -compatibility package has been significantly enhanced for efficiency. -For most platforms, the mapping is now constant time per look-up. -.PP -The \f5SF_BUFCONST\fP flag was deleted. This is largely unused anyway. -.PP -The library can be built for thread-safety. This is based largely on -Posix pthread mutexes except for on UWIN where native Windows APIs -are used. -.PP -The functions \f5sfgetm()\fP and \f5sfputm()\fP were added to encode -unsigned integer values with known ranges. -.PP -The flag \f5SF_APPEND\fP is identical to \f5SF_APPENDWR\fP. -However it conflicts with a different token of the same name -defined in the system header \f5stat.h\fP of BSDI Unix systems. -On such systems, we shall not define \f5SF_APPEND\fP and this -symbol may be removed in a future release. -.PP -Similarly, the exception \f5SF_CLOSE\fP is identical to \f5SF_CLOSING\fP. -However it conflicts with a different token of the same name -defined in the system header \f5socket.h\fP of AIX Unix systems. -On such systems, we shall not define \f5SF_CLOSE\fP and this -symbol may be removed in a future release. -.PP -The printing and scanning functions were extended to handle multibyte characters -and to conform to the C99 standard. -.PP -The function \f5sfpoll()\fP was rehauled to make it useful -for writing servers that must commnunicate with multiple streams -without blocking. -.PP -The formatting pattern \f5%c\fP for \f5sf*printf\fP was extended -to allow the flag \f5#\fP to print unprintable character values -using the C convention. For example, \f5%#c\fP prints the octal value 012 -as \f5\\n\fP. - -.SH AUTHORS -Kiem-Phong Vo, kpv@research.att.com, -.br -David G. Korn, dgk@research.att.com, and -.br -Glenn S. Fowler, gsf@research.att.com. diff --git a/usr/src/contrib/ast/src/lib/libast/man/sig.3 b/usr/src/contrib/ast/src/lib/libast/man/sig.3 deleted file mode 100644 index db41a2b08c..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/sig.3 +++ /dev/null @@ -1,75 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH SIG 3 -.SH NAME -sig \- signal interface routines -.SH SYNOPSIS -.L "#include <ast.h>" -.L "#include <sig.h>" -.sp -.L "int sigunblock(int sig);" -.L "int sigcritical(int op);" -.SH DESCRIPTION -.L sigunblock -is called to -unblocks the signal -.L sig -from within a handler currently servicing -.LR sig . -.PP -.L sigcritical -controls a critical region for the -.LR SIGINT , -.L SIGQUIT -and -.L SIGHUP -signals. -.L "op > 0" -pushes the region, -.L "op == 0" -pops the region, and -.L "op < 0" -returns non-zero if any signals are being held in the current -critical region. -Signal critical regions may be nested. -The current critical region level is returned, -.L \-1 -on error. -.SH "SEE ALSO" -signal(2) diff --git a/usr/src/contrib/ast/src/lib/libast/man/spawnveg.3 b/usr/src/contrib/ast/src/lib/libast/man/spawnveg.3 deleted file mode 100644 index 3dfd4248cf..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/spawnveg.3 +++ /dev/null @@ -1,97 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH SPAWNVEG 3 -.SH NAME -spawnveg \- process spawn with process group and session control -.SH SYNOPSIS -.L "#include <ast.h>" -.sp -.L "int spawnveg(const char* command, char** argv, char** envv, pid_t pgid);" -.SH DESCRIPTION -.L spwanveg -combines -.IR fork (2), -.IR exec (2), -.IR setpgid (2) -and -.IR setsid (2) -into a single call. -.PP -.LR command , -.L argv -and -.L envv -are as in -.IR execve (2). -.L pgid -controls the new process group and session: -.TP -.L <0 -The new process becomes a session leader. -is called in the child context. -.TP -.L 0 -The new process is in the callers process group. -.TP -.L 1 -The new process becomes a process group leader. -.TP -.L >1 -The new process joins the process group -.IR pgid . -.SH COMMENTS -It is possible to code all process creation (except for -.IR vfork (2) -hack like in -.IR csh (1)) -using -.LR spawnveg . -The -.IR proc (3) -routines and -.IR ksh (1) -do this on systems that don't support -.IR fork (2). -This makes porting to NT and Windows a snap: a simple -.IR iffe (1) -probe provides a -.L spawnveg -implementation using the NT or Windows process primitives. -.SH "SEE ALSO" -fork(2), exec(2), setpgid(2), setsid(2), spawnve(2) diff --git a/usr/src/contrib/ast/src/lib/libast/man/stak.3 b/usr/src/contrib/ast/src/lib/libast/man/stak.3 deleted file mode 100644 index 5feac69db3..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/stak.3 +++ /dev/null @@ -1,169 +0,0 @@ -.fp 5 CW -.TH STAK 3 -.SH NAME -\fBstak\fR \- data stack storage library (obsolete: use \fBstk\fR instead) -.SH SYNOPSIS -.ta .75i 1.5i 2.25i 3i 3.75i 4.5i 5.25i 6i -.PP -.nf -\f5 -#include <stak.h> - -Stak_t *stakcreate(int \fIflags\fP); -Stak_t *stakinstall(Stak_t *\fIstack\fP, char *(\fIoverflow\fP)(int)); -int stakdelete(Stak_t *\fIstack\fP); -void staklink(Stak_t *\fIstack\fP) - -char *stakalloc(unsigned \fIsize\fP); -char *stakcopy(const char *\fIstring\fP); -char *stakset(char *\fIaddress\fP, unsigned \fIoffset\fP); - -char *stakseek(unsigned \fIoffset\fP); -int stakputc(int \fIc\fP); -int stakputs(const char *\fIstring\fP); -int stakwrite(const char *\fIaddress\fP, unsigned \fIsize\fP); -int staktell(void); -char *stakptr(unsigned \fIoffset\fP); -char *stakfreeze(unsigned \fIextra\fP); -\fR -.fi -.SH DESCRIPTION -.PP -\f5stak\fP is a package of routines designed to provide efficient -stack oriented dynamic storage. -A stack abstraction consists of an ordered list of contiguous -memory regions, called stack frames, that can hold objects of -arbitrary size. -A stack is represented by the type \f5Stak_t\fP -defined in header \f5<stak.h>\fP. -At any instant there is one active stack. -Variable size objects can be -added to the active stack -and programs can reference these objects directly with pointers. -In addition, the last object on the stack -(referred to here as the current object) -can be built incrementally. -The current object has an associated offset that determines its -current size. -While the current object is being built incrementally, -its location might -change so that it is necessary to reference the object with -relative offsets ranging from zero to the current offset of the object. -.PP -There is a preset initial active stack. -To use an additional stack, it is necessary to create it and to -install it as the active stack. -A stack is created with the \f5stakcreate\fP() function. -A \fIflags\fP argument of \f5STAK_SMALL\fP indicates that unused -space on the stack should be freed whenever this stack ceases -to be the active stack. -If successful, -\f5stakcreate\fP() returns a pointer to a stack whose reference -count is 1. -Otherwise, \f5stakcreate\fP() returns a null pointer. -The \f5staklink\fP() function increases the reference count for the -given \fIstack\fP. -The \f5stakinstall\fP() function -makes the specified \fIstack\fP the active stack and returns a pointer -to the previous active stack. -When the \fIoverflow\fP argument is not null, -it specifies a function that will -be called whenever \f5malloc\fP(3) fails while trying to grow the -stack. -The \fIoverflow\fP function will be called with the size that was passed -to \f5malloc\fP(3). -The \fIoverflow\fP function can call \f5exit\fP(3), call \f5longjmp\fP(3) -or return. -If the \f5overflow\fP function returns, -it must return a pointer to a memory region of the given size. -The default action is to write an error to standard error and to -call \f5exit\fP(2) with a non-zero exit value. -When \fIstack\fP is a null pointer, -the active stack is not changed -but the \fIoverflow\fP function for the active stack can be changed -and a pointer to the active stack is returned. -The \f5stakdelete\fP() function decrements the reference count and -frees the memory associated with -the specified stack -when the reference count is zero. -The effect of subsequent references to objects -on the stack are undefined. -.PP -The -\f5stakalloc\fP() function returns an aligned pointer to space on the -active stack that can be used to hold any object of the given \fIsize\fP. -\f5stakalloc\fP() is similar to \f5malloc\fP(3) except that individual -items returned by \f5stakalloc\fP() can not be freed. -\f5stakalloc\fP() causes the offset of the current object to be set to -zero. -.PP -The -\f5stakcopy\fP() function copies the given string onto the stack -and returns a pointer to the \fIstring\fP on the stack. -\f5stakcopy\fP() causes the offset of the current object to be set to -zero. -.PP -The \f5stakset\fP() function finds the frame containing the given -\fIaddress\fP, frees all frames that were created after the one containing -the given \fIaddress\fP, and sets the current object to the given -\fIaddress\fP. -The top of the current object is set to \fIoffset\fP bytes from -current object. -If \fIaddress\fP is not the address of an object on the -stack the result is undefined. -.PP -The remaining functions are used to build the current object incrementally. -An object that is built incrementally on the stack will -always occupy contiguous memory within a stack frame but -until \f5stakfreeze\fP() is called, -the location in memory for the object can change. -There is a current offset associated with the current object that -determines where subsequent operations apply. -Initially, this offset is zero, and the offset changes as a result -of the operations you specify. -The \f5stakseek\fP() function is used set the offset for the -current object. -The \fIoffset\fP argument to \f5stakseek\fP() specifies the new -offset for the current object. -The frame will be extended or moved -if \f5offset\fP causes the new current offset to extend beyond the -current frame. -\f5stakseek\fP() returns a pointer to the beginning of the current object. -The \f5staktell\fP() function gives the offset of the current object. -.PP -The \f5stakputc\fP() function adds a given character to the current object -on the stack. -The current offset is advanced by 1. -The \f5stakputs\fP() function appends the given \fIstring\fP onto the current -object in the stack and returns the length of the string. -The current offset is advanced by the length of the string. -The \f5stakwrite\fP() function appends the given \fIsize\fP byte memory -region starting at \fIaddress\fP onto the current -object in the stack and advances the current offset by \fIsize\fP. -The current offset is returned. -.PP -The \f5stakptr\fP() function converts the given \f5offset\fP -for the current object into a memory address on the stack. -This address is only valid until another stack operation is given. -The result is not defined if \fIoffset\fP exceeds the size of the current -object. -The \f5stakfreeze\fP() -function terminates the current object on the -stack and returns a pointer to the beginning of this object. -If \fIextra\fP is non-zero, \fIextra\fP bytes are added to the stack -before the current object is terminated. The first added byte will -contain zero and the contents of the remaining bytes are undefined. -.PP -.SH HISTORY -The -\f5stak\fP -interface was derived from similar routines in the KornShell code -that is used for building parse trees and carrying out expansions. -It provides an efficient mechanism for grouping dynamically allocated -objects so that they can be freed all at once rather than individually. -.SH AUTHOR - David Korn -.SH SEE ALSO -\f5exit(2)\fP -\f5longjmp(3)\fP -\f5malloc(3)\fP diff --git a/usr/src/contrib/ast/src/lib/libast/man/stk.3 b/usr/src/contrib/ast/src/lib/libast/man/stk.3 deleted file mode 100644 index 3e658216f7..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/stk.3 +++ /dev/null @@ -1,165 +0,0 @@ -.fp 5 CW -.TH STK 3 -.SH NAME -\fBstk\fR \- data stack storage library -.SH SYNOPSIS -.ta .75i 1.5i 2.25i 3i 3.75i 4.5i 5.25i 6i -.PP -.nf -\f5 -#include <stk.h> - -Stk_t *stkopen(int \fIflags\fP); -Stk_t *stkinstall(Stk_t *\fIstack\fP, char *(\fIoverflow\fP)(int)); -int stkclose(Stk_t *\fIstack\fP); -void stklink(Stk_t *\fIstack\fP) - -char *stkalloc(Stk_t *\fIstack\fP, unsigned \fIsize\fP); -char *stkcopy(Stk_t *\fIstack\fP, const char *\fIstring\fP); -char *stkset(Stk_t *\fIstack\fP, char *\fIaddress\fP, unsigned \fIoffset\fP); - -char *stkseek(Stk_t *\fIstack\fP, unsigned \fIoffset\fP); -int stktell(Stk_t *\fIstack\fP); -char *stkptr(Stk_t *\fIstack\fP, unsigned \fIoffset\fP); -char *stkfreeze(Stk_t *\fIstack\fP, unsigned \fIextra\fP); -int stkon(Stk *\fIstack\fP, char* \fIaddr\fP) -\fR -.fi -.SH DESCRIPTION -.PP -\f5stk\fP is a package of routines designed to provide efficient -stack oriented dynamic storage. -A stack abstraction consists of an ordered list of contiguous -memory regions, called stack frames, that can hold objects of -arbitrary size. -A stack is represented by the type \f5Stk_t\fP -defined in header \f5<stk.h>\fP. -The type \f5Stk_t\fP is compatible with the type \f5Sfio_t\fP -defined by the \f5sfio\fP(3) library. -At any instant there is one active stack which can be referenced -by the constant \f5stkstd\fP. -Variable size objects can be -added to the active stack -and programs can reference these objects directly with pointers. -In addition, the last object on the stack -(referred to here as the current object) -can be built incrementally. -The current object has an associated offset that determines its -current size. -While the current object is being built incrementally, -its location might -change so that it is necessary to reference the object with -relative offsets ranging from zero to the current offset of the object. -.PP -There is a preset initial active stack. -To use an additional stack, it is necessary to create it and to -install it as the active stack. -A stack is created with the \f5stkopen\fP() function. -A \fIflags\fP argument of \f5STK_SMALL\fP indicates that unused -space on the stack should be freed whenever this stack ceases -to be the active stack. -If successful, -\f5stkopen\fP() returns a pointer to a stack whose reference -count is 1. -Otherwise, \f5stkopen\fP() returns a null pointer. -The \f5stklink\fP() function increases the reference count for the -given \fIstack\fP. -The \f5stkinstall\fP() function -makes the specified \fIstack\fP the active stack and returns a pointer -to the previous active stack. -When the \fIoverflow\fP argument is not null, -it specifies a function that will -be called whenever \f5malloc\fP(3) fails while trying to grow the -stack. -The \fIoverflow\fP function will be called with the size that was passed -to \f5malloc\fP(3). -The \fIoverflow\fP function can call \f5exit\fP(3), call \f5longjmp\fP(3) -or return. -If the \f5overflow\fP function returns, -it must return a pointer to a memory region of the given size. -The default action is to write an error to standard error and to -call \f5exit\fP(2) with a non-zero exit value. -When \fIstack\fP is a null pointer, -the active stack is not changed -but the \fIoverflow\fP function for the active stack can be changed -and a pointer to the active stack is returned. -The \f5stkclose\fP() function decrements the reference count and -frees the memory associated with -the specified stack -when the reference count is zero. -The effect of subsequent references to objects -on the stack are undefined. -.PP -The -\f5stkalloc\fP() function returns an aligned pointer to space on the -active stack that can be used to hold any object of the given \fIsize\fP. -\f5stkalloc\fP() is similar to \f5malloc\fP(3) except that individual -items returned by \f5stkalloc\fP() can not be freed. -\f5stkalloc\fP() causes the offset of the current object to be set to -zero. -.PP -The -\f5stkcopy\fP() function copies the given string onto the stack -and returns a pointer to the \fIstring\fP on the stack. -\f5stkcopy\fP() causes the offset of the current object to be set to -zero. -.PP -The \f5stkset\fP() function finds the frame containing the given -\fIaddress\fP, frees all frames that were created after the one containing -the given \fIaddress\fP, and sets the current object to the given -\fIaddress\fP. -The top of the current object is set to \fIoffset\fP bytes from -current object. -If \fIaddress\fP is not the address of an object on the -stack the result is undefined. -.PP -The \f5sfio\fP(3) output functions can be used to build -current object incrementally. -An object that is built incrementally on the stack will -always occupy contiguous memory within a stack frame but -until \f5stkfreeze\fP() is called, -the location in memory for the object can change. -There is a current offset associated with the current object that -determines where subsequent operations apply. -Initially, this offset is zero, and the offset changes as a result -of the operations you specify. -The \f5stkseek\fP() function is used set the offset for the -current object. -The \fIoffset\fP argument to \f5stkseek\fP() specifies the new -offset for the current object. -The frame will be extended or moved -if \f5offset\fP causes the new current offset to extend beyond the -current frame. -\f5stkseek\fP() returns a pointer to the beginning of the current object. -The \f5stktell\fP() function gives the offset of the current object. -.PP -The \f5stkptr\fP() function converts the given \f5offset\fP -for the current object into a memory address on the stack. -This address is only valid until another stack operation is given. -The result is not defined if \fIoffset\fP exceeds the size of the current -object. -The \f5stkfreeze\fP() -function terminates the current object on the -stack and returns a pointer to the beginning of this object. -If \fIextra\fP is non-zero, \fIextra\fP bytes are added to the stack -before the current object is terminated. The first added byte will -contain zero and the contents of the remaining bytes are undefined. -.PP -The \f5stkon\fP() -function returns non-zero if the address given by \fIaddr\fP is -on the stack \fIstack\fP and \f50\fP otherwise. -.PP -.SH HISTORY -The -\f5stk\fP -interface was derived from similar routines in the KornShell code -that is used for building parse trees and carrying out expansions. -It provides an efficient mechanism for grouping dynamically allocated -objects so that they can be freed all at once rather than individually. -.SH AUTHOR - David Korn -.SH SEE ALSO -\f5exit(2)\fP -\f5longjmp(3)\fP -\f5malloc(3)\fP -\f5sfio(3)\fP diff --git a/usr/src/contrib/ast/src/lib/libast/man/strcopy.3 b/usr/src/contrib/ast/src/lib/libast/man/strcopy.3 deleted file mode 100644 index c08d885b23..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/strcopy.3 +++ /dev/null @@ -1,54 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STRCOPY 3 -.SH NAME -strcopy \- copy strings -.SH SYNOPSIS -.L "char* strcopy(char* a, char* b)" -.SH DESCRIPTION -.I strcopy -copies the nul-terminated string -.I b -into -.IR a . -A pointer to the 0 character in -.I a -is returned. -.SH "SEE ALSO" -strcpy(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/strdup.3 b/usr/src/contrib/ast/src/lib/libast/man/strdup.3 deleted file mode 100644 index 3b26ec4f23..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/strdup.3 +++ /dev/null @@ -1,55 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STRDUP 3 -.SH NAME -strdup \- duplicate nul-terminated string -.SH SYNOPSIS -.L "char* strdup(char* s)" -.SH DESCRIPTION -.I strdup -copies the nul-terminated string -.I s -to a new location provided by -.IR malloc (3) -and returns a pointer to the new copy. -0 is returned if -.IR malloc (3) -failed. -.SH "SEE ALSO" -malloc(3), memdup(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/strelapsed.3 b/usr/src/contrib/ast/src/lib/libast/man/strelapsed.3 deleted file mode 100644 index 8c3fa4adde..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/strelapsed.3 +++ /dev/null @@ -1,77 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STRELAPSED 3 -.SH NAME -strelapsed \- parse elapsed time expression -.SH SYNOPSIS -.L "unsigned long strelapsed(char* buf, char** next, int persec)" -.SH DESCRIPTION -.I strelapsed -returns a pointer to a string representation of the elapsed time for -.L (count/persec) -seconds. -The two largest time units are used, limiting the return value length -to at most 6 characters. -The units are: -.TP -.B s -seconds -.TP -.B m -minutes -.TP -.B h -hours -.TP -.B days -.TP -.B weeks -.TP -.B M -months -.TP -.B Y -years -.TP -.B S -scores -.SH "SEE ALSO" -strelapsed(3) -.SH CAVEATS -The return value points to a static area that is overwritten on each call. diff --git a/usr/src/contrib/ast/src/lib/libast/man/strerror.3 b/usr/src/contrib/ast/src/lib/libast/man/strerror.3 deleted file mode 100644 index 0084e3aae8..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/strerror.3 +++ /dev/null @@ -1,53 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STRERROR 3 -.SH NAME -strerror \- return error message string given error number -.SH SYNOPSIS -.L "char* strerror(int err)" -.SH DESCRIPTION -.I strerror -returns the error message string corresponding to the error message number -.IR err . -.BI "Error " nnn -is returned if -.I err -is invalid. -.SH "SEE ALSO" -error(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/stresc.3 b/usr/src/contrib/ast/src/lib/libast/man/stresc.3 deleted file mode 100644 index c09a0e9fc8..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/stresc.3 +++ /dev/null @@ -1,53 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STRESC 3 -.SH NAME -stresc \- convert character constants in string -.SH SYNOPSIS -.L "int stresc(char* s)" -.SH DESCRIPTION -.I stresc -converts -.L \e -character constant expressions in the nul-terminated string -.I s -in place and returns the length of the converted -.IR s . -.SH "SEE ALSO" -chresc(3), ctoi(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/streval.3 b/usr/src/contrib/ast/src/lib/libast/man/streval.3 deleted file mode 100644 index 2b491c8595..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/streval.3 +++ /dev/null @@ -1,83 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STREVAL 3 -.SH NAME -streval \- long integer arithmetic expression evaluator -.SH SYNOPSIS -.L "long streval(char* s, char** e, long (*conv)(char* cs, char** ce))" -.SH DESCRIPTION -.I streval -evaluates the long integer arithmetic expression in the nul-terminated string -.I s -and returns the result. -If -.I e -is not 0 then -.I *e -is set to point to the first unknown character in the expression. -.PP -If -.I conv -is not 0 then it is called when an unknown token is encountered in -.IR s . -.I cs -points to the beginning of the unknown token. -The return value is the long integer value of the unknown token and -.I ce -must be set to point to the first character after the unknown token. -If an expression syntax error is encountered the -.I conv -is called with -.I cs -set to 0 and -.I *ce -pointing to the error message text. -.PP -In addition to the normal C expressions and integer constant styles, -numbers in any base -.I b -<= 2 <=36 -may be represented as -.IR b # nnnn , -where the extra digits in -.I nnnn -are taken from -.BR [A-Z] . -.SH "SEE ALSO" -strtol(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/strgid.3 b/usr/src/contrib/ast/src/lib/libast/man/strgid.3 deleted file mode 100644 index d7a26634c2..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/strgid.3 +++ /dev/null @@ -1,53 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STRGID 3 -.SH NAME -strgid \- return group name given group number -.SH SYNOPSIS -.L "char* strgid(int gid)" -.SH DESCRIPTION -.I strgid -returns the group id name string given the group number -.IR gid . -.I strgid -maintains an internal cache to avoid repeated password database scans -by the low level -.IR getgrgid (3). -.SH "SEE ALSO" -getgrent(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/strmatch.3 b/usr/src/contrib/ast/src/lib/libast/man/strmatch.3 deleted file mode 100644 index 5f5af8989e..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/strmatch.3 +++ /dev/null @@ -1,101 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STRMATCH 3 -.SH NAME -strmatch \- match shell file patterns -.SH SYNOPSIS -.L "int strmatch(char* s, char* p)" -.br -.L "char* submatch(char* s, char* p, int m)" -.SH DESCRIPTION -.I strmatch -compares the string -.I s -with the shell pattern -.I p -and returns 1 for match and 0 otherwise. -.I submatch -does a leading substring match of the shell pattern -.I p -with the string -.IR s . -If -.I m -is 0 then the match is minimal, otherwise a maximal match is done. -A pointer to the first character after the matched substring is returned, -.I 0 -if there is no match. -.PP -Except for -.I & -and -.IR ! , -each shell pattern has an equivalent -.IR egrep (1) -construct. -.EX - \fBsh pattern egrep RE description\fP - * .* 0 or more chars - ? . any single char - [.] [.] char class - [!.] [^.] negated char class - *(.) (.)* 0 or more of - +(.) (.)+ 1 or more of - ?(.) (.)? 0 or 1 of - (.) (.) 1 of - @(.) (.) 1 of - a|b a|b a or b - a&b a and b - !(.) none of -.EE -.L \e -is used to escape *, ?, (, |, &, ), [, and \e -outside of [...]. -.SH "SEE ALSO" -grep(1) -.SH BUGS -An unbalanced -.L ) -terminates the top level pattern. -.br -Nested -.L & -and -.L ! -constructs are non-intuitive and are computationally intensive. diff --git a/usr/src/contrib/ast/src/lib/libast/man/stropt.3 b/usr/src/contrib/ast/src/lib/libast/man/stropt.3 deleted file mode 100644 index f2a8dae882..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/stropt.3 +++ /dev/null @@ -1,130 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STROPT 3 -.SH NAME -stropt \- table driven option expression evaluator -.SH SYNOPSIS -.L "#include <namval.h>" -.br -.L "int stropt(char* s, struct namval* tab, -.br -.L " int (*fun)(void* a, struct namval* p, int n, char* v)," -.br -.L " void* a)" -.SH DESCRIPTION -.I stropt -parses option expressions in the nul-terminated string -.I s -using the option names in -.IR tab . -.I tab -is an array of -.B "struct namval" -name value pairs: -.EX -char* name; -int value; -.EE -The last entry must be followed by a sentinel with -.B name -set to 0. -.PP -An option expression contains 0 or more of [\fBno\fP]\fIname\fP[=\fIvalue\fP] -separate by -.B space -or -.BR tab , -where -.I name -must be one of the option names in -.IR tab , -.I value -is an optional value, and -.B no -is for Boolean options. -Each option is passed to -.I fun -for processing. -.I a -is the -.L void* -pointer that is passed from the -.I stropt -call but is otherwise not interpreted. -.I p -points to the option name value pair from -.IR tab . -.I n -is 0 if -.B no -preceded the option -.I name -and -.I v -points to the beginning of the option -.I value -in -.IR s . -and -If -.I name -is not found in -.I tab -then -.I fun -is called with -.I p -pointing to an internal -.I namval -entry with -.I p\->name -pointing to the unknown option and -.I p\->value -set to the -.I value -of the sentinel entry in -.IR tab . -.PP -If -.I fun -returns non-zero then this value is returned and no further -options are processed. -Otherwise -.I stropt -returns 0 after processing all options. diff --git a/usr/src/contrib/ast/src/lib/libast/man/strperm.3 b/usr/src/contrib/ast/src/lib/libast/man/strperm.3 deleted file mode 100644 index 9b68946f5f..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/strperm.3 +++ /dev/null @@ -1,109 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STRPERM 3 -.SH NAME -strperm \- evaluate file permission expression -.SH SYNOPSIS -.L "int strperm(char* s, char** e, int p)" -.SH DESCRIPTION -.I strperm -applies a file permission expression in the nul-terminated string -.I s -to the initial file permission mask -.IR p . -The new permission mask is returned. -If -.I e -not 0 then -.I *e -is set to point to the first unrecognized character in -.IR s . -.PP -A tape device specification is composed of one or more -.I who-op-permission -terms separated by -.BR , . -.I who -selects portions of the permission bits and may be any combination of: -.TP 3 -.B u -the user permission bits; -.TP -.B g -the group permission bits; -.TP -.B o -the `other' permission bits; -.TP -.B a -all permission bits. -.PP -If omitted, all permission bits are selected. -.I op -specifies how the original permission -.I p -is to be modified: -.TP 3 -.B + -.br -.ns -.B | -the new bits are set in -.IR p ; -.TP 3 -.B \- -the new bits are cleared in -.IR p ; -.TP -.B & -the new bits are and'd with -.IR p ; -.TP -.B = -the select bits in -.I p -are set equal to the new bits -.PP -A permission expression term may also be an octal number. -Octal specifications are inherently non-portable. -Refer to -.IR chmod (1) -for an explanation of this form. -.SH "SEE ALSO" -chmod(1), ls(1), strmode(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/strsignal.3 b/usr/src/contrib/ast/src/lib/libast/man/strsignal.3 deleted file mode 100644 index 414198087c..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/strsignal.3 +++ /dev/null @@ -1,53 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STRSIGNAL 3 -.SH NAME -strsignal \- return signal description string given signal number -.SH SYNOPSIS -.L "char* strsignal(int sig)" -.SH DESCRIPTION -.I strsignal -returns the signal description string corresponding to the signal number -.IR sig . -.BI "Signal " nnn -is returned if -.I sig -is invalid. -.SH "SEE ALSO" -signal(2), sigvec(2) diff --git a/usr/src/contrib/ast/src/lib/libast/man/strsort.3 b/usr/src/contrib/ast/src/lib/libast/man/strsort.3 deleted file mode 100644 index c48cfc26c6..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/strsort.3 +++ /dev/null @@ -1,73 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH HSORT 3 -.SH NAME -hsort \- array heap sort -.SH SYNOPSIS -.EX -#include <ast.h> - -void strsort(char** \fIarray\fP, int \fIelements\fP, int (*\fIcompare\fP)(const char* \fIa\fP, const char* \fIb\fP)); -.EE -.SH DESCRIPTION -.L strsort -does a heap sort on the array of pointers -.I array -with -.I elements -elements using the comparison function -.IR compare . -.I compare -returns -.L \-1 -if -.I a -is lexicographically less than -.IR b , -.L 0 -if -.I a -is equal to -.IR b , -and -.L 1 -if -.I a -is lexicographically greater than -.IR b . diff --git a/usr/src/contrib/ast/src/lib/libast/man/strtape.3 b/usr/src/contrib/ast/src/lib/libast/man/strtape.3 deleted file mode 100644 index 06c33ba978..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/strtape.3 +++ /dev/null @@ -1,86 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STRTAPE 3 -.SH NAME -strtape \- convert string to tape device pathname -.SH SYNOPSIS -.L "char* strtape(char* s, char** e)" -.SH DESCRIPTION -.I strtape -converts the generic tape device specification in the nul-terminated string -.I s -to a local tape device pathname. -A pointer to the device pathname is returned. -If -.I e -not 0 then -.I *e -is set to point to the first unrecognized character in -.IR s . -.PP -A tape device specification is composed of -.IR unit-density-rewind . -All are optional. -.I unit -is a unit number in the range -.BR [0-7] . -The default unit is -.BR 1 . -Density may be one of: -.TP 3 -.B l -for low; -.TP 3 -.B m -for medium, and -.TP -.B h -for high. -.PP -The default is -.BR m . -.I rewind -is -.B n -for no-rewind on device close. -The default is to rewind on device close. -.SH "SEE ALSO" -pax(1), tar(1) -.SH CAVEATS -The return value points to a static area that is overwritten on each call. diff --git a/usr/src/contrib/ast/src/lib/libast/man/strton.3 b/usr/src/contrib/ast/src/lib/libast/man/strton.3 deleted file mode 100644 index bfcf8918a0..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/strton.3 +++ /dev/null @@ -1,97 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STRTON 3 -.SH NAME -strton \- convert string to long integer -.SH SYNOPSIS -.L "long strton(char* s, char** e)" -.SH DESCRIPTION -.I strton -converts the nul-terminated string -.I s -to a long integer. -If -.I e -not 0 then -.I *e -is set to point to the first unrecognized character in -.IR s . -Leading spaces in -.I s -are ignored. -.PP -A number is composed of -.IR sign-base-number-suffix . -All but -.I number -are optional. -.I sign -may be \+ or \-. -.I base -may be: -.TP -.B 0x -for hexadecimal; -.TP -.B 0 -for octal, or -.TP -.IR nn # -for base -2 \(le -.I nn -\(le 36. -.PP -For bases greater than 10 the additional digits are take from the set -.BR [a-zA-Z] . -The suffix multiplies the converted number and may be: -.TP -.B b -block (512) -.TP -.B g -giga (1024 * 1024 * 1024) -.TP -.B k -kilo (1024) -.TP -.B m -mega (1024 * 1024) -.SH "SEE ALSO" -atoi(3), scanf(3), strtod(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/struid.3 b/usr/src/contrib/ast/src/lib/libast/man/struid.3 deleted file mode 100644 index 522deb5b82..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/struid.3 +++ /dev/null @@ -1,53 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH STRUID 3 -.SH NAME -struid \- return user name given user number -.SH SYNOPSIS -.L "char* struid(int uid)" -.SH DESCRIPTION -.I struid -returns the user id name string given the user number -.IR uid . -.I struid -maintains an internal cache to avoid repeated password database scans -by the low level -.IR getpwuid (3). -.SH "SEE ALSO" -getpwent(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/swap.3 b/usr/src/contrib/ast/src/lib/libast/man/swap.3 deleted file mode 100644 index 82176de205..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/swap.3 +++ /dev/null @@ -1,138 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH SWAP 3 -.SH NAME -swap \- integral representation conversion routines -.SH SYNOPSIS -.L "#include <swap.h>" -.sp -.L "int swapop(const void* internal, const void* external, int width); -.L "int_max swapget(int op, const void* from, int width);" -.L "void* swapput(int op, void* to, int width, int_max value);" -.L "void* swapmem(int op, const void* from, void* to, size_t n);" -.SH DESCRIPTION -These routines convert integral constants between internal and -external representations. -They are used to handle binary data generated by foreign programs. -New binary data representations should use the compact canonical form -provided by the -.IR sfio (3) -routines -.L sfputu -and -.LR sgetu . -.PP -.L swapop -returns the swap operation required to convert the -.L width -byte integer -.L external -to the -.L width -byte integer -.LR internal . -The swap operation is a bit mask: -.TP -.L 0 -No swapping necessary. -.TP -.L 1 -Swap byte -.L 0 -with byte -.LR 1 . -.TP -.L 2 -Swap bytes -.L 0 -and -.L 1 -with bytes -.L 2 -and -.LR 3 . -.TP -.L 4 -Swap bytes -.L 0-3 -with bytes -.LR 4-7 , -and so on. -The largest native integral type is defined by the macro -.L int_max -in the header -.L <int.h> -described in -.IR int (3). -.PP -.L swapget -returns the -.L width -byte integer in the buffer -.LR from , -swapped according to -.LR op . -.PP -.L swapput -copies the -.L width -byte integer -.L value -into the buffer -.LR to , -swapped according to -.LR op . -.L to -is returned. -.PP -.L swapmem -swaps -.L n -bytes from the buffer -.L from -to the buffer -.L to -according to -.LR op . -.L to -and -.L from -may be the same. -.SH "SEE ALSO" -int(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/tab.3 b/usr/src/contrib/ast/src/lib/libast/man/tab.3 deleted file mode 100644 index e1c76f3534..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/tab.3 +++ /dev/null @@ -1,74 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH TAB 3 -.SH NAME -tab \- simple table lookup routines -.SH SYNOPSIS -.L "#include <ast.h>" -.sp -.L "int tabindex(const void* tab, int size, const char* name);" -.L "void* tablook(const void* tab, int size, const char* name);" -.SH DESCRIPTION -These routines do linear lookups in -.I small -tables (on the order of 32 elements). -Each table element has a size of -.L size -bytes and the beginning of the element points to a name that is -matched by the lookup routines. -.PP -.L tabindex -returns the index of the table element in -.L tab -that matches -.LR name . -If there is no match then -.L \-1 -is returned. -.PP -.L tablook -returns a pointer to the table element in -.L tab -that matches -.LR name . -If there is no match then -.L 0 -is returned. -.SH "SEE ALSO" -hash(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/tm.3 b/usr/src/contrib/ast/src/lib/libast/man/tm.3 deleted file mode 100644 index 12eb4ecf4a..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/tm.3 +++ /dev/null @@ -1,775 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH TM 3 -.SH NAME -tm \- seconds resolution time conversion support -.SH SYNOPSIS -.L "#include <tm.h>" -.SH DESCRIPTION -The -.I tm -library supports conversion between -string date specifications, -seconds reolution -.L time_t -clock values and -.LR Tm_t . -.L Tm_t -contains the elements of -.L "struct tm" -along with these additions: -.TP -.L "unsigned _ast_int4_t tm_nsec" -The subsecond portion of the time in nanoseconds. -.TP -.L "Tm_zone_t* tm_zone" -The time zone name. -.PP -.L localtime() -and -.L gmtime() -(see -.BR ctime (3)) -are used to determine local time zone and savings time information. -.PP -.L time_t -values are the number of seconds since the epoch, -.BR "Jan 1 00:00:00 GMT 1970" , -with leap seconds omitted. -.PP -The global variable -.L "int tm_info.flags" -contains flags that allow all programs using the library -to be controlled in a consistent manner. -.L tm_info.flags -is initialized by the -.L tminit() -routine described below, and may be explicitly reset after -.L tminit() -is called. -The flags are: -.TP -.L TM_ADJUST -Set by -.L tminit() -if -.L localtime() -and -.L gmtime() -do not compensate for leap seconds. -.TP -.L TM_LEAP -.L time_t -values are interpreted as if they include leap seconds. -Set by -.L tminit() -if the -.L leap -option is set in the -.L TM_OPTIONS -environment variable. -.TP -.L TM_UTC -Times are relative to -.B UTC -(universal coordinated time, i.e., -.BR GMT .) -Otherwise times are relative to the local time zone. -Set by -.L tminit() -if the time zone name matches one of -.L tm_info.format[43] -through -.L tm_info.format[46] -described below. -If the time zone name is not determined by -.L localtime() -then the environment variables -.L TZNAME -(as described in BSD 4.3) and -.L TZ -(as described in System V) -are checked, in order. -If this fails then the time zone name is constructed using -the local time zone offset. -.PP -The routines are: -.TP -.L "time_t tmdate(const char* date, char** end, time_t* clock)" -Parses the date specification -.L date -using the -.L tm_info.format -string table (described below) -and returns the equivalent -.L time_t -value. -If -.RL non- NULL , -.L end -is set to the position of the first unrecognized character in -.LR date . -.L clock -is used to provide default values for omitted components in -.LR date . -If -.L clock -is -.L NULL -then the current time is used. -.TP -.L "Tm_t* tmfix(Tm_t* tp)" -Corrects any out of bounds fields in -.L tp -and returns -.L tp -as its value. -The corrections start with -.L tp->tm_sec -and propagate down to -.LR tp->tm_year . -For example, if -.L tp->tm_sec -were 61 then it would change to 1 and -.L tp->tm_min -would be incremented by 1, and so on. -.L tp->tm_isdst -is not changed -- call -.L tmtime() -to determine its proper value after the -.L tmfix() -adjustments. -.TP -.L "char* tmfmt(char* buf, size_t len, const char* format, time_t* clock)" -Formats the date pointed to by -.L clock -into the buffer -.L buf -with size -.L len -bytes according to the format specification -.LR format . -If -.L format -is -.L NULL -or empty then the string -.L tm_info.format[40] -is used. -If -.L clock -is -.L NULL -then the current time is used. -A pointer to the end of -.L buf -(i.e., the terminating -.LR "'\e0'" ) -is returned. -.RS -.PP -.L format -is in -.BR printf (3) -style, where -.RI % field -names a fixed size field, zero padded if necessary, -and -.I \ec -and -.I \ennn -sequences are as in C. Invalid -.RI % field -specifications and all other characters are copied -without change. -.I field -may be preceded by -.B %- -to turn off padding or -.B %_ -to pad with space, otherwise numeric fields -are padded with -.B 0 -and string fields are padded with space. -.I field -may also be preceded by -.B E -for alternate era representation or -.B O -for alternate digit representation (if supported by the current locale.) -Finally, an integral -.I width -preceding -.I field -truncates the field to -.I width -characters. -sequences are interpreted as in the C language. -String field values are taken from the -.L tm_info.format -string table. -The -.I fields -are: -.TP -.PD 0 -.B % -.B % -character. -.TP -.B a -Abbreviated weekday name. -.TP -.B A -Full weekday name. -.TP -.B b -Abbreviated month name. -.TP -.B c -.BR ctime (3) -style date without the trailing -.BR newline . -.TP -.B C -.BR date (1) -style date. -.TP -.B d -Day of month number. -.TP -.B D -Date as -.IR mm / dd / yy . -.TP -.B e -Blank padded day of month number. -.TP -.B E -Unpadded day of month number. -.TP -.B f -Locale default override date format. -.TP -.B F -Locale default date format -.RL ( tm_info.format[40] .) -.TP -.B h -Abbreviated month name. -.TP -.B H -24-hour clock hour. -.TP -.B i -International -.BR date (1) -date that includes the time zone type name -.RL ( tm_info.format[107] .) -.TP -.B I -12-hour clock hour. -.TP -.B j -1-offset Julian date. -.TP -.B J -0-offset Julian date. -.TP -.B k -.BR date (1) -style date -.RL ( tm_info.format[106] .) -.TP -.B K -Language neutral, all numeric, no embedded space date -with larger to smaller time units from left to right, -suitable for sorting: -.LR '"%Y-%m-%d+%H:%M:%S"' . -.TP -.B l -.BR ls (1) -.B \-l -date that lists recent dates with -.L %g -and distant dates with -.BR %G . -.TP -.B m -Month number. -.TP -.B M -Minutes. -.TP -.B n -.B newline -character. -.TP -.B N -The time zone type or nation code. -.TP -.B p -Meridian (e.g., -.B AM -or -.BR PM .) -.TP -.B q -The nanosecond part of the time. -.TP -\fB%Q\fP\fI<delim>recent<delim>distant<delim>\fP -Recent dates are formatted with -.I recent -and distand dates are formatted with -.IR distant , -where -.I <delim> -is any character not appearing in -.I recent -or -.IR distant . -.TP -.B r -12-hour time as -.IR hh : mm : ss -.IR meridian . -.TP -.B R -24-hour time as -.IR hh : mm . -.TP -.B s -Seconds since the epoch. -.RI . prec -preceding -.B s -appends -.I prec -nanosecond digits, -.B 9 -if -.I prec -is omitted. -.TP -.B S -.I seconds.subseconds -since the epoch. -.TP -.B t -.B tab -character. -.TP -.B T -24-hour time as -.IR hh : mm : ss . -.TP -.B u -Weeday number with 1 for Monday, 7 for Sunday. -.TP -.B U -Week number with Sunday as the first day. -.TP -.B V -ISO week number (i18n is \fIfun\fP.) -.TP -.B w -Weekday number with 0 for Sunday, 6 for Saturday. -.TP -.B W -Week number with Monday as the first day. -.TP -.B x -Local date style, using -.LR tm_info.format[39] , -that includes the month, day and year. -.TP -.B X -Local time style, using -.LR tm_info.format[38] , -that includes the hours and minutes. -.TP -.B y -2-digit year (you'll be sorry.) -.TP -.B Y -4-digit year. -.TP -.B z -Time zone -.I SHHMM -west of GMT offset where -.I S -is -.B + -or -.BR - . -.TP -.B Z -Time zone name. -.TP -=[=]][-+]]\fIflag\fP -Set (default or +) or clear (-) -.I flag -in -.L tm_info.flags -for the remainder of -.IR format , -or for the remainder of the process if -.B == -is specified. -.I flag -may be: -.RS -.TP -.B l -.L (TM_LEAP) -Enable leap second adjustments. -.TP -.B s -.L (TM_SUBSECOND) -Append nanosecond -.B .%N -to -.BR %S . -.TP -.B u -.L (TM_UTC) -UTC time zone. -.RE -.TP -.B # -Equivalent to -.BR %s . -.TP -\fP?\fP\fIalternate\fP -Use -.I alternate -format is a default format override has not been specified. -e.g., -.BR ls (1) -uses -.BR %?%l . -Export -\f5TM_OPTIONS="format='\fP\fIoverride\fP\f5'"\fP -to override the default. -.PD -.RE -.TP -.L "void tminit(Tm_zone_t* zone)" -Implicitly called by the other -.I tm -library routines to initialize global data, including the -.L tm_info.format -table and the -.L tm_info.flags -global flags. -Global data should only be modified after an explicit call to -.LR tminit . -If -.L "zone != 0" -then it specifies a time zone other that the local time zone. -.TP -.L "void tmset(Tm_zone_t* zone);" -.L tmset -sets the reference timezoe to -.LR zone . -.L tm_info.local -points to the local timezone and -.L tm_info.zone -points to the current reference timezone. -.TP -.L "time_t tmleap(time_t* clock)" -Returns a -.L time_t -value for the time pointed to by -.L clock -with leap seconds adjusted for external -routines that do not handle leap seconds. -If -.L clock -is -.L NULL -then the current time is used. -Adjustments are only done if the -.L TM_ADJUST -flag is set in -.LR tm_info.flags . -.TP -.L "Tm_t* tmmake(time_t* clock)" -Returns a pointer to the -.L Tm_t -struct corresponding to the time pointed to by -.LR clock . -If -.L clock -is -.L NULL -then the current time is used. -.TP -.L "time_t tmtime(Tm_t* tp, int west)" -Returns the -.L time_t -value corresponding to -.LR tp . -If -.L west -is -.L TM_LOCALZONE -then -.L tm -is relative to the local time zone, -otherwise -.L west -is the number of minutes west of -.B UTC -with daylight savings time taken into account. -.LR tp->tm_wday , -.LR tp->tm_yday -and -.L tp->tm_isdst -are ignored in the conversion. -.PP -The library routines use a table of date strings pointed to by -.LR "char** tm_info.format" . -The indices in -.L tm_info.format -are fixed by category. -.L tm_info.format -may be changed to point to other tables -according to local language and date conventions. -The contents by index (showing the USA English values) are: -.RS -.TP -.PD 0 -.B 0-11 -3-character abbreviated month names. -.TP -.B 12-23 -Full month names. -.TP -.B 24-30 -3-character abbreviated weekday names. -.TP -.B 31-37 -Full weekday names. -.TP -.B 38 -.L tmfmt() -local time format used by the -.B %X -field. -.TP -.B 39 -.L tmfmt() -local date format used by the -.B %x -field. -.TP -.B 40 -.L tmfmt() -format used if the -.L format -argument is -.L NULL -or empty. -.TP -.B 41-42 -Meridian names: AM, PM. -.TP -.B 43-46 -.B UTC -time zone names: GMT, UTC, UCT, CUT. -.TP -.B 47-50 -Daylight savings time suffix names: DST. -.TP -.B 51-54 -Suffixes to be ignored when matching strings in -.LR tmfmt() . -.TP -.B 55-61 -Time part names: second, hour, minute, day, week, month, year. -.TP -.B 62-65 -Hours of the day names: midnight, morning, noon, evening. -.TP -.B 66-68 -Relative day names: yesterday, today, tomorrow. -.TP -.B 69-71 -Past relative time references: last, ago, past. -.TP -.B 72-75 -Current relative time references: this, now, current. -.TP -.B 75-77 -Future relative time references: next, hence, coming. -.TP -.B 78-80 -Exact relative time references: exactly. -.TP -.B 81-84 -Noise words to be ignored: at, in, on. -.TP -.B 85-94 -Ordinal suffixes: st, nd, rd, th, th, th, th, th, th, th. -.TP -.B 95-104 -Digit names. -.TP -.B 105 -The -.L tmfmt() -format equivalent for -.BR ctime (3): -.LR '"%a %b %e %T %Y"' . -.TP -.B 106 -The -.L tmfmt() -.BR date (1) -default format: -.LR '"%a %b %e %T %Z %Y"' . -.TP -.B 107 -The -.L tmfmt() -.BR date (1) -international format: -.LR '"%a %b %e %T %z %Z %Y"' . -.TP -.B 108 -The -.L tmfmt() -.BR ls (1) -recent date format: -.LR '"%b %e %H:%M"' . -.TP -.B 109 -The -.L tmfmt() -.BR ls (1) -distant date format: -.LR '"%b %e %Y"' . -.TP -.B 110 -The -.L tmfmt() -.BR date (1) -meridian date format: -.LR '"%I:%M:%S %p"' . -.TP -.B 111 -The ERA name. -.TP -.B 112 -ERA alternative for -.BR 39 . -.TP -.B 113 -ERA alternative for -.BR 38 . -.TP -.B 114 -ERA alternative for -.BR 40 . -.TP -.B 115 -The ERA year. -.TP -.B 116-125 -Ordinal names: first, \fIno second!\fP, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth. -.TP -.B 126-128 -Final time references, as in \fIthe last in the list\fP: final, ending, nth. -.PD -.RE -.PP -Low level support functions and data are described in -.LR <tm.h> . -.SH EXAMPLES -.EX -#include <tm.h> -main() { - int i; - time_t t; - char buf[128]; - struct { - char* date; - char* format; - } x[] = { - "now", "%i", - "2 months ago", "%C", - "this Wednesday noon", "%x %I:%M %p", - "last December 25", "%A", - 0, 0 - }; - for (i = 0; x[i].date; i++) { - t = tmdate(x[i].date, (char*)0, (time_t*)0); - (void)tmfmt(buf, sizeof(buf), x[i].format, &t); - puts(buf); - } -} -.EE -produces -.EX -Fri Sep 30 12:10:14 USA EDT 1988 -Fri Jul 1 00:00:00 EDT 1988 -10/05/88 12:00 PM -Friday -.EE -.SH "SEE ALSO" -.BR date (1), -.BR time (2), -.BR ctime (3) -.SH BUGS -The C library static -.L "struct tm" -values may get clobbered by -.I tm -library routines as the -.BR ctime (3) -and -.BR localtime (3) -routines typically return pointers to a single static -.L "struct tm" -area. -.L tmdate() -uses an internal international time zone name table that will -probably always be incomplete. diff --git a/usr/src/contrib/ast/src/lib/libast/man/tmx.3 b/usr/src/contrib/ast/src/lib/libast/man/tmx.3 deleted file mode 100644 index 268d40a9e5..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/tmx.3 +++ /dev/null @@ -1,576 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH TM 3 -.SH NAME -tm \- time conversion support -.SH SYNOPSIS -.L "#include <tm.h>" -.SH DESCRIPTION -The -.I tm -library supports conversion between -string date specifications, -.L time_t -clock values and -.L "struct tm" -values. -.L localtime() -and -.L gmtime() -(see -.IR ctime (3)) -are used to determine local time zone information. -.PP -.L time_t -values are the number of seconds since the epoch, -.BR "Jan 1 00:00:00 GMT 1970" , -with leap seconds omitted. -.PP -The global variable -.L "int tm_info.flags" -contains flags that allow all programs using the library -to be controlled in a consistent manner. -.L tm_info.flags -is initialized by the -.L tminit() -routine described below, and may be explicitly reset after -.L tminit() -is called. -The flags are: -.TP -.L TM_ADJUST -Set by -.L tminit() -if -.L localtime() -and -.L gmtime() -do not compensate for leap seconds. -.TP -.L TM_LEAP -.L time_t -values are interpreted as if they include leap seconds. -Set by -.L tminit() -if the -.L leap -option is set in the -.L TM_OPTIONS -environment variable. -.TP -.L TM_UTC -Times are relative to -.B UTC -(universal coordinated time, i.e., -.BR GMT ). -Otherwise times are relative to the local time zone. -Set by -.L tminit() -if the time zone name matches one of -.L tm_info.format[43] -through -.L tm_info.format[46] -described below. -If the time zone name is not determined by -.L localtime() -then the environment variables -.L TZNAME -(as described in BSD 4.3) and -.L TZ -(as described in System V) -are checked, in order. -If this fails then the time zone name is constructed using -the local time zone offset. -.PP -The routines are: -.TP -.L "time_t tmdate(const char* date, char** end, time_t* clock)" -Parses the date specification -.L date -using the -.L tm_info.format -string table (described below) -and returns the equivalent -.L time_t -value. -If -.RL non- NULL , -.L end -is set to the position of the first unrecognized character in -.LR date . -.L clock -is used to provide default values for omitted components in -.LR date . -If -.L clock -is -.L NULL -then the current time is used. -.TP -.L "struct tm* tmfix(struct tm* tp)" -Corrects any out of bounds fields in -.L tp -and returns -.L tp -as its value. -The corrections start with -.L tp->tm_sec -and propagate down to -.LR tp->tm_year . -For example, if -.L tp->tm_sec -were 61 then it would change to 1 and -.L tp->tm_min -would be incremented by 1, and so on. -.LR tp->tm_wday , -.LR tp->tm_yday -and -.L tp->tm_isdst -are not changed as these can be computed from the other fields. -.TP -.L "char* tmfmt(char* buf, size_t len, const char* format, time_t* clock)" -Formats the date pointed to by -.L clock -into the buffer -.L buf -with size -.L len -bytes according to the format specification -.LR format . -If -.L format -is -.L NULL -or empty then the string -.L tm_info.format[40] -is used. -If -.L clock -is -.L NULL -then the current time is used. -A pointer to the end of -.L buf -(i.e., the terminating -.LR "'\e0'" ) -is returned. -.RS -.PP -.L format -is in the style of -.IR printf (3), -where -.BI % field -causes the corresponding fixed size field to be placed in -.LR buf , -zero padded if necessary, and \e\fIc\fP and \e\fInnn\fP -sequences are interpreted as in the C language. -Otherwise invalid -.BI % field -specifications and all other characters in -.L format -are copied into -.L buf -without change. -String field values are taken from the -.L tm_info.format -string table. -The -.I fields -are: -.TP -.PD 0 -.B % -.B % -character. -.TP -.B a -Abbreviated weekday name. -.TP -.B A -Full weekday name. -.TP -.B b -Abbreviated month name. -.TP -.B c -.IR ctime (3) -style date without the trailing -.BR newline . -.TP -.B C -.IR date (1) -style date. -.TP -.B d -Day of month number. -.TP -.B D -Date as -.IR mm / dd / yy . -.TP -.B e -Blank padded day of month number. -.TP -.B E -Unpadded day of month number. -.TP -.B h -Abbreviated month name. -.TP -.B H -24-hour clock hour. -.TP -.B i -International -.IR date (1) -date that includes the time zone type name. -.TP -.B I -12-hour clock hour. -.TP -.B j -1-offset Julian date. -.TP -.B J -0-offset Julian date. -.TP -.B l -.IR ls (1) -.B \-l -date that lists recent dates with -.IR hh : mm -and distant dates with -.IR yyyy . -.TP -.B m -Month number. -.TP -.B M -Minutes. -.TP -.B n -.B newline -character. -.TP -.B p -Meridian (e.g., -.B AM -or -.BR PM ). -.TP -.B r -12-hour time as -.IR hh : mm : ss -.IR meridian . -.TP -.B R -24-hour time as -.IR hh : mm . -.TP -.B S -Seconds. -.TP -.B t -.B tab -character. -.TP -.B T -24-hour time as -.IR hh : mm : ss . -.TP -.B U -Week number with Sunday as the first day. -.TP -.B w -Weekday number. -.TP -.B W -Week number with Monday as the first day. -.TP -.B x -Local date style, using -.LR tm_info.format[39] , -that includes the month, day and year. -.TP -.B X -Local time style, using -.LR tm_info.format[38] , -that includes the hours and minutes. -.TP -.B y -2-digit year. -.TP -.B Y -4-digit year. -.TP -.B z -Time zone type name. -.TP -.B Z -Time zone name. -.TP -.BI + flag -.TP -.BI \- flag -Temporarily (until -.L tmform() -returns) sets (+) or clears (\-) the -.L tm_info.flags -flags specified by -.IR flag : -.RS -.TP -.B l -.L TM_LEAP -.TP -.B u -.L TM_UTC -.RE -.TP -.B # -Number of seconds since the epoch. -.PD -.RE -.TP -.L "void tminit(Tm_zone_t* zone)" -Implicitly called by the other -.I tm -library routines to initialize global data, including the -.L tm_info.format -table and the -.L tm_info.flags -global flags. -Global data should only be modified after an explicit call to -.LR tminit . -If -.L "zone != 0" -then it specifies a time zone other that the local time zone. -.TP -.L "void tmset(Tm_zone_t* zone);" -.L tmset -sets the reference timezoe to -.LR zone . -.L tm_info.local -points to the local timezone and -.L tm_info.zone -points to the current reference timezone. -.TP -.L "time_t tmleap(time_t* clock)" -Returns a -.L time_t -value for the time pointed to by -.L clock -with leap seconds adjusted for external -routines that do not handle leap seconds. -If -.L clock -is -.L NULL -then the current time is used. -Adjustments are only done if the -.L TM_ADJUST -flag is set in -.LR tm_info.flags . -.TP -.L "struct tm* tmmake(time_t* clock)" -Returns a pointer to the -.L tm -struct corresponding to the time pointed to by -.LR clock . -If -.L clock -is -.L NULL -then the current time is used. -.TP -.L "time_t tmtime(struct tm* tp, int west)" -Returns the -.L time_t -value corresponding to -.LR tp . -If -.L west -is -.L TM_LOCALZONE -then -.L tm -is relative to the local time zone, -otherwise -.L west -is the number of minutes west of -.B UTC -with daylight savings time taken into account. -.LR tp->tm_wday , -.LR tp->tm_yday -and -.L tp->tm_isdst -are ignored in the conversion. -.PP -The library routines use a table of date strings pointed to by -.LR "char** tm_info.format" . -The indices in -.L tm_info.format -are fixed by category. -.L tm_info.format -may be changed to point to other tables -according to local language and date conventions. -The contents by index (showing the USA English values) are: -.RS -.TP -.PD 0 -.B 0-11 -3-character abbreviated month names. -.TP -.B 12-23 -Full month names. -.TP -.B 24-30 -3-character abbreviated weekday names. -.TP -.B 31-37 -Full weekday names. -.TP -.B 38 -.L tmform() -local time format used by the -.B %X -field. -.TP -.B 39 -.L tmform() -local date format used by the -.B %x -field. -.TP -.B 40 -.L tmform() -format used if the -.L format -argument is -.L NULL -or empty. -.TP -.B 41-42 -Meridian names: AM, PM. -.TP -.B 43-46 -.B UTC -time zone names: GMT, UTC, UCT, CUT. -.TP -.B 47-50 -Daylight savings time suffix names: DST. -.TP -.B 51-54 -Suffixes to be ignored when matching strings in -.LR tmform() . -.TP -.B 55-61 -Time part names: second, hour, minute, day, week, month, year. -.TP -.B 62-65 -Hours of the day names: midnight, morning, noon, evening. -.TP -.B 66-68 -Relative day names: yesterday, today, tomorrow. -.TP -.B 69-71 -Past relative time references: last, ago, past. -.TP -.B 72-75 -Current relative time references: this, now, current. -.TP -.B 75-77 -Future relative time references: next, hence, coming. -.TP -.B 78-80 -Exact relative time references: exactly. -.TP -.B 81-85 -Noise words to be ignored: at, in, on. -.PD -.RE -.PP -Low level support functions and data are described in -.LR <tm.h> . -.SH EXAMPLES -.EX -#include <tm.h> -main() { - int i; - time_t t; - char buf[128]; - struct { - char* date; - char* format; - } x[] = { - "now", "%i", - "2 months ago", "%C", - "this Wednesday noon", "%x %I:%M %p", - "last December 25", "%A", - 0, 0 - }; - for (i = 0; x[i].date; i++) { - t = tmdate(x[i].date, (char*)0, (time_t*)0); - (void)tmform(buf, x[i].format, &t); - puts(buf); - } -} -.EE -produces -.EX -Fri Sep 30 12:10:14 USA EDT 1988 -Fri Jul 1 00:00:00 EDT 1988 -10/05/88 12:00 PM -Friday -.EE -.SH "SEE ALSO" -date(1), time(2), ctime(3) -.SH BUGS -.L "struct tm" -values may get clobbered by the -.I tm -library routines as the -.IR ctime (3) -routines typically return pointers to a single static -.L "struct tm" -area. -.L tmdate() -uses an internal international time zone name table that will -probably always be incomplete. diff --git a/usr/src/contrib/ast/src/lib/libast/man/tok.3 b/usr/src/contrib/ast/src/lib/libast/man/tok.3 deleted file mode 100644 index 46fbff9503..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/tok.3 +++ /dev/null @@ -1,217 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH TOK 3 -.SH NAME -tok \- space separated token stream routines -.SH SYNOPSIS -.L "#include <ast.h>" -.sp -.L "void* tokopen(char* string)" -.L "char* tokread(void* tok)" -.L "void tokclose(void* tok)" -.sp -.L "int tokscan(char* string, char** next, const char* format, ...);" -.sp -.L "Sfio_t* tokline(const char* input, int flags, int* line);" -.SH DESCRIPTION -.L tokopen -returns a pointer to a space separated token stream on the 0 terminated -string -.LR string . -.L tokread -returns a pointer to the next -space separated token in the token stream -.L tok -as returned by -.LR tokopen . -0 is returned when no tokens remain. -.L tokread -temporarily modifies -.L string -by inserting 0's to terminate each token. -.L tokclose -closes the token stream and restores -.L string -to its original state. -.PP -.L tokscan -scans the string -.L string -for tokens specified in -.LR format . -It is a more forgiving -.IR sscanf (3). -If -.L "next != 0" -then it will point to the next unread character in -.L string -on return. -The number of scanned tokens is returned. -.L \-1 -is returned if -.L string -was not empty and -.L format -failed to match and tokens. -.PP -.I space -in -.L format -matches 0 or more -.I space -or -.I tab -characters. -.I newline -in format eats the remainder of the current line in -.LR string . -"...", '...' and \e\fIcharacter\fP quotes are interpreted. -A quoted -.I carriage-return -is converted to -.IR newline . -.I newline -in -.L string -is equivalent to end of string except when quoted. -.I \enewline -is a line splice. -.PP -.L % -in -.L format -prefixes format conversion characters; each conversion character -corresponds to a -.L tokscan -argument following the -.L format -argument. -The format conversions are: -.TP -.L %c -A single -.LR char . -.TP -.L "%hd %d %ld" -[short, int, long] base 10 integer. -.TP -.L "%hn %n %ln" -[short, int, long] C-style base integer. -.TP -.L "%ho %o %lo" -[short, int, long] base 8 integer. -.TP -.L %s -String. -.TP -.L "%hu %u %lu" -[short, int, long] C-style base unsigned integer. -.TP -.L %v -The next two arguments are a pointer to a -.L char** -argument vector and the maximum number of elements in the vector. -.TP -.L "%hx %x %lx" -[short, int, long] base 16 integer. -.PP -.L %s -and -.L %v -data may also be counted length strings of the form -\f5(\fIcount\fP:\fIdata\fP)\fR -where -.I count -is the number of characters in -.I data -and the terminating -.L ) -may also be a -.IR tab , -or the data may be -.L (null) -which represents the -.L NULL -string. -.PP -.L tokline -returns an -.IR sfio (3) -stream to a file or string that splices -.I \enewline -into single lines, -allows "..." and '...' to quotes to span -.I newlines -(done by translating quoted -.I newline -to -.IR carriage-return ; -.L tokscan -above converts quoted -.I carriage-return -back to -.IR newline ), -and deletes -.I "# ... newline" -comments. -This is done by pushing an -.I sfio -discipline onto a string or file stream. -Seeks are disabled on the resulting stream. -If -.L "flags == SF_READ" -then -.L input -is a file name; -If -.L "flags == SF_STRING" -then -.L input -is a 0 terminated string; -otherwise -.L input -is an open -.L Sfio_t* -stream. -If -.L "line != 0" -then it points to a line count that is initialized to 0 -and is incremented for each input line. -.SH "SEE ALSO" -sfio(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/touch.3 b/usr/src/contrib/ast/src/lib/libast/man/touch.3 deleted file mode 100644 index 908a8b1e68..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/touch.3 +++ /dev/null @@ -1,68 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH TOUCH 3 -.SH NAME -touch \- set file access and modify times -.SH SYNOPSIS -.L "#include <ast.h>" -.sp -.L "int touch(const char* path, time_t atime, time_t mtime, int force);" -.SH DESCRIPTION -.L touch -sets the access and modify times of the file named by -.LR path . -If -.L "force != 0" -then the file is created if it doesn't exist; -otherwise the file is not created and -.L \-1 -is returned. -If -.L "force < 0" -then -.L atime -and -.L mtime -are taken verbatim; otherwise -.L "(time_t)(-1)" -retains the current value for the file and -.L "(time_t)(0)" -uses the current time. -.SH CAVEATS -By default the change time is always changed to the current time. diff --git a/usr/src/contrib/ast/src/lib/libast/man/tv.3 b/usr/src/contrib/ast/src/lib/libast/man/tv.3 deleted file mode 100644 index b90a5593fc..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/tv.3 +++ /dev/null @@ -1,173 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH TM 3 -.SH NAME -tv \- high resolution time support -.SH SYNOPSIS -.L "#include <tv.h>" -.SH DESCRIPTION -The -.I tv -library supports high resolution -.B Tv_t -time specifications. -.SS Tv_t -contains these elements: -.TP -.L unsigned -.L _ast_int4_t -.L tv_sec -Seconds since the epoch. -.TP -.L unsigned -.L _ast_int4_t -.L tv_nsec -Nanosecond resolution. -.PP -In practice resolution is much coarser than 1 nanosecond. -Systems that only support 1 second resolution always set -.L tv_nsec -to 0. -.SS "int tvgettime(Tv_t* tv)" -Sets -.L tv -to the current time. -.L 0 -is returned on success, -.L -1 -on error. -.SS "int tvsettime(const Tv_t* tv)" -Sets the system time to -.LR tv . -The caller must have sufficient privilege. -.L 0 -is returned on success, -.L -1 -on error. -.SS "int tvcmp(const Tv_t* av, const Tv_t* bv)" -Compares the times -.L av -and -.L bv -and returns -.L -1 -if -.L av -is less than -.LR bv , -.L 0 -if -.L av -is equal to -.LR bv , -and -.L 1 -if -.L av -is greater than -.LR bv . -.SS "time_t tvgetatime(Tv_t* tv, const struct stat* st)" -.SS "time_t tvgetmtime(Tv_t* tv, const struct stat* st)" -.SS "time_t tvgetctime(Tv_t* tv, const struct stat* st)" -These macros set -.L tv -to the -.L st -the access, modify, or change time, respectively. -The seconds portion of -.L tv -is returned. -.SS "time_t tvsetatime(Tv_t* tv, struct stat* st)" -.SS "time_t tvsetmtime(Tv_t* tv, struct stat* st)" -.SS "time_t tvsetctime(Tv_t* tv, struct stat* st)" -These macros set the -.L st -access, modify, or change time, respectively, to -.LR tv . -The seconds portion of -.L tv -is returned. -.SS "int tvtouch(const char* path, const Tv_t* av, const Tv_t* mv, const Tv_t* cv, int copy)" -Sets the file -.L path -access time from -.LR av , -modify time from -.LR mv , -and change time from -.LR cv . -Any of -.LR av , -.LR mv , -and -.L cv -may be 0; the corresponding file time will retain the previous value if -.L path -exists and -.L copy -is -.L 1 ; -otherwise the corresponding file time will be set to the current time. -.L 0 -is returned on success, -.L -1 -on error. -.SS "int tvsleep(const Tv_t* tv, Tv_t* rv)" -Pauses execution for -.L tv -time. -.L 0 -is returned if the full -.L tv -amount has expired. -Otherwise -.L -1 -is returned and -.LR rv , -if not 0, is set to the sleep time remaining. -.SH "RETURN VALUE" -Except for -.LR tvcmp() , -an error return of -.L -1 -also sets -.L errno -to the corresponding error code. -.SH "SEE ALSO" -tm(3) diff --git a/usr/src/contrib/ast/src/lib/libast/man/vecargs.3 b/usr/src/contrib/ast/src/lib/libast/man/vecargs.3 deleted file mode 100644 index 29e492baf5..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/vecargs.3 +++ /dev/null @@ -1,126 +0,0 @@ -.fp 5 CW -.de Af -.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2 -.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -.. -.de aF -.ie \\$3 .ft \\$1 -.el \{\ -.ds ;G \& -.nr ;G \\n(.f -.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" -\\*(;G -.ft \\n(;G \} -.. -.de L -.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de LR -.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de RL -.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" -.. -.de EX \" start example -.ta 1i 2i 3i 4i 5i 6i -.PP -.RS -.PD 0 -.ft 5 -.nf -.. -.de EE \" end example -.fi -.ft -.PD -.RE -.PP -.. -.TH VECARGS 3 -.SH NAME -vecargs \- command argument vector insertion routines -.SH SYNOPSIS -.L "#include <vecargs.h>" -.sp -.L "char** vecload(char* string);" -.L "char** vecfile(const char* path);" -.L "char** vecstring(const char* string);" -.L "void vecfree(char**, int);" -.L "int vecargs(char** vec, int* argcp, char*** argvp);" -.SH DESCRIPTION -.L vecload -loads a string vector from lines in -.LR string . -.L string -may be modified upon return. -Each line in -.L string -is treated as a new vector element. -Lines with -.L # -as the first character are comments. -.I \enewline -joins consecutive lines. -A string vector pointer is returned, 0 on error. -.PP -.L vecfile -constructs a string vector by calling -.L vecload -on the contents of the file named by -.LR path . -The string vector pointer is returned, 0 on error. -.PP -.L vecstring -constructs a string vector by calling -.L vecload -on a copy of -.LR string . -The string vector pointer is returned, 0 on error. -.PP -.L vecfree -frees a string vector allocated by -.LR vecfile , -.L vecload -or -.LR vecstring . -.PP -.L vecargs -inserts the string vector -.L vec -(as returned by -.LR vecfile , -.L vecload -or -.LR vecstring ) -between -.L "(*argvp)[0]" -and -.LR "(*argvp)[1]" , -sliding -.L "(*argvp)[1] ..." -over. -NULL and empty string args in -.L vec -are not copied. -.L "vecfree(vec)" -is called before the return. -.L \-1 -is returned if the insertion failed. -.SH EXAMPLES -.L vecargs -is commonly used to modify command -.L argv -from fixed files. -For example, -.IR make (1) -checks for the files -.L ./Makeargs -and -.L ./makeargs -to modify its arguments on startup. -Its a handy way to override default options on a directory by directory basis -without modify the standard control files -(\f5Makefile\fP in this case.) -.SH CAVEATS -This paradigm is not recommended for all commands; only a few exceptions -make sense. diff --git a/usr/src/contrib/ast/src/lib/libast/man/vmalloc.3 b/usr/src/contrib/ast/src/lib/libast/man/vmalloc.3 deleted file mode 100644 index 253e283e37..0000000000 --- a/usr/src/contrib/ast/src/lib/libast/man/vmalloc.3 +++ /dev/null @@ -1,658 +0,0 @@ -.fp 5 CW -.de MW -\f5\\$1\fP -.. -.TH VMALLOC 3 "1 May 1998" -.SH NAME -vmalloc \- virtual memory allocation -.SH SYNOPSIS -.MW "#include <vmalloc.h>" -.SS Regions -.nf -.MW "Vmalloc_t* vmopen(Vmdisc_t* disc, Vmethod_t* meth, int flags);" -.MW "int vmclose(Vmalloc_t*);" -.MW "int vmclear(Vmalloc_t*);" -.MW "int vmcompact(Vmalloc_t* region);" -.MW "int vmset(Vmalloc_t* region, int flags, int type);" -.MW "Vmalloc_t* Vmheap;" -.MW "Vmdisc_t* vmdisc(Vmalloc_t* region, Vmdisc_t* disc);" -.MW "Vmalloc_t* vmmopen(char* file, int project, ssize_t size);" -.MW "Void_t* vmmvalue(Vmalloc_t* vm, int key, Void_t* value, int op);" -.MW "Void_t* vmmcleanup(Vmalloc_t* vm);" -.MW "Void_t* vmmaddress(size_t size);" -.fi -.SS "Allocation functions" -.nf -.MW "Void_t* vmalloc(Vmalloc_t* region, size_t size);" -.MW "Void_t* vmalign(Vmalloc_t* region, size_t size, size_t align);" -.MW "Void_t* vmresize(Vmalloc_t* region, Void_t* addr, size_t size, int type);" -.MW "int vmfree(Vmalloc_t* region, Void_t* addr);" -.MW "Void_t* vmnewof(Vmalloc_t* region, Void_t* addr, type, size_t n, size_t x);" -.MW "Void_t* vmoldof(Vmalloc_t* region, Void_t* addr, type, size_t n, size_t x);" -.MW "Void_t* vmgetmem(Vmalloc_t* region, Void_t* addr, size_t size);" -.fi -.SS "Debugging" -.nf -.MW "int vmdebug(int);" -.MW "int vmdbcheck(Vmalloc_t* vm);" -.MW "int vmdbwatch(Void_t* addr);" -.MW "static void vmdbwarn(Vmalloc_t*, char* mesg, int n);" -.fi -.SS "Profiling" -.nf -.MW "void vmprofile(Vmalloc_t* vm, int fd);" -.fi -.SS "Information and statistics" -.nf -.MW "int vmbusy(Vmalloc_t* region);" -.MW "Vmalloc_t* vmregion(Void_t* addr);" -.MW "Void_t* vmsegment(Vmalloc_t* region, Void_t* addr);" -.MW "int vmwalk(Vmalloc_t* region, int(*walkf)(Vmalloc_t*, Void_t*, size_t, Vmdisc_t*);" -.MW "long vmaddr(Vmalloc_t* region, Void_t* addr);" -.MW "long vmsize(Vmalloc_t* region, Void_t* addr);" -.MW "int vmstat(Vmalloc_t* vm, Vmstat_t* statb);" -.MW "int vmtrace(int fd);" -.MW "int vmtrbusy(Vmalloc_t* vm);" -.MW "Void_t* vmdata(Vmalloc_t* vm);" -.fi -.SS "Malloc-compatible functions" -.nf -.MW "Void_t* malloc(size_t size);" -.MW "Void_t* realloc(Void_t* addr, size_t size);" -.MW "Void_t* calloc(size_t n_obj, size_t s_obj);" -.MW "int cfree(Void_t* addr);" -.MW "void free(Void_t* addr);" -.MW "Void_t* memalign(size_t align, size_t size);" -.MW "Void_t* valloc(size_t size);" -.MW "int setregmax(int regmax);" -.fi -.SH DESCRIPTION -These functions for dynamic storage allocation work in -\fIregions\fP of memory. -Each region has an \fIallocation method\fP -for parceling out blocks of storage and a -\fImemory discipline\fP for obtaining raw space. -Automatic locking prevents interference by reentrant -access to a region. -.PP -Pointers to space have type \f5Void_t*\fP -where \f5Void_t\fP is \f5#define\fPd as \f5void\fP if possible, otherwise \f5char\fP. -Space is counted in type \f5size_t\fP. - -.ne 4 -.SS Regions -Regions have type \f5Vmalloc_t\fP. -Two predefined regions are pointed to by: -.TP -.MW Vmheap -A general-purpose region, with best-fit -allocation, and system memory discipline \f5Vmdcsystem\fP. -.PP -These functions manipulate regions: -.PP -.I vmopen -creates a region with memory discipline \fIdisc\fP, -allocation method \fImeth\fP, -and a setting for control \fIflags\fP. -It returns a pointer to the region on success and \f5NULL\fP on failure. -The flags, represented by bit values or-ed together, are: -.TP -.MW VM_SHARE -This region may be accessed concurrently by multiple threads or processes. -.TP -.MW VM_TRACE -Place tracing messages for each allocation event -on the tracing file established by \fIvmtrace\fP. -.TP -\f5VM_DBCHECK\fP, \f5VM_DBABORT\fP -.br -See \fBDebugging\fP below. -.PP -.I vmclose -closes a \fIregion\fP and releases all associated memory -according to the region's discipline. -The first segment obtained from the discipline's -\f5memoryf\fP function (see `Disciplines' below) will be the last released. -\fIvmclose\fP returns \-1 on failure and a non-negative value otherwise. -.PP -.I vmclear -frees all allocated blocks in \fIregion\fP regardless of methods. -It returns \-1 on failure and a non-negative value otherwise. -.PP -.I vmcompact -releases as much of a \fIregion\fP's -free space to its discipline's \f5memoryf\fP -function as possible. -It returns a nonnegative value on success and \-1 on failure. -.PP -.I vmset -adjusts and queries a \fIregion\fP's \fIflags\fP. -The indicated flags are turned on if \fItype\fP is nonzero, off if zero. -\fIvmset\fP returns the previous value of all flags. -Thus, \f5vmset(region,0,0)\fP queries the flags without changing them. -In addition to the settable flags, one of -\f5VM_MTBEST\fP, \f5VM_MTDEBUG\fP, \f5VM_MTPROFILE\fP, -\f5VM_MTPOOL\fP, or \f5VM_MTLAST\fP -is returned to indicate the method used in creating the \fIregion\fP. -.PP -.I vmdisc -changes the discipline of \fIregion\fP to the given new discipline -\fIdisc\fP if \fIdisc\fP is not \f5NULL\fP and its \f5memoryf\fP function -is the same as the current discipline. If the current discipline -has an \f5exceptf\fP function, it will be called with event \f5VM_DISC\fP. -This function always returns the current discipline. -.PP -.I vmmopen -creates a region to allocate memory obtained via either -\fImmap(2)\fP when \fIproject < 0\fP or \fIshmget(2)\fP when \fIproject >= 0\fP. -The region is built from a single memory segment -guaranteed to be at least as large as \fIsize\fP. -When \fIproject >= 0\fP, -\fIfile\fP and \fIproject\fP are used in a call to \fIftok(3)\fP -to get a key suitable for getting a shared memory segment via \fIshmget(2)\fP. -Otherwise, \fIfile\fP is the backing store for the mapped data. -In this case, not only the region may be used concurrently by different processes, -it is also persistent. That is, process could even exit, move the file to -a different but similar machine then restart and open the same -region to continue working. -.PP -Note that Vmalloc can protect concurrent accesses only on region entry and exit -for memory allocation operations. -This means that at the time when regions are being opened or closed, there will be no -protection for the memory segments being attached into or detached from process memory space. -This limitation has a special impact on \fIvmmopen()\fP as follows. -.PP -A shared memory segment opened via \fIvmmopen()\fP corresponds uniquely -to a combination of the \fIfile\fP and \fIproject\fP parameters. -Thus, if multiple \fIvmmopen()\fP calls are done in the same process using a -same combination of \fIfile\fP and \fIproject\fP, -the joined behavior of such regions will be unpredictable when opening and closing -are done concurrently with other memory allocation operations. -Beware that this effect can be subtle with library functions that may attempt -to create their own memory allocation regions. -.PP -.I vmmvalue -manages pairs of \fIkey\fP and \fIvalue\fP in a region opened via \fIvmopen()\fP. -If \fIop\fP is \f5VM_MMGET\fP, the value associated with \f5key\fP is returned. -If \fIop\fP is \f5VM_MMSET\fP, the value associated with \f5key\fP will be -set to \fIvalue\fP. -If \fIop\fP is \f5VM_MMADD\fP, the value associated with \f5key\fP will be -treated as a signed long value to which \f5val\fP (also treated as a signed long value) -will be added. -The call always returns the updated data value associated with \fIkey\fP. -.PP -.I vmmcleanup -sets region up to remove backing store or \fIshmid\fP on closing. -.PP -.I vmmaddress -computes an address suitable for attaching a shared memory segment or -memory mapping a segment of file data of the given \fIsize\fP. -The address is chosen with hope to minimize collision with other activities -related to memory such as growth of stack space or space used -for dynamically linked libraries, etc. - -.SS "Allocation functions" -.I vmalloc -returns a pointer to a block of the requested \fIsize\fP -in a \fIregion\fP, aligned to the \fIstrictest alignment\fP -that is suitable for the needs of any basic data type. -It returns \f5NULL\fP on failure. -.PP -.I vmalign -works like \fIvmalloc\fP, but returns a block aligned to a common -multiple of \fIalign\fP and the \fIstrictest alignment\fP. -.PP -.I vmresize -attempts to change the length of the block pointed to by -\fIaddr\fP to the specified \fIsize\fP. -If that is impossible and \fItype\fP has -at least one of \f5VM_RSMOVE\fP and \f5VM_RSCOPY\fP, -a new block is allocated and the old block is freed. -The bit \f5VM_RSCOPY\fP also causes -the new block to be initialized with -as much of the old contents as will fit. -When a resized block gets larger, the new space will be cleared -if \fItype\fP has the bit \f5VM_RSZERO\fP. -\fIvmresize\fP -returns a pointer to the final block, or \f5NULL\fP on failure. -If \fIaddr\fP is \f5NULL\fP, \fIvmresize\fP behaves like \fIvmalloc\fP; -otherwise, if \fIsize\fP is 0, it behaves like \fIvmfree\fP. -.PP -.I vmfree -makes the currently allocated block pointed to by -\fIaddr\fP available for future allocations in its \fIregion\fP. -If \fIaddr\fP is \f5NULL\fP, \fIvmfree\fP does nothing. -It returns \-1 on error, and nonnegative otherwise. -.PP -.I vmnewof -is a macro function that attempts to change the length of -the block pointed to by \fIaddr\fP to the size \f5n*sizeof(type)+x\fP. -If the block is moved, new space will be initialized with as much of the -old content as will fit. -Additional space will be set to zero. -.PP -.I vmoldof -is similar to \fIvmnewof\fP but it neither copies data nor clears space. -.PP -.I vmgetmem -provides a handy function to creat/close regions and allocate/free memory -based on chunks of memory obtained from the heap region \fIVmheap\fP. -.TP -.MW "vmgetmem(0,0,0)" -This call opens a new region. -.TP -.MW "vmgetmem(region, 0, 0)" -This call closes the given \f5region\fP. -.TP -.MW "vmgetmem(region,0,n)" -This call allocates a block of length \f5n\fP and clears it to zeros. -.TP -.MW "vmgetmem(region,p,0)" -This call frees the block \f5p\fP. -.TP -.MW "vmgetmem(region,p,n)" -This call resizes the block \f5p\fP to length \f5n\fP -and clears the new memory to zeros if the block grows. -The block may be moved as deemed necessary by the allocator. -.PP -.SS "Memory disciplines" -Memory disciplines have type \f5Vmdisc_t\fP, -a structure with these members: -.in +.5i -.nf -.MW "Void_t* (*memoryf)(Vmalloc_t *region, Void_t* obj," -.ti +.5i -.MW "size_t csz, size_t nsz, Vmdisc_t *disc);" -.MW "int (*exceptf)(Vmalloc_t *region, int type, Void_t* obj, Vmdisc_t *disc);" -.MW "int round;" -.fi -.in -.5i -.TP -.MW round -If this value is positive, all size arguments to the -\f5memoryf\fP function will be multiples of it. -.TP -.MW memoryf -Points to a function to get or release segments of space for the -\fIregion\fP. -.TP -.MW exceptf -If this pointer is not \f5NULL\fP, -the function it points to is called to announce -events in a \fIregion\fP. -.PP -There are two standard disciplines, both with \f5round\fP being 0 and \f5exceptf\fP being \f5NULL\fP. -.TP -.MW Vmdcsystem -A discipline whose \f5memoryf\fP function gets space from the operation system -via different available methods which include \fImmap(2)\fP, \fIsbrk(2)\fP and -functions from the WIN32 API. -For historical reason, \fIVmdcsbrk\fP is also available and functions like \fIVmdcsystem\fP. -.TP -.MW Vmdcheap -A discipline whose \f5memoryf\fP function gets space from the region \f5Vmheap\fP. -A region with \f5Vmdcheap\fP discipline and \f5Vmlast\fP -allocation is good for building throwaway data structures. -.PP -A \fImemoryf\fP -function returns a pointer to a memory segment on success, and \f5NULL\fP on failure. -When \fInsz >= 0\fP and \fIcsz > 0\fP, -the function first attempts to change the current segment \fIaddr\fP to fit \fInsz\fP -(for example, \fInsz == 0\fP means deleting the segment \fIaddr\fP). -If this attempt is successful, it should return \fIaddr\fP. -Otherwise, if \fInsz > csz\fP, the function may try to allocate a new segment -of size \fInsz-csz\fP. If successful, it should return the address of the new segment. -In all other cases, it should return NULL. -.PP -An \fIexceptf\fP -function is called for events identified by \fItype\fP, which is coded thus: -.TP -.MW VM_OPEN -This event is raised at the start of the process to open a new region. -Argument \fIobj\fP will be a pointer to an object of type \f5Void_t*\fP -initialized to NULL before the call. The return value of \fIexceptf\fP -is significant as follows: - -On a negative return value, \fIvmopen\fP will terminate with failure. - -On a zero return value, \fIexceptf\fP may set \f5*((Void_t**)obj)\fP -to some non-NULL value to tell \fIvmopen\fP -to allocate the region handle itself via \fImemoryf\fP. Otherwise, -the region handle will be allocated from the \f5Vmheap\fP region. - -On a positive return value, -the new region is being reconstructed -based on existing states of some previous region. -In this case, \fIexceptf\fP should set \f5*(Void_t**)\fP\fIobj\fP to point to -the field \f5Vmalloc_t.data\fP of the corresponding previous region -(see \f5VM_CLOSE\fP below). -If the handle of the previous region was allocated -via \fImemoryf\fP as discussed above in the case of the zero return value, -then it will be exactly restored. Otherwise, a new handle will be allocated from \f5Vmheap\fP. -The ability to create regions sharing the same states allows for -managing shared and/or persistent memory. -.TP -.MW VM_ENDOPEN -This event is raised at the end of the process to open a new region. -The return value of \fIexceptf\fP will be ignored. -.TP -.MW VM_CLOSE -This event is raised at the start of the process to close a region, -The return value of \fIexceptf\fP is significant as follows: - -On a negative return value, \fIvmclose\fP immediately returns with failure. - -On a zero return value, \fIvmclose\fP proceeds normally by calling \f5memoryf\fP to free -all allocated memory segments and also freeing the region itself. - -On a positive return value, \fIvmclose\fP will only free the region -without deallocating the associated memory segments. That is, -the field \fIVmalloc_t.data\fP of the region handle remains intact. -This is useful for managing shared and/or persistent memory (see \f5VM_OPEN\fP above). -.TP -.MW VM_ENDCLOSE -This event is raised at the end of the process to close a region. -The return value of \fIexceptf\fP will be ignored. -.TP -.MW VM_NOMEM -An attempt to extend the region by the amount -\f5(size_t)\fP\fIobj\fP failed. The region is unlocked, so the -\fIexceptf\fP function may free blocks. -If the function returns a positive value the memory -request will be repeated. -.TP -.MW VM_DISC -The discipline structure is being changed. - -.SS "Allocation methods" -Methods are of type \f5Vmethod_t*\fP. -.TP -.MW Vmbest -An approximately best-fit allocation strategy. -.TP -.MW Vmlast -A strategy for building structures that are only deleted in whole. -Only the latest allocated block can be freed. -This means that as soon as a block \f5a\fP is allocated, -\fIvmfree\fP calls on blocks other than \c5a\fP are ignored. -.TP -.MW Vmpool -A strategy for blocks of one size, -set by the first \fIvmalloc\fP call after \fIvmopen\fP or \fIvmclear\fP. -.TP -.MW Vmdebug -An allocation strategy with extra-stringent checking and locking. -It is useful for finding misuses of dynamically allocated -memory, such as writing beyond the boundary of a block, or -freeing a block twice. -.ne 3 -.TP -.MW Vmprofile -An allocation method that records and prints summaries of memory usage. - -.SS Debugging -The method \f5Vmdebug\fP is used to debug common memory violation problems. -When a problem is found, -a warning message is written to file descriptor 2 (standard error). -In addition, if flag \f5VM_DBABORT\fP is on, -the program is terminated by calling \fIabort\fP(2). -Each message is a line of self-explanatory fields separated by colons. -The optional flag \f5-DVMFL\fP, if used during compilation, -enables recording of file names and line numbers. -The following functions work with method \f5Vmdebug\fP. -.PP -.I vmdebug -resets the file descriptor to write out warnings to the given argument. -By default, this file descriptor is 2, the standard error. -\fIvmdebug\fP returns the previous file descriptor. -.PP -.I vmdbcheck -checks a region using \f5Vmdebug\fP or \f5Vmbest\fP for integrity. -If \f5Vmdebug\fP, this also checks for block overwriting errors. -On errors, \fIvmdbwarn\fP is called. -If flag \f5VM_DBCHECK\fP is on, -\fIvmdbcheck\fP is called at each invocation of -\fIvmalloc\fP, \fIvmfree\fP, or \fIvmresize\fP. -.PP -.I vmdbwatch -causes address \fIaddr\fP -to be watched, and reported whenever met in -\fIvmalloc\fP, \fIvmresize\fP or \fIvmfree\fP. -The watch list has finite size and if it becomes full, -watches will be removed in a first-in-first-out fashion. -If \fIaddr\fP is \f5NULL\fP, -all current watches are canceled. -\fIvmdbwatch\fP returns the watch bumped out due to an insertion -into a full list or \f5NULL\fP otherwise. -.PP -.I vmdbwarn -is an internal function that processes -warning messages for discovered errors. -It can't be called from outside the \fIvmalloc\fP package, -but is a good place to plant debugger traps because -control goes there at every trouble. - -.SS "Profiling" -The method \f5Vmprofile\fP is used to profile memory usage. -Profiling data are maintained in private memory of a process so -\f5Vmprofile\fP should be avoided from regions manipulating -persistent or shared memory. -The optional flag \f5-DVMFL\fP, if used during compilation, -enables recording of file names and line numbers. -.PP -.I vmprofile -prints memory usage summary. -The summary is restricted to region \fIvm\fP if \fIvm\fP is not \f5NULL\fP; -otherwise, it is for all regions created with \f5Vmprofile\fP. -Summary records are written to file descriptor \fIfd\fP as lines with -colon-separated fields. Here are some of the fields: -.TP -.I n_alloc,n_free: -Number of allocation and free calls respectively. Note that a resize -operation is coded as a free and an allocation. -.TP -.I s_alloc,s_free: -Total amounts allocated and freed. The difference between these numbers -is the amount of space not yet freed. -.TP -.I max_busy, extent: -These fields are only with the summary record for region. -They show the maximum busy space at any time and the extent of the region. - -.SS "Information and statistics" -.I vmbusy -returns the busy status of a region. -A region is busy if some allocation operation is accessing it. -.PP -.I vmregion -returns the region to which the block pointed to by -\fIaddr\fP belongs. -This works only in regions that allocate with -\f5Vmbest\fP, \f5Vmdebug\fP or \f5Vmprofile\fP. -.PP -.I vmsegment -finds if some segment of memory in \fIregion\fP -contains the address \fIaddr\fP. -It returns the address of a found segment or \f5NULL\fP if none found. -.PP -.I vmwalk -walks all segments in \fIregion\fP or if \fIregion\fP is \f5NULL\fP, -all segments in all regions. -At each segment, \fI(*walkf)(vm,addr,size,disc)\fP -is called where \fIvm\fP is the region, \fIaddr\fP is the segment, -\fIsize\fP is the size of the segment, and \fIdisc\fP is the region's discipline. -If \fIwalkf\fP returns a negative value, the walk stops and returns the same value. -On success, \fIvmwalk\fP returns 0; otherwise, it returns \-1. -.PP -.I vmaddr -checks whether \fIaddr\fP -points to an address within some allocated block of the given region. -If not, it returns \-1. -If so, it returns the offset from the beginning of the block. -The function does not work for a \f5Vmlast\fP region except -on the latest allocated block. -.PP -.I vmsize -returns the size of the allocated block pointed to by \fIaddr\fP. -It returns \-1 if \fIaddr\fP -does not point to a valid block in the region. -Sizes may be padded beyond that requested; in -particular no block has size 0. -The function does not work for a \f5Vmlast\fP region except -on the latest allocated block. -.PP -.I vmstat -gathers statistics on the given \fIregion\fP. -If \f5region\fP is NULL, it computes statistics for the \fIMalloc\fP calls. -This may include summing statistics from more than one regions constructed to avoid blocking -due to parallel or asynchronous operations. -If \fIstatb\fP is not NULL, \fIvmstat\fP computes and stores the statistics in \fIstatb\fP then returns 0. -If \fIstatb\fP is NULL, no statistics will be computed and -the returned value is either 1 if the region is busy, i.e., -being accessed by some allocation call or 0 otherwise. - -A \f5Vmstat_t\fP structure has at least these members: -.in +.5i -.nf -.ta \w'\f5size_t \fP'u +\w'\f5extent \fP'u -.MW "int n_busy; /* # of busy blocks */ -.MW "int n_free; /* # of free blocks */ -.MW "size_t s_busy; /* total busy space */ -.MW "size_t s_free; /* total free space */ -.MW "size_t m_busy; /* maximum busy block size */ -.MW "size_t m_free; /* maximum free block size */ -.MW "int n_seg; /* count of segments */ -.MW "size_t extent; /* memory extent of region */ -.MW "int n_region; /* total Malloc regions */ -.MW "int n_open; /* non-blocked operations */ -.MW "int n_lock; /* blocked operations */ -.MW "int n_probe; /* region searches */ -.fi -.in -.5i -.PP -Bookeeping overhead is counted in \f5extent\fP, -but not in \f5s_busy\fP or \f5s_free\fP. -.PP -.I vmtrace -establishes file descriptor \fIfd\fP -as the trace file and returns -the previous value of the trace file descriptor. -The trace descriptor is initially invalid. -Output is sent to the trace file by successful allocation -events when flag \f5VM_TRACE\fP is on. -.PP -Tools for analyzing traces are described in \fImtreplay\fP(1). -The trace record for an allocation event -is a line with colon-separated fields, four numbers and one string. -.TP -.I old -Zero for a fresh allocation; -the address argument for freeing and resizing. -.TP -.I new -Zero for freeing; -the address returned by allocation or resizing. -.TP -.I size -The size argument for allocation or resizing; -the size freed by freeing. -Sizes may differ due to padding for alignment. -.TP -.I region -The address of the affected region. -.TP -.I method -A string that tells the region's method: -\f5best\fP, \f5last\fP, \f5pool\fP, \f5profile\fP, or \f5debug\fP. -.PP -.I vmtrbusy -outputs a trace of all currently busy blocks in region \f5vm\fP. -This only works with the \f5Vmbest\fP, \f5Vmdebug\fP and \f5Vmprofile\fP methods. -.PP -.I vmdata -returns the core data of the given region. -The core data hold the data structures for allocated and free blocks. -Depending on the region discipline, -the core data of a region may be in shared or persistent memory even -if the region pointer created with \fIvmopen\fP is always in private process memory. - -.SS "Malloc-compatible functions" -This set of functions implement \fImalloc\fP(3). -They allocate via the \fIVmregion\fP region which is initially set -to be \fIVmheap\fP. - -Concurrent accesses are supported unless an application -change \fIVmregion\fP to something other than \fIVmheap\fP. -New regions may be created on the fly to avoid blocking. -The maximum number of regions that can be created -this way is set to 64 by default. An application could -reduce this number by calling \fIsetregmax(regmax)\fP to -set the maximum number of these extra regions to \fIregmax\fP. -\fIsetregmax()\fP always returns the previous value. -.PP -These functions are instrumented for run-time debugging, profiling and tracing. -For accurate reporting of files and line numbers, -application code should include \f5vmalloc.h\fP and compile with \f5-DVMFL\fP. -The \fBVMALLOC_OPTIONS\fP environment variable, checked once before the first -memory allocation, controls the memory allocation method, debugging and tracing; -its value is a comma or space separated list of -\fB[no]\fP\fIname\fP\fB[=\fP\fIvalue\fP\fB]\fP options. -The options are: -.TP -.B abort -If Vmregion==Vmdebug then VM_DBABORT is set, otherwise _BLD_DEBUG enabled assertions abort() on failure. -.TP -.B break -Try sbrk() block allocator first. -.TP -.B check -If Vmregion==Vmbest then the region is checked every op. -.TP -.B free -Disable addfreelist(). -.TP -.B keep -Disable free -- if code works with this enabled then it probably accesses freed data. -.TP -.BI method= method -Sets Vmregion=\fImethod\fP if not defined, \fImethod\fP (Vm prefix optional) may be one of { \fBbest debug last profile\fP }. -.TP -.B mmap -Try mmap() block allocator first if -.B break -is not set. -.TP -.BI period= n -Sets Vmregion=Vmdebug if not defined, if Vmregion==Vmdebug the region is checked every \fIn\fP ops. -.TP -.BI profile= file -Sets Vmregion=Vmprofile if not set, if Vmregion==Vmprofile then profile info printed to file \fIfile\fP. -.TP -.BI start= n -Sets Vmregion=Vmdebug if not defined, if Vmregion==Vmdebug region checking starts after \fIn\fP ops. -.TP -.BI trace= file -Enables tracing to file \fIfile\fP. -.TP -.BI warn= file -Sets Vmregion=Vmdebug if not defined, if Vmregion==Vmdebug then warnings printed to file \fIfile\fP. -.TP -.BI watch= address -Sets Vmregion=Vmdebug if not defined, if Vmregion==Vmdebug then \fIaddress\fP is watched. -.P -Output files are created if they don't exist. \fB&\fP\fBn\fP and \fB/dev/fd/\fP\fIn\fP name -the file descriptor \fIn\fP which must be open for writing. The pattern \fB%p\fP -in a file name is replaced by the process ID. -.P -.B VMALLOC_OPTIONS -combines the features of these obsolete environment variables: -{ \fBVMCHECK VMDEBUG VMETHOD VMPROFILE VMTRACE\fP }. - -.SH RECENT CHANGES -\f5Vmlast\fP: allocated blocks are now allowed to be resized (09/1998). - -.SH SEE ALSO -\fImtreplay\fP(1), \fImalloc\fP(3). - -.SH AUTHOR -Kiem-Phong Vo, kpv@research.att.com diff --git a/usr/src/contrib/ast/src/lib/libast/misc/stk.c b/usr/src/contrib/ast/src/lib/libast/misc/stk.c index d937437a9e..56925d8e14 100644 --- a/usr/src/contrib/ast/src/lib/libast/misc/stk.c +++ b/usr/src/contrib/ast/src/lib/libast/misc/stk.c @@ -331,9 +331,9 @@ int stkon(register Sfio_t * stream, register char* loc) } /* * reset the bottom of the current stack back to <loc> - * if <loc> is not in this stack, then the stack is reset to the beginning + * if <loc> is null, then the stack is reset to the beginning + * if <loc> is not in this stack, the program dumps core * otherwise, the top of the stack is set to stkbot+<offset> - * */ char *stkset(register Sfio_t * stream, register char* loc, size_t offset) { @@ -377,6 +377,9 @@ char *stkset(register Sfio_t * stream, register char* loc, size_t offset) break; frames++; } + /* not found: produce a useful stack trace now instead of a useless one later */ + if(loc) + abort(); /* set stack back to the beginning */ cp = (char*)(fp+1); if(frames) @@ -503,7 +506,7 @@ static char *stkgrow(register Sfio_t *stream, size_t size) register char *cp, *dp=0; register size_t m = stktell(stream); size_t endoff; - char *end=0; + char *end=0, *oldbase=0; int nn=0,add=1; n += (m + sizeof(struct frame)+1); if(sp->stkflags&STK_SMALL) @@ -519,6 +522,7 @@ static char *stkgrow(register Sfio_t *stream, size_t size) dp=sp->stkbase; sp->stkbase = ((struct frame*)dp)->prev; end = fp->end; + oldbase = dp; } endoff = end - dp; cp = newof(dp, char, n, nn*sizeof(char*)); @@ -545,10 +549,10 @@ static char *stkgrow(register Sfio_t *stream, size_t size) if(fp->nalias=nn) { fp->aliases = (char**)fp->end; - if(end && nn>1) - memmove(fp->aliases,end,(nn-1)*sizeof(char*)); + if(end && nn>add) + memmove(fp->aliases,end,(nn-add)*sizeof(char*)); if(add) - fp->aliases[nn-1] = dp + roundof(sizeof(struct frame),STK_ALIGN); + fp->aliases[nn-1] = oldbase + roundof(sizeof(struct frame),STK_ALIGN); } if(m && !dp) { |