1 /* sts.c -- Implementation File (module.c template V1.0)
2 Copyright (C) 1995 Free Software Foundation, Inc.
3 Contributed by James Craig Burley.
5 This file is part of GNU Fortran.
7 GNU Fortran is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Fortran is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Fortran; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 None (despite the name, it doesn't really depend on ffest*)
26 Provides an arbitrary-length string facility for the limited needs of
27 GNU Fortran FORMAT statement generation.
39 /* Externals defined here. */
42 /* Simple definitions and enumerations. */
45 /* Internal typedefs. */
48 /* Private include files. */
51 /* Internal structure definitions. */
54 /* Static objects accessed by functions in this module. */
57 /* Static functions (internal). */
60 /* Internal macros. */
63 /* ffests_kill -- Kill a varying-length string
68 The storage associated with the string <s> is freed. */
71 ffests_kill (ffests s
)
74 malloc_kill_ksr (s
->pool_
, s
->text_
, s
->max_
);
77 /* ffests_new -- Make a varying-length string
80 ffests_new(s,malloc_pool_image(),0);
82 The string is initialized to hold, in this case, 0 characters, and
83 current and future heap manipulations to hold the string will use
87 ffests_new (ffests s
, mallocPool pool
, ffestsLength size
)
96 s
->text_
= malloc_new_ksr (pool
, "ffests", size
);
99 /* ffests_printf_1D -- printf("...%ld...",(long)) to a string
102 ffests_printf_1D(s,"...%ld...",1);
104 Like printf, but into a string. */
107 ffests_printf_1D (ffests s
, const char *ctl
, long arg1
)
113 if ((len
= strlen (ctl
) + 21) < ARRAY_SIZE (quickbuf
))
114 /* No # bigger than 20 digits. */
116 sprintf (&quickbuf
[0], ctl
, arg1
);
117 ffests_puttext (s
, &quickbuf
[0], strlen (quickbuf
));
121 buff
= malloc_new_ks (malloc_pool_image (), "ffests_printf_1D", len
);
122 sprintf (buff
, ctl
, arg1
);
123 ffests_puttext (s
, buff
, strlen (buff
));
124 malloc_kill_ks (malloc_pool_image (), buff
, len
);
128 /* ffests_printf_1U -- printf("...%lu...",(unsigned long)) to a string
131 ffests_printf_1U(s,"...%lu...",1);
133 Like printf, but into a string. */
136 ffests_printf_1U (ffests s
, const char *ctl
, unsigned long arg1
)
142 if ((len
= strlen (ctl
) + 21) < ARRAY_SIZE (quickbuf
))
143 /* No # bigger than 20 digits. */
145 sprintf (&quickbuf
[0], ctl
, arg1
);
146 ffests_puttext (s
, &quickbuf
[0], strlen (quickbuf
));
150 buff
= malloc_new_ks (malloc_pool_image (), "ffests_printf_1U", len
);
151 sprintf (buff
, ctl
, arg1
);
152 ffests_puttext (s
, buff
, strlen (buff
));
153 malloc_kill_ks (malloc_pool_image (), buff
, len
);
157 /* ffests_printf_1s -- printf("...%s...",(char *)) to a string
160 ffests_printf_1s(s,"...%s...","hi there!");
162 Like printf, but into a string. */
165 ffests_printf_1s (ffests s
, const char *ctl
, const char *arg1
)
171 if ((len
= strlen (ctl
) + strlen (arg1
) - 1) < ARRAY_SIZE (quickbuf
))
173 sprintf (&quickbuf
[0], ctl
, arg1
);
174 ffests_puttext (s
, &quickbuf
[0], strlen (quickbuf
));
178 buff
= malloc_new_ks (malloc_pool_image (), "ffests_printf_1s", len
);
179 sprintf (buff
, ctl
, arg1
);
180 ffests_puttext (s
, buff
, strlen (buff
));
181 malloc_kill_ks (malloc_pool_image (), buff
, len
);
185 /* ffests_printf_2Us -- printf("...%lu...%s...",...) to a string
188 ffests_printf_2Us(s,"...%lu...%s...",1,"hi there!");
190 Like printf, but into a string. */
193 ffests_printf_2Us (ffests s
, const char *ctl
, unsigned long arg1
, const char *arg2
)
199 if ((len
= strlen (ctl
) + 21 + strlen (arg2
) - 1) < ARRAY_SIZE (quickbuf
))
200 /* No # bigger than 20 digits. */
202 sprintf (&quickbuf
[0], ctl
, arg1
, arg2
);
203 ffests_puttext (s
, &quickbuf
[0], strlen (quickbuf
));
207 buff
= malloc_new_ks (malloc_pool_image (), "ffests_printf_2Us", len
);
208 sprintf (buff
, ctl
, arg1
, arg2
);
209 ffests_puttext (s
, buff
, strlen (buff
));
210 malloc_kill_ks (malloc_pool_image (), buff
, len
);
214 /* ffests_putc -- Put a single character into string
217 ffests_putc(s,'*'); */
220 ffests_putc (ffests s
, char c
)
222 ffests_puttext (s
, &c
, 1);
225 /* ffests_puts -- Put a zero-terminated (C-style) string into string
228 ffests_puts(s,"append me"); */
231 ffests_puts (ffests s
, const char *string
)
233 ffests_puttext (s
, string
, strlen (string
));
236 /* ffests_puttext -- Put a number of characters into string
239 ffests_puttext(s,"hi there",8);
241 The string need not be 0-terminated, because the passed length is used,
245 ffests_puttext (ffests s
, const char *text
, ffestsLength length
)
253 newlen
= s
->len_
+ length
;
254 if (newlen
> s
->max_
)
256 if (s
->text_
== NULL
)
259 s
->text_
= malloc_new_ksr (s
->pool_
, "ffests", s
->max_
);
263 newmax
= s
->max_
<< 1;
264 while (newmax
< newlen
)
266 s
->text_
= malloc_resize_ksr (s
->pool_
, s
->text_
, newmax
, s
->max_
);
271 memcpy (s
->text_
+ s
->len_
, text
, length
);