00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "proj.h"
00032 #include "src.h"
00033 #include "top.h"
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 char ffesrc_char_match_init_[256];
00046 char ffesrc_char_match_noninit_[256];
00047
00048
00049
00050
00051
00052
00053 char ffesrc_char_source_[256];
00054
00055
00056
00057
00058
00059 char ffesrc_char_internal_init_[256];
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 ffebad ffesrc_bad_symbol_init_[256];
00075 ffebad ffesrc_bad_symbol_noninit_[256];
00076
00077
00078
00079
00080
00081
00082
00083 bool ffesrc_check_symbol_;
00084
00085
00086
00087
00088 bool ffesrc_ok_match_init_upper_;
00089 bool ffesrc_ok_match_init_lower_;
00090 bool ffesrc_ok_match_noninit_upper_;
00091 bool ffesrc_ok_match_noninit_lower_;
00092
00093
00094
00095 void
00096 ffesrc_init_1 ()
00097 {
00098 int i;
00099
00100 for (i = 0; i < 256; ++i)
00101 {
00102 ffesrc_char_match_init_[i] = i;
00103 ffesrc_char_match_noninit_[i] = i;
00104 ffesrc_char_source_[i] = i;
00105 ffesrc_char_internal_init_[i] = i;
00106 ffesrc_bad_symbol_init_[i] = FFEBAD;
00107 ffesrc_bad_symbol_noninit_[i] = FFEBAD;
00108 }
00109
00110 ffesrc_check_symbol_ = (ffe_case_symbol () != FFE_caseNONE);
00111
00112 ffesrc_ok_match_init_upper_ = (ffe_case_match () != FFE_caseLOWER);
00113 ffesrc_ok_match_init_lower_ = (ffe_case_match () != FFE_caseUPPER)
00114 && (ffe_case_match () != FFE_caseINITCAP);
00115 ffesrc_ok_match_noninit_upper_ = (ffe_case_match () != FFE_caseLOWER)
00116 && (ffe_case_match () != FFE_caseINITCAP);
00117 ffesrc_ok_match_noninit_lower_ = (ffe_case_match () != FFE_caseUPPER);
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 #define FFESRC_INVALID_SYMBOL_CHAR_ '-'
00131
00132 if (!ffesrc_ok_match_init_upper_)
00133 for (i = 'A'; i <= 'Z'; ++i)
00134 ffesrc_char_match_init_[i] = FFESRC_INVALID_SYMBOL_CHAR_;
00135
00136 if (ffesrc_ok_match_init_lower_)
00137 for (i = 'a'; i <= 'z'; ++i)
00138 ffesrc_char_match_init_[i] = TOUPPER (i);
00139 else
00140 for (i = 'a'; i <= 'z'; ++i)
00141 ffesrc_char_match_init_[i] = FFESRC_INVALID_SYMBOL_CHAR_;
00142
00143 if (!ffesrc_ok_match_noninit_upper_)
00144 for (i = 'A'; i <= 'Z'; ++i)
00145 ffesrc_char_match_noninit_[i] = FFESRC_INVALID_SYMBOL_CHAR_;
00146
00147 if (ffesrc_ok_match_noninit_lower_)
00148 for (i = 'a'; i <= 'z'; ++i)
00149 ffesrc_char_match_noninit_[i] = TOUPPER (i);
00150 else
00151 for (i = 'a'; i <= 'z'; ++i)
00152 ffesrc_char_match_noninit_[i] = FFESRC_INVALID_SYMBOL_CHAR_;
00153
00154 if (ffe_case_source () == FFE_caseLOWER)
00155 for (i = 'A'; i <= 'Z'; ++i)
00156 ffesrc_char_source_[i] = TOLOWER (i);
00157 else if (ffe_case_source () == FFE_caseUPPER)
00158 for (i = 'a'; i <= 'z'; ++i)
00159 ffesrc_char_source_[i] = TOUPPER (i);
00160
00161 if (ffe_case_match () == FFE_caseLOWER)
00162 for (i = 'A'; i <= 'Z'; ++i)
00163 ffesrc_char_internal_init_[i] = TOLOWER (i);
00164
00165 switch (ffe_case_symbol ())
00166 {
00167 case FFE_caseLOWER:
00168 for (i = 'A'; i <= 'Z'; ++i)
00169 {
00170 ffesrc_bad_symbol_init_[i] = FFEBAD_SYMBOL_UPPER_CASE;
00171 ffesrc_bad_symbol_noninit_[i] = FFEBAD_SYMBOL_UPPER_CASE;
00172 }
00173 break;
00174
00175 case FFE_caseUPPER:
00176 for (i = 'a'; i <= 'z'; ++i)
00177 {
00178 ffesrc_bad_symbol_init_[i] = FFEBAD_SYMBOL_LOWER_CASE;
00179 ffesrc_bad_symbol_noninit_[i] = FFEBAD_SYMBOL_LOWER_CASE;
00180 }
00181 break;
00182
00183 case FFE_caseINITCAP:
00184 for (i = 0; i < 256; ++i)
00185 ffesrc_bad_symbol_noninit_[i] = FFEBAD_SYMBOL_NOLOWER_INITCAP;
00186 for (i = 'a'; i <= 'z'; ++i)
00187 {
00188 ffesrc_bad_symbol_init_[i] = FFEBAD_SYMBOL_LOWER_INITCAP;
00189 ffesrc_bad_symbol_noninit_[i] = FFEBAD;
00190 }
00191 break;
00192
00193 default:
00194 break;
00195 }
00196 }
00197
00198
00199
00200
00201
00202 int
00203 ffesrc_strcmp_1ns2i (ffeCase mcase, const char *var, int len,
00204 const char *str_ic)
00205 {
00206 char c;
00207 char d;
00208
00209 switch (mcase)
00210 {
00211 case FFE_caseNONE:
00212 for (; len > 0; --len, ++var, ++str_ic)
00213 {
00214 c = ffesrc_char_source (*var);
00215 c = TOUPPER (c);
00216 d = TOUPPER (*str_ic);
00217 if (c != d)
00218 {
00219 if ((d != '\0') && (c < d))
00220 return -1;
00221 else
00222 return 1;
00223 }
00224 }
00225 break;
00226
00227 case FFE_caseUPPER:
00228 for (; len > 0; --len, ++var, ++str_ic)
00229 {
00230 c = ffesrc_char_source (*var);
00231 d = TOUPPER (*str_ic);
00232 if (c != d)
00233 {
00234 if ((d != '\0') && (c < d))
00235 return -1;
00236 else
00237 return 1;
00238 }
00239 }
00240 break;
00241
00242 case FFE_caseLOWER:
00243 for (; len > 0; --len, ++var, ++str_ic)
00244 {
00245 c = ffesrc_char_source (*var);
00246 d = TOLOWER (*str_ic);
00247 if (c != d)
00248 {
00249 if ((d != '\0') && (c < d))
00250 return -1;
00251 else
00252 return 1;
00253 }
00254 }
00255 break;
00256
00257 case FFE_caseINITCAP:
00258 for (; len > 0; --len, ++var, ++str_ic)
00259 {
00260 c = ffesrc_char_source (*var);
00261 d = *str_ic;
00262 if (c != d)
00263 {
00264 c = TOUPPER (c);
00265 d = TOUPPER (d);
00266 while ((len > 0) && (c == d))
00267 {
00268 --len, ++var, ++str_ic;
00269 if (len > 0)
00270 c = TOUPPER (*var);
00271 d = TOUPPER (*str_ic);
00272 }
00273 if ((d != '\0') && (c < d))
00274 return -1;
00275 else
00276 return 1;
00277 }
00278 }
00279 break;
00280
00281 default:
00282 assert ("bad case value" == NULL);
00283 return -1;
00284 }
00285
00286 if (*str_ic == '\0')
00287 return 0;
00288 return -1;
00289 }
00290
00291
00292
00293
00294
00295
00296 int
00297 ffesrc_strcmp_2c (ffeCase mcase, const char *var, const char *str_uc,
00298 const char *str_lc, const char *str_ic)
00299 {
00300 int i;
00301 char c;
00302
00303 switch (mcase)
00304 {
00305 case FFE_caseNONE:
00306 for (; *var != '\0'; ++var, ++str_uc)
00307 {
00308 c = TOUPPER (*var);
00309 if (c != *str_uc)
00310 {
00311 if ((*str_uc != '\0') && (c < *str_uc))
00312 return -1;
00313 else
00314 return 1;
00315 }
00316 }
00317 if (*str_uc == '\0')
00318 return 0;
00319 return -1;
00320
00321 case FFE_caseUPPER:
00322 i = strcmp (var, str_uc);
00323 break;
00324
00325 case FFE_caseLOWER:
00326 i = strcmp (var, str_lc);
00327 break;
00328
00329 case FFE_caseINITCAP:
00330 for (; *var != '\0'; ++var, ++str_ic, ++str_uc)
00331 {
00332 if (*var != *str_ic)
00333 {
00334 c = TOUPPER (*var);
00335 while ((c != '\0') && (c == *str_uc))
00336 {
00337 ++var, ++str_uc;
00338 c = TOUPPER (*var);
00339 }
00340 if ((*str_uc != '\0') && (c < *str_uc))
00341 return -1;
00342 else
00343 return 1;
00344 }
00345 }
00346 if (*str_ic == '\0')
00347 return 0;
00348 return -1;
00349
00350 default:
00351 assert ("bad case value" == NULL);
00352 return -1;
00353 }
00354
00355 if (i == 0)
00356 return 0;
00357 else if (i < 0)
00358 return -1;
00359 return 1;
00360 }
00361
00362
00363
00364
00365
00366 int
00367 ffesrc_strncmp_2c (ffeCase mcase, const char *var, const char *str_uc,
00368 const char *str_lc, const char *str_ic, int len)
00369 {
00370 int i;
00371 char c;
00372
00373 switch (mcase)
00374 {
00375 case FFE_caseNONE:
00376 for (; len > 0; ++var, ++str_uc, --len)
00377 {
00378 c = TOUPPER (*var);
00379 if (c != *str_uc)
00380 {
00381 if (c < *str_uc)
00382 return -1;
00383 else
00384 return 1;
00385 }
00386 }
00387 return 0;
00388
00389 case FFE_caseUPPER:
00390 i = strncmp (var, str_uc, len);
00391 break;
00392
00393 case FFE_caseLOWER:
00394 i = strncmp (var, str_lc, len);
00395 break;
00396
00397 case FFE_caseINITCAP:
00398 for (; len > 0; ++var, ++str_ic, ++str_uc, --len)
00399 {
00400 if (*var != *str_ic)
00401 {
00402 c = TOUPPER (*var);
00403 while ((len > 0) && (c == *str_uc))
00404 {
00405 --len, ++var, ++str_uc;
00406 if (len > 0)
00407 c = TOUPPER (*var);
00408 }
00409 if ((len > 0) && (c < *str_uc))
00410 return -1;
00411 else
00412 return 1;
00413 }
00414 }
00415 return 0;
00416
00417 default:
00418 assert ("bad case value" == NULL);
00419 return -1;
00420 }
00421
00422 if (i == 0)
00423 return 0;
00424 else if (i < 0)
00425 return -1;
00426 return 1;
00427 }