|
|
1.1 root 1: .TH STAK 3
2: .SH NAME
3: \fBstak\fR \- data stack storage library
4: .SH SYNOPSIS
5: .ta .75i 1.5i 2.25i 3i 3.75i 4.5i 5.25i 6i
6: .PP
7: .nf
8: \f5
9: #include <stak.h>
10:
11: Stak_t *stakcreate(int \fIflags\fP);
12: Stak_t *stakinstall(Stak_t *\fIstack\fP, char *(\fIoverflow\fP)(int));
13: int stakdelete(Stak_t *\fIstack\fP);
14: void staklink(Stak_t *\fIstack\fP)
15:
16: char *stakalloc(unsigned \fIsize\fP);
17: char *stakcopy(const char *\fIstring\fP);
18: char *stakset(char *\fIaddress\fP, unsigned \fIoffset\fP);
19:
20: char *stakseek(unsigned \fIoffset\fP);
21: int stakputc(int \fIc\fP);
22: int stakputs(const char *\fIstring\fP);
23: int staktell(void);
24: char *stakptr(unsigned \fIoffset\fP);
25: char *stakfreeze(unsigned \fIextra\fP);
26: \fR
27: .fi
28: .SH DESCRIPTION
29: .PP
30: \f5stak\fP is a package of routines designed to provide efficient
31: stack oriented dynamic storage.
32: A stack abstraction consists of an ordered list of contiguous
33: memory regions, called stack frames, that can hold objects of
34: arbitrary size.
35: A stack is represented by the type \f5Stak_t\fP
36: defined in header \f5<stak.h>\fP.
37: At any instant there is one active stack.
38: Variable size objects can be
39: added to the active stack
40: and programs can reference these objects directly with pointers.
41: In addition, the last object on the stack
42: (referred to here as the current object)
43: can be built incrementally.
44: The current object has an associated offset that determines its
45: current size.
46: While the current object is being built incrementally,
47: its location might
48: change so that it is necessary to reference the object with
49: relative offsets ranging from zero to the current offset of the object.
50: .PP
51: There is a preset initial active stack.
52: To use an additional stack, it is necessary to create it and to
53: install it as the active stack.
54: A stack is created with the \f5stakcreate\fP() function.
55: A \fIflags\fP argument of \f5STAK_SMALL\fP indicates that unused
56: space on the stack should be freed whenever this stack ceases
57: to be the active stack.
58: If successful,
59: \f5stakcreate\fP() returns a pointer to a stack whose reference
60: count is 1.
61: Otherwise, \f5stakcreate\fP() returns a null pointer.
62: The \f5staklink\fP() function increases the reference count for the
63: given \fIstack\fP.
64: The \f5stakinstall\fP() function
65: makes the specified \fIstack\fP the active stack and returns a pointer
66: to the previous active stack.
67: When the \fIoverflow\fP argument is not null,
68: it specifies a function that will
69: be called whenever \f5malloc\fP(3) fails while trying to grow the
70: stack.
71: The \fIoverflow\fP function will be called with the size that was passed
72: to \f5malloc\fP(3).
73: The \fIoverflow\fP function can call \f5exit\fP(3), call \f5longjmp\fP(3)
74: or return.
75: If the \f5overflow\fP function returns,
76: it must return a pointer to a memory region of the given size.
77: The default action is to write an error to standard error and to
78: call \f5exit\fP(2) with a non-zero exit value.
79: When \fIstack\fP is a null pointer,
80: the active stack is not changed
81: but the \fIoverflow\fP function for the active stack can be changed
82: and a pointer to the active stack is returned.
83: The \f5stakdelete\fP() function decrements the reference count and
84: frees the memory associated with
85: the specified stack
86: when the reference count is zero.
87: The effect of subsequent references to objects
88: on the stack are undefined.
89: .PP
90: The
91: \f5stakalloc\fP() function returns an aligned pointer to space on the
92: active stack that can be used to hold any object of the given \fIsize\fP.
93: \f5stakalloc\fP() is similar to \f5malloc\fP(3) except that individual
94: items returned by \f5stakalloc\fP() can not be freed.
95: \f5stakalloc\fP() causes the offset of the current object to be set to
96: zero.
97: .PP
98: The
99: \f5stakcopy\fP() function copies the given string onto the stack
100: and returns a pointer to the \fIstring\fP on the stack.
101: \f5stakcopy\fP() causes the offset of the current object to be set to
102: zero.
103: .PP
104: The \f5stakset\fP() function finds the frame containing the given
105: \fIaddress\fP, frees all frames that were created after the one containing
106: the given \fIaddress\fP, and sets the current object to the given
107: \fIaddress\fP.
108: The top of the current object is set to \fIoffset\fP bytes from
109: current object.
110: If \fIaddress\fP is not the address of an object on the
111: stack the result is undefined.
112: .PP
113: The remaining functions are used to build the current object incrementally.
114: An object that is built incrementally on the stack will
115: always occupy contiguous memory within a stack frame but
116: until \f5stakfreeze\fP() is called,
117: the location in memory for the object can change.
118: There is a current offset associated with the current object that
119: determines where subsequent operations apply.
120: Initially, this offset is zero, and the offset changes as a result
121: of the operations you specify.
122: The \f5stakseek\fP() function is used set the offset for the
123: current object.
124: The \fIoffset\fP argument to \f5stakseek\fP() specifies the new
125: offset for the current object.
126: The frame will be extended or moved
127: if \f5offset\fP causes the new current offset to extend beyond the
128: current frame.
129: \f5stakseek\fP() returns a pointer to the beginning of the current object.
130: The \f5staktell\fP() function gives the offset of the current object.
131: .PP
132: The \f5stakputc\fP() function adds a given character to the current object
133: on the stack.
134: The current offset is advanced by 1.
135: The \f5stakputs\fP() appends the given \fIstring\fP onto the current
136: object in the stack and returns the length of the string.
137: The current offset is advanced by the length of the string.
138: .PP
139: The \f5stakptr\fP() function converts the given \f5offset\fP
140: for the current object into a memory address on the stack.
141: This address is only valid until another stack operation is given.
142: The result is not defined if \fIoffset\fP exceeds the size of the current
143: object.
144: The \f5stakfreeze\fP()
145: function terminates the current object on the
146: stack and returns a pointer to the beginning of this object.
147: If \fIextra\fP is non-zero, \fIextra\fP bytes are added to the stack
148: before the current object is terminated. The first added byte will
149: contain zero and the contents of the remaining bytes are undefined.
150: .PP
151: .SH HISTORY
152: The
153: \f5stak\fP
154: interface was derived from similar routines in the KornShell code
155: that is used for building parse trees and carrying out expansions.
156: It provides an efficient mechanism for grouping dynamically allocated
157: objects so that they can be freed all at once rather than individually.
158: .SH AUTHOR
159: David Korn
160: .SH SEE ALSO
161: \f5exit(2)\fP
162: \f5longjmp(3)\fP
163: \f5malloc(3)\fP
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.