1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
include "sbuf.h"
#---------------------------------------------------------------------------
.help sbuf Mar93 source
.ih
NAME
.nf
sb_open -- Open an sbuf.
sb_cat -- Add a string to the end of sbuf.
sb_close -- Close an sbuf.
sb_string -- Get the string to an sbuf.
.fi
.ih
USAGE
.nf
sb = sb_open()
call sb_cat (sb, str)
call sb_close (sb)
str_ptr = sb_string (sb)
.fi
.ih
ARGUMENTS
.ls sb (pointer :input/output)
The string buffer descriptor.
.le
.ls str (char[ARB] :input)
The string to append to the string buffer.
.le
.ls str_ptr (pointer :output)
A pointer to a string array containing the contents of the string buffer.
When done, the user is required to deallocate this memory using the call
"call mfree (str_ptr, TY_CHAR)".
.le
.ih
DISCUSSION
This interface allows one to handle arbitrarily long strings without
having to worry about the memory management.
There may be other utility routines to add; feel free to do so.
.endhelp
#---------------------------------------------------------------------------
pointer procedure sb_open
pointer sb # The sbuf pointer
errchk malloc
begin
call malloc (sb, SB_SZ_SB, TY_STRUCT)
call malloc (SB_PTR(sb), SZ_LINE, TY_CHAR)
SB_LEN(sb) = 0
SB_MAXLEN(sb) = SZ_LINE
return (sb)
end
#---------------------------------------------------------------------------
# End of sb_open
#---------------------------------------------------------------------------
procedure sb_close (sb)
pointer sb # IO: The sbuf descriptor, NULL on exit.
errchk mfree
begin
if (sb != NULL) {
call mfree (SB_PTR(sb), TY_CHAR)
call mfree (sb, TY_STRUCT)
}
end
#---------------------------------------------------------------------------
# End of sb_close
#---------------------------------------------------------------------------
pointer procedure sb_string (sb)
pointer sb # I: The sbuf descriptor.
pointer str # New string pointer.
begin
call malloc (str, SB_LEN(sb), TY_CHAR)
call strcpy (SB_BUF(sb,0), Memc[str], SB_LEN(sb))
return (str)
end
#---------------------------------------------------------------------------
# End of sb_string
#---------------------------------------------------------------------------
procedure sb_cat (sb, str)
pointer sb # I: The sbuf descriptor.
char str[ARB] # I: The string to concatenate.
int i, strlen() # Length of input string.
errchk realloc
begin
i = strlen (str)
if (i + SB_LEN(sb) >= SB_MAXLEN(sb)) {
SB_MAXLEN(sb) = SB_MAXLEN(sb) + i + SZ_LINE
call realloc (SB_PTR(sb), SB_MAXLEN(sb), TY_CHAR)
}
call strcpy (str, SB_BUF(sb,SB_LEN(sb)), i)
SB_LEN(sb) = SB_LEN(sb) + i
end
#---------------------------------------------------------------------------
# End of sb_cat
#---------------------------------------------------------------------------
|