APBS  1.5
vstring.c
Go to the documentation of this file.
1 
57 #include "vstring.h"
58 
59 /* ///////////////////////////////////////////////////////////////////////////
60 // Routine: Vstring_strcasecmp
61 //
62 // Copyright (c) 1988-1993 The Regents of the University of
63 // California.
64 // Copyright (c) 1995-1996 Sun Microsystems, Inc.
66 VPUBLIC int Vstring_strcasecmp(const char *s1, const char *s2) {
67 
68 #if !defined(HAVE_STRCASECMP)
69  unsigned char charmap[] = {
70  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
71  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
72  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
73  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
74  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
75  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
76  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
77  0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
78  0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
79  0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
80  0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
81  0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
82  0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
83  0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
84  0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
85  0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
86  0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
87  0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
88  0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
89  0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
90  0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
91  0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
92  0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
93  0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
94  0xc0, 0xe1, 0xe2, 0xe3, 0xe4, 0xc5, 0xe6, 0xe7,
95  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
96  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
97  0xf8, 0xf9, 0xfa, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
98  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
99  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
100  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
101  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
102  };
103 
104  unsigned char u1, u2;
105 
106  for ( ; ; s1++, s2++) {
107  u1 = (unsigned char) *s1;
108  u2 = (unsigned char) *s2;
109  if ((u1 == '\0') || (charmap[u1] != charmap[u2])) {
110  break;
111  }
112  }
113  return charmap[u1] - charmap[u2];
114 
115 #else
116 
117  return strcasecmp(s1, s2);
118 
119 #endif
120 
121 }
122 
123 /* ///////////////////////////////////////////////////////////////////////////
124 // Routine: Vstring_isdigit
125 //
126 // Improves upon sscanf to see if a token is an int or not
127 //
128 // Returns isdigit: 1 if a digit, 0 otherwise
130 VPUBLIC int Vstring_isdigit(const char *tok) {
131  int i, isdigit, ti;
132  char checkchar[1];
133  char name[VMAX_BUFSIZE];
134  strcpy(name,tok);
135  isdigit = 1;
136  for(i=0; ; i++){
137  checkchar[0] = name[i];
138  if (name[i] == '\0'){
139  break;
140  }
141  if (sscanf(checkchar, "%d", &ti) != 1){
142  isdigit = 0;
143  break;
144  }
145  }
146  return isdigit;
147 }
148 
149 
155 char* Vstring_wrappedtext(const char* str, int right_margin, int left_padding)
156 {
157  int span = right_margin - left_padding;
158  int i = 0;
159  int k = 0;
160  int j = 0;
161  int line_len = 0;
162  int hyphenate = 0;
163  char* wrap_str;
164  int wrap_len;
165  int len = strlen( str );
166 
167  if( len == 0 )
168  return VNULL;
169 
170  wrap_str = (char*)malloc( len * sizeof(char) );
171  wrap_len = len;
172 
173  do
174  {
175  if( str[i] == ' ' )
176  {
177  i++;
178  }
179  else
180  {
184  if( k + right_margin + 2 > wrap_len )
185  {
186  wrap_len += right_margin + 2;
187  wrap_str = (char*)realloc( wrap_str, wrap_len * sizeof( char ) );
188  }
189 
190 
191  if( i + span >= len )
192  {
193  hyphenate = 0;
194  line_len = len - i;
195  }
196  else
197  {
198  j = span;
199  do
200  {
201  if( str[ i + j ] == ' ' )
202  {
203  hyphenate = 0;
204  line_len = j;
205  break;
206  }
207  else if( j == 0 )
208  {
209  hyphenate = 1;
210  line_len = span - 1;
211  break;
212  }
213  else
214  {
215  j--;
216  }
217  } while( 1 );
218  }
219 
220  memset( wrap_str + k, ' ', left_padding * sizeof( char ) );
221  k += left_padding;
222 
223  memcpy( wrap_str + k, str + i, line_len * sizeof( char ) );
224  k += line_len;
225  i += line_len;
226 
227  if( hyphenate )
228  wrap_str[k++] = '-';
229 
230  wrap_str[k++] = '\n';
231 
232  wrap_str[k] = '\0';
233  }
234  } while( i < len );
235 
236  return wrap_str;
237 }
238 
Contains declarations for class Vstring.