1 //
2 // formio.cc
3 //
4 // Copyright (C) 1996 Limit Point Systems, Inc.
5 //
6 // Author: Curtis Janssen <cljanss@limitpt.com>
7 // Maintainer: LPS
8 //
9 // This file is part of the SC Toolkit.
10 //
11 // The SC Toolkit is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU Library General Public License as published by
13 // the Free Software Foundation; either version 2, or (at your option)
14 // any later version.
15 //
16 // The SC Toolkit is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 // GNU Library General Public License for more details.
20 //
21 // You should have received a copy of the GNU Library General Public License
22 // along with the SC Toolkit; see the file COPYING.LIB.  If not, write to
23 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24 //
25 // The U.S. Government is granted a limited license as per AL 91-7.
26 //
27 
28 #include <util/misc/formio.h>
29 #include <util/misc/exenv.h>
30 
31 #include <stdio.h> // for vsprintf
32 #include <stdlib.h>
33 #include <string.h>
34 #include <stdarg.h>
35 
36 using namespace std;
37 using namespace sc;
38 
39 char *SCFormIO::default_basename_ = 0;
40 int  SCFormIO::ready_ = 0;
41 int  SCFormIO::xalloc_inited_ = 0;
42 long SCFormIO::nindent_ = 0;
43 long SCFormIO::indent_size_ = 0;
44 long SCFormIO::skip_indent_ = 0;
45 long SCFormIO::verbose_ = 0;
46 long SCFormIO::initialized_ = 0;
47 int SCFormIO::node_to_print_ = 0;
48 int SCFormIO::debug_ = 0;
49 int SCFormIO::parallel_ = 0;
50 int SCFormIO::me_ = 0;
51 
52 char *
fileext_to_filename(const char * ext)53 SCFormIO::fileext_to_filename(const char *ext)
54 {
55   const char *basename;
56 
57   if (default_basename_) basename = default_basename_;
58   else basename = "SC";
59 
60   char * res = new char[strlen(basename) + strlen(ext) + 1];
61   strcpy(res, basename);
62   strcat(res, ext);
63 
64   return res;
65 }
66 
67 void
set_default_basename(const char * basename)68 SCFormIO::set_default_basename(const char *basename)
69 {
70   if (default_basename_) delete[] default_basename_;
71 
72   if (basename)
73       default_basename_ = strcpy(new char[strlen(basename)+1], basename);
74   else
75       default_basename_ = 0;
76 }
77 
78 const char *
default_basename()79 SCFormIO::default_basename()
80 {
81   return default_basename_;
82 }
83 
84 int
set_printnode(int n)85 SCFormIO::set_printnode(int n)
86 {
87   int r = node_to_print_;
88   node_to_print_ = n;
89   return r;
90 }
91 
92 void
set_debug(int n)93 SCFormIO::set_debug(int n)
94 {
95   debug_ = n;
96 }
97 
98 void
init_mp(int me)99 SCFormIO::init_mp(int me)
100 {
101   if (!ready_) init();
102   me_ = me;
103   parallel_=1;
104 }
105 
106 void
init_ostream(ostream & o)107 SCFormIO::init_ostream(ostream &o)
108 {
109   if (!xalloc_inited_) {
110       xalloc_inited_ = 1;
111       nindent_ = ios::xalloc();
112       indent_size_ = ios::xalloc();
113       skip_indent_ = ios::xalloc();
114       verbose_ = ios::xalloc();
115       initialized_ = ios::xalloc();
116     }
117 
118   if (o.iword(initialized_)) return;
119 
120   o.iword(skip_indent_) = 0;
121   o.iword(indent_size_) = 0;
122   o.iword(nindent_) = 2;
123   o.iword(verbose_) = 0;
124   o.iword(initialized_) = 1;
125 }
126 
127 void
init()128 SCFormIO::init()
129 {
130   ready_ = 1;
131 
132   init_ostream(cout);
133   init_ostream(cerr);
134 }
135 
136 ios&
indent(ios & o)137 SCFormIO::indent(ios&o)
138 {
139   if (!ready_) init();
140   long &skip = o.iword(skip_indent_);
141   if (skip) {
142       skip--;
143       return o;
144     }
145   if (debug_ && parallel_) {
146       char nn[24];
147       sprintf(nn,"node %5d:",me_);
148       for (size_t i=0; i < strlen(nn); i++) o.rdbuf()->sputc(nn[i]);
149     }
150   long n = o.iword(nindent_);
151   for (int i=0; i<n; i++) o.rdbuf()->sputc(' ');
152   return o;
153 }
154 
155 ios&
incindent(ios & o)156 SCFormIO::incindent(ios&o)
157 {
158   if (!ready_) init();
159   long &n = o.iword(nindent_);
160   long size = o.iword(indent_size_);
161   if (size == 0) size = 2;
162   else if (size < 0) size = 0;
163   n += size;
164   return o;
165 }
166 
167 ios&
decindent(ios & o)168 SCFormIO::decindent(ios&o)
169 {
170   if (!ready_) init();
171   long &n = o.iword(nindent_);
172   long size = o.iword(indent_size_);
173   if (size == 0) size = 2;
174   else if (size < 0) size = 0;
175   n -= size;
176   if (n<0) n=0;
177   return o;
178 }
179 
180 long
getindent(ios & o)181 SCFormIO::getindent(ios&o)
182 {
183   if (!ready_) init();
184   return o.iword(nindent_);
185 }
186 
187 void
setindent(ios & o,long n)188 SCFormIO::setindent(ios&o, long n)
189 {
190   if (!ready_) init();
191   o.iword(nindent_) = n;
192 }
193 
194 long
getverbose(ios & o)195 SCFormIO::getverbose(ios&o)
196 {
197   if (!ready_) init();
198   return o.iword(verbose_);
199 }
200 
201 void
setverbose(ios & o,long n)202 SCFormIO::setverbose(ios&o, long n)
203 {
204   if (!ready_) init();
205   o.iword(verbose_) = n;
206 }
207 
208 ios&
skipnextindent(ios & o)209 SCFormIO::skipnextindent(ios&o)
210 {
211   if (!ready_) init();
212   o.iword(skip_indent_)++;
213   return o;
214 }
215 
216 ostream&
copyright(ostream & o)217 SCFormIO::copyright(ostream& o)
218 {
219   o << indent
220     << "Copyright (C) 1997 Limit Point Systems, Inc. and others."
221     << endl;
222 
223   return o;
224 }
225 
226 ostream&
license(ostream & o)227 SCFormIO::license(ostream& o)
228 {
229   o << indent
230     << "This program is open-source software; you can redistribute it and/or modify"
231     << endl << indent
232     << "it under the terms of the GNU General Public License as published by"
233     << endl << indent
234     << "the Free Software Foundation; either version 2 of the License, or"
235     << endl << indent
236     << "(at your option) any later version."
237     << endl;
238 
239   return o;
240 }
241 
242 ostream&
warranty(ostream & o)243 SCFormIO::warranty(ostream& o)
244 {
245   o << indent
246     << "This program is distributed in the hope that it will be useful,"
247     << endl << indent
248     << "but WITHOUT ANY WARRANTY; without even the implied warranty of"
249     << endl << indent
250     << "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the"
251     << endl << indent
252     << "GNU General Public License for more details."
253     << endl;
254 
255   return o;
256 }
257 
258 ios&
indent(ios & o)259 sc::indent(ios& o)
260 {
261   return SCFormIO::indent(o);
262 }
263 
264 ios&
decindent(ios & o)265 sc::decindent(ios& o)
266 {
267   return SCFormIO::decindent(o);
268 }
269 
270 ios&
incindent(ios & o)271 sc::incindent(ios& o)
272 {
273   return SCFormIO::incindent(o);
274 }
275 
276 ios&
skipnextindent(ios & o)277 sc::skipnextindent(ios& o)
278 {
279   return SCFormIO::skipnextindent(o);
280 }
281 
282 /////////////////////////////////////////////////////////////////////////////
283 
scprintf(const char * fmt,...)284 scprintf::scprintf(const char *fmt, ...)
285 {
286   va_list args;
287 
288   va_start(args, fmt);
289 
290   str[0] = '\0';
291 
292   // hopefully this won't overflow
293   if (fmt && fmt[0]!='\0') {
294     if (vsprintf(str, fmt, args) > 1023) {
295       ExEnv::errn() << indent << "scprintf overflow\n";
296       abort();
297     }
298   }
299 
300   va_end(args);
301 }
302 
303 ostream&
operator <<(ostream & o,const scprintf & s)304 sc::operator<<(ostream& o, const scprintf& s)
305 {
306   o << s.str << flush;
307   return o;
308 }
309 
310 /////////////////////////////////////////////////////////////////////////////
311 
312 // Local Variables:
313 // mode: c++
314 // c-file-style: "CLJ"
315 // End:
316