ROSE 0.11.145.147
sla.h
1/*
2
3String list assignment (sla) functions to process assignment instructions and flags.
4Copyright (C) 1998,1999 Brian T. N. Gunney
5
6This library is free software; you can redistribute it and/or
7modify it under the terms of the GNU Library General Public
8License as published by the Free Software Foundation; either
9version 2 of the License, or (at your option) any later version.
10
11This library is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14Library General Public License for more details.
15
16You should have received a copy of the GNU Library General Public
17License along with this library; if not, write to the
18Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA.
20
21Brian T. N. Gunney, brlynn@minn.net
22
23$Id: sla.h,v 1.3 2008/01/08 02:56:44 dquinlan Exp $
24
25*/
26
27/*
28 *
29 * Jeremiah J. Willcock, 10-16-2007
30 * Changed the C++ version of this code to use std::strings rather than char*
31 * to allow better integration with the string version of ROSE command line
32 * processing.
33 *
34 */
35
36#ifndef __INCLUDED_sla_hh__
37#define __INCLUDED_sla_hh__
38/*
39$Header: /nfs/casc/overture/ROSE/ROSE2_Repository/ROSE/src/util/commandlineProcessing/sla.h,v 1.3 2008/01/08 02:56:44 dquinlan Exp $
40*/
41
42#include "rosedll.h"
43
44#ifdef __cplusplus
45#include <vector>
46#include <string>
47#endif
48
49#ifndef ARGVCONST
50#define ARGVCONST
51#endif
52
53ROSE_UTIL_API void sla_set_debug( int d );
54
55#if 1
56#ifdef __cplusplus
57#define sla_str sla
58#define sla_none sla
59#define sla_float sla
60#define sla_double sla
61#define sla_int sla
62#define sla_short sla
63#define sla_long sla
64#define sla_uint sla
65#define sla_ushort sla
66#define sla_ulong sla
67#define sla_char sla
68#endif
69#endif
70
71#ifdef __cplusplus
72ROSE_UTIL_API int sla_none( std::vector<std::string> &argv, const std::string& flind, const std::string& assop, const std::string& pname, int argd=0 );
73#else
74ROSE_UTIL_API int sla_none( int *argc, ARGVCONST char **argv, const char *flind, const char *assop, const char *pname, int argd );
75#endif
76
77/*** generates code for sla prototypes ***/
78#ifndef SLA_FCN_PROTO
79#ifdef __cplusplus
80#define SLA_FCN_PROTO(N,T) \
81ROSE_UTIL_API int N( std::vector<std::string>& argv \
82 , const std::string& flind \
83 , const std::string& assop \
84 , const std::string& pname \
85 , T *value \
86 , int argd = 0 /* default argument */ \
87 )
88#else
89#define SLA_FCN_PROTO(N,T) \
90ROSE_UTIL_API int N( int *argc \
91 , ARGVCONST char **argv \
92 , const char *flind \
93 , const char *assop \
94 , const char *pname \
95 , T *value \
96 , int argd /* no default argument */ \
97 )
98#endif
99#endif
100
101/*** generates code for sla function headers ***/
102#ifndef SLA_FCN_BEGIN
103#ifdef __cplusplus
104#define SLA_FCN_BEGIN(N,T) \
105ROSE_UTIL_API int N( std::vector<std::string>& argv \
106 , const std::string& flind \
107 , const std::string& assop \
108 , const std::string& pname \
109 , T *value \
110 , int argd \
111 )
112#else
113#define SLA_FCN_BEGIN(N,T) SLA_FCN_PROTO(N,T)
114#endif
115#endif
116
117/*** For allocating and deleting memory ***/
118#include <stdlib.h>
119
120/*** Sla for type T (automatically uses function M to modify). ***/
121#ifndef SLA_MOD
122#ifdef __cplusplus
123#define SLA_MOD(M) \
124 std::vector<std::string> rr(argv.size()); \
125 int i, nvalue; \
126 std::string ppname = pname; \
127 if ( !pname.empty() && pname[0] != '*' ) { \
128 ppname = "*" + ppname; \
129 } \
130 nvalue = sla_str( argv, flind, assop, ppname, rr, argd ); \
131 if ( nvalue > 0 && value != NULL ) { \
132 if ( !pname.empty() && pname[0] == '*' ) { \
133 for ( i=0; i<nvalue; i++ ) M( value+i, rr[i] ); \
134 } \
135 else { \
136 for ( i=0; i<nvalue; i++ ) M( value , rr[i] ); \
137 } \
138 } \
139 return nvalue;
140#else
141#define SLA_MOD(M) \
142 ARGVCONST char **rr, eol='\0'; \
143 int i, nvalue; \
144 rr = (ARGVCONST char**)malloc( (*argc)*sizeof(ARGVCONST char*) ); \
145 for ( i=0; i<*argc; i++ ) rr[i] = &eol; \
146 nvalue = sla_str( argc, argv, flind, assop, pname, rr, argd ); \
147 if ( nvalue > 0 && value != NULL ) { \
148 if ( *pname == '*' ) { \
149 for ( i=0; i<nvalue; i++ ) M( value+i, rr[i] ); \
150 } \
151 else { \
152 for ( i=0; i<nvalue; i++ ) M( value , rr[i] ); \
153 } \
154 } \
155 free(rr); \
156 return nvalue;
157#endif
158#endif
159
160/*** Sla for type T (automatically uses function C to convert). ***/
161#ifndef SLA_CNV
162#ifdef __cplusplus
163#define SLA_CNV(C) \
164 std::vector<std::string> rr(argv.size()); \
165 int i, nvalue; \
166 std::string ppname = pname; \
167 if ( pname.empty() || pname[0] != '*' ) { \
168 ppname = "*" + ppname; \
169 } \
170 nvalue = sla_str( argv, flind, assop, ppname, &rr[0], argd ); \
171 if ( nvalue > 0 && value != NULL ) { \
172 if ( !pname.empty() && pname[0] == '*' ) { \
173 for ( i=0; i<nvalue; i++ ) value[i] = C(rr[i].c_str()); \
174 } \
175 else { \
176 for ( i=0; i<nvalue; i++ ) value[0] = C(rr[i].c_str()); \
177 } \
178 } \
179 return nvalue;
180#else
181#define SLA_CNV(C) \
182 ARGVCONST char **rr, eol='\0'; \
183 int i, nvalue; \
184 rr = (ARGVCONST char**)malloc( (*argc)*sizeof(ARGVCONST char*) ); \
185 for ( i=0; i<*argc; i++ ) rr[i] = &eol; \
186 nvalue = sla_str( argc, argv, flind, assop, pname, rr, argd ); \
187 if ( nvalue > 0 && value != NULL ) { \
188 if ( *pname == '*' ) { \
189 for ( i=0; i<nvalue; i++ ) value[i] = C(rr[i]); \
190 } \
191 else { \
192 for ( i=0; i<nvalue; i++ ) value[0] = C(rr[i]); \
193 } \
194 } \
195 free(rr); \
196 return nvalue;
197#endif
198#endif
199
200
201/*
202 Generate additional sla for various primitive types.
203 The use of the SLA macro makes it
204 difficult to see the prototypes of the functions created.
205 To find the prototypes, try this:
206 > CC -P sla.cc
207 > pgrep 's/^(int sla\s*\‍([^\{]*).*$/$1;/' sla.i -s
208 */
209#ifdef __cplusplus
210SLA_FCN_PROTO( sla_str, std::string );
211#else
212SLA_FCN_PROTO( sla_str, ARGVCONST char * );
213#endif
214SLA_FCN_PROTO( sla_float, float );
215SLA_FCN_PROTO( sla_double, double );
216SLA_FCN_PROTO( sla_int, int );
217SLA_FCN_PROTO( sla_short, short );
218SLA_FCN_PROTO( sla_long, long );
219SLA_FCN_PROTO( sla_uint, unsigned int );
220SLA_FCN_PROTO( sla_ushort, unsigned short );
221SLA_FCN_PROTO( sla_ulong, unsigned long );
222SLA_FCN_PROTO( sla_char, char );
223
224
225
226
227#endif