Go to the documentation of this file.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
00032
00033
00034
00035
00036
00037 #pragma ident "@(#) libfi/char/scan.c 92.3 07/30/99 10:09:59"
00038
00039
00040
00041
00042
00043
00044 #include <fortran.h>
00045 #include <string.h>
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 #if defined(__mips)
00065 #define WORDS 8
00066 #define BITS 31
00067 #define MASK 07
00068 #define SHIFT 3
00069 #elif !defined(_WORD32)
00070 #define WORDS 4
00071 #define BITS 63
00072 #define MASK 03
00073 #define SHIFT 2
00074 #else
00075 #define WORDS 8
00076 #define BITS 31
00077 #define MASK 07
00078 #define SHIFT 3
00079 #endif
00080
00081 #define FOUND(a) (mask[a & MASK] << (a >> SHIFT)) < 0
00082
00083 _f_int
00084 _SCAN (_fcd str1, _fcd str2, _f_log *back)
00085 {
00086 char *ptr1, *ptr2;
00087 long len1, len2;
00088 int bck, num;
00089 _f_int i;
00090 _f_int mask[WORDS];
00091
00092
00093
00094 #ifndef _UNICOS
00095 if (back != NULL && _ltob(back))
00096 bck = 1;
00097 else
00098 bck = 0;
00099 #else
00100 num = _numargs();
00101 #ifdef _ADDR64
00102 if (num == 2 * sizeof(_fcd) / sizeof(long))
00103 #else
00104 if (num == 2)
00105 #endif
00106 bck = 0;
00107 else if (back == NULL)
00108 bck = 0;
00109 else if (_ltob(back))
00110 bck = 1;
00111 else
00112 bck = 0;
00113 #endif
00114
00115
00116
00117 len1 = _fcdlen (str1);
00118 ptr1 = _fcdtocp (str1);
00119
00120 len2 = _fcdlen (str2);
00121 ptr2 = _fcdtocp (str2);
00122
00123
00124
00125 if (len1 == 0 || len2 == 0)
00126 return (0);
00127
00128
00129
00130
00131
00132
00133 #ifdef _UNICOS
00134 #pragma _CRI shortloop
00135 #endif
00136 for (i = 0; i < WORDS; i++)
00137 mask[i] = 0;
00138 for (i = 0; i < len2; i++)
00139 mask[ptr2[i] & MASK] |= 1 << (BITS - (ptr2[i] >> SHIFT));
00140
00141
00142
00143
00144
00145 if (!bck) {
00146 for (i = 0; i < len1; i++)
00147 if (FOUND(ptr1[i]))
00148 return (i+1);
00149 }
00150 else {
00151 for (i = len1-1; i >= 0; i--)
00152 if (FOUND(ptr1[i]))
00153 return (i+1);
00154 }
00155
00156
00157
00158 return (0);
00159 }
00160
00161
00162 #ifdef _F_INT4
00163
00164 #undef WORDS
00165 #undef BITS
00166 #undef MASK
00167 #undef SHIFT
00168
00169 #if defined(__mips)
00170 #define WORDS 8
00171 #define BITS 31
00172 #define MASK 07
00173 #define SHIFT 3
00174 #elif !defined(_WORD32)
00175 #define WORDS 4
00176 #define BITS 63
00177 #define MASK 03
00178 #define SHIFT 2
00179 #else
00180 #define WORDS 8
00181 #define BITS 31
00182 #define MASK 07
00183 #define SHIFT 3
00184 #endif
00185
00186 _f_int4
00187 _SCAN_4 (_fcd str1, _fcd str2, _f_log *back)
00188 {
00189 char *ptr1, *ptr2;
00190 long len1, len2;
00191 int bck, num;
00192 #ifdef _CRAYMPP
00193 _f_int i;
00194 _f_int mask[WORDS];
00195 #else
00196 _f_int4 i;
00197 _f_int4 mask[WORDS];
00198 #endif
00199
00200
00201
00202 #ifndef _UNICOS
00203 if (back != NULL && _ltob(back))
00204 bck = 1;
00205 else
00206 bck = 0;
00207 #else
00208 num = _numargs();
00209 #ifdef _ADDR64
00210 if (num == 2 * sizeof(_fcd) / sizeof(long))
00211 #else
00212 if (num == 2)
00213 #endif
00214 bck = 0;
00215 else if (back == NULL)
00216 bck = 0;
00217 else if (_ltob(back))
00218 bck = 1;
00219 else
00220 bck = 0;
00221 #endif
00222
00223
00224
00225 len1 = _fcdlen (str1);
00226 ptr1 = _fcdtocp (str1);
00227
00228 len2 = _fcdlen (str2);
00229 ptr2 = _fcdtocp (str2);
00230
00231
00232
00233 if (len1 == 0 || len2 == 0)
00234 return (0);
00235
00236
00237
00238
00239
00240
00241 #ifdef _UNICOS
00242 #pragma _CRI shortloop
00243 #endif
00244 for (i = 0; i < WORDS; i++)
00245 mask[i] = 0;
00246 for (i = 0; i < len2; i++)
00247 mask[ptr2[i] & MASK] |= 1 << (BITS - (ptr2[i] >> SHIFT));
00248
00249
00250
00251
00252
00253 if (!bck) {
00254 for (i = 0; i < len1; i++)
00255 if (FOUND(ptr1[i]))
00256 return (i+1);
00257 }
00258 else {
00259 for (i = len1-1; i >= 0; i--)
00260 if (FOUND(ptr1[i]))
00261 return (i+1);
00262 }
00263
00264
00265
00266 return (0);
00267 }
00268 #endif
00269
00270
00271 #ifdef _F_INT8
00272
00273 #undef WORDS
00274 #undef BITS
00275 #undef MASK
00276 #undef SHIFT
00277 #define WORDS 8
00278 #define BITS 63
00279 #define MASK 03
00280 #define SHIFT 2
00281
00282 _f_int8
00283 _SCAN_8 (_fcd str1, _fcd str2, _f_log *back)
00284 {
00285 char *ptr1, *ptr2;
00286 long len1, len2;
00287 int bck, num;
00288 _f_int8 i;
00289 _f_int8 mask[WORDS];
00290
00291
00292
00293 #ifndef _UNICOS
00294 if (back != NULL && _ltob(back))
00295 bck = 1;
00296 else
00297 bck = 0;
00298 #else
00299 num = _numargs();
00300 #ifdef _ADDR64
00301 if (num == 2 * sizeof(_fcd) / sizeof(long))
00302 #else
00303 if (num == 2)
00304 #endif
00305 bck = 0;
00306 else if (back == NULL)
00307 bck = 0;
00308 else if (_ltob(back))
00309 bck = 1;
00310 else
00311 bck = 0;
00312 #endif
00313
00314
00315
00316 len1 = _fcdlen (str1);
00317 ptr1 = _fcdtocp (str1);
00318
00319 len2 = _fcdlen (str2);
00320 ptr2 = _fcdtocp (str2);
00321
00322
00323
00324 if (len1 == 0 || len2 == 0)
00325 return (0);
00326
00327
00328
00329
00330
00331
00332 #ifdef _UNICOS
00333 #pragma _CRI shortloop
00334 #endif
00335 for (i = 0; i < WORDS; i++)
00336 mask[i] = 0;
00337 for (i = 0; i < len2; i++)
00338 mask[ptr2[i] & MASK] |= 1 << (BITS - (ptr2[i] >> SHIFT));
00339
00340
00341
00342
00343
00344 if (!bck) {
00345 for (i = 0; i < len1; i++)
00346 if (FOUND(ptr1[i]))
00347 return (i+1);
00348 }
00349 else {
00350 for (i = len1-1; i >= 0; i--)
00351 if (FOUND(ptr1[i]))
00352 return (i+1);
00353 }
00354
00355
00356
00357 return (0);
00358 }
00359 #endif
00360
00361 #ifdef _F_INT2
00362
00363 #undef WORDS
00364 #undef BITS
00365 #undef MASK
00366 #undef SHIFT
00367
00368 #if defined(__mips) || defined(_LITTLE_ENDIAN)
00369 #define WORDS 16
00370 #define BITS 15
00371 #define MASK 017
00372 #define SHIFT 4
00373 #elif !defined(_WORD32)
00374 #define WORDS 4
00375 #define BITS 63
00376 #define MASK 03
00377 #define SHIFT 2
00378 #else
00379 #define WORDS 8
00380 #define BITS 31
00381 #define MASK 07
00382 #define SHIFT 3
00383 #endif
00384
00385 _f_int2
00386 _SCAN_2 (_fcd str1, _fcd str2, _f_log *back)
00387 {
00388 char *ptr1, *ptr2;
00389 long len1, len2;
00390 int bck, num;
00391 _f_int2 i;
00392 _f_int2 mask[WORDS];
00393
00394
00395
00396 #ifndef _UNICOS
00397 if (back != NULL && _ltob(back))
00398 bck = 1;
00399 else
00400 bck = 0;
00401 #else
00402 num = _numargs();
00403 #ifdef _ADDR64
00404 if (num == 2 * sizeof(_fcd) / sizeof(long))
00405 #else
00406 if (num == 2)
00407 #endif
00408 bck = 0;
00409 else if (back == NULL)
00410 bck = 0;
00411 else if (_ltob(back))
00412 bck = 1;
00413 else
00414 bck = 0;
00415 #endif
00416
00417
00418
00419 len1 = _fcdlen (str1);
00420 ptr1 = _fcdtocp (str1);
00421
00422 len2 = _fcdlen (str2);
00423 ptr2 = _fcdtocp (str2);
00424
00425
00426
00427 if (len1 == 0 || len2 == 0)
00428 return (0);
00429
00430
00431
00432
00433
00434
00435 #ifdef _UNICOS
00436 #pragma _CRI shortloop
00437 #endif
00438 for (i = 0; i < WORDS; i++)
00439 mask[i] = 0;
00440 for (i = 0; i < len2; i++)
00441 mask[ptr2[i] & MASK] |= 1 << (BITS - (ptr2[i] >> SHIFT));
00442
00443
00444
00445
00446
00447 if (!bck) {
00448 for (i = 0; i < len1; i++)
00449 if (FOUND(ptr1[i]))
00450 return (i+1);
00451 }
00452 else {
00453 for (i = len1-1; i >= 0; i--)
00454 if (FOUND(ptr1[i]))
00455 return (i+1);
00456 }
00457
00458
00459
00460 return (0);
00461 }
00462 #endif
00463
00464 #ifdef _F_INT1
00465
00466 #undef WORDS
00467 #undef BITS
00468 #undef MASK
00469 #undef SHIFT
00470
00471 #if defined(__mips) || defined(_LITTLE_ENDIAN)
00472 #define WORDS 32
00473 #define BITS 7
00474 #define MASK 037
00475 #define SHIFT 5
00476 #elif !defined(_WORD32)
00477 #define WORDS 4
00478 #define BITS 63
00479 #define MASK 03
00480 #define SHIFT 2
00481 #else
00482 #define WORDS 8
00483 #define BITS 31
00484 #define MASK 07
00485 #define SHIFT 3
00486 #endif
00487
00488 _f_int1
00489 _SCAN_1 (_fcd str1, _fcd str2, _f_log *back)
00490 {
00491 char *ptr1, *ptr2;
00492 long len1, len2;
00493 int bck, num;
00494 _f_int1 i;
00495 _f_int1 mask[WORDS];
00496
00497
00498
00499 #ifndef _UNICOS
00500 if (back != NULL && _ltob(back))
00501 bck = 1;
00502 else
00503 bck = 0;
00504 #else
00505 num = _numargs();
00506 #ifdef _ADDR64
00507 if (num == 2 * sizeof(_fcd) / sizeof(long))
00508 #else
00509 if (num == 2)
00510 #endif
00511 bck = 0;
00512 else if (back == NULL)
00513 bck = 0;
00514 else if (_ltob(back))
00515 bck = 1;
00516 else
00517 bck = 0;
00518 #endif
00519
00520
00521
00522 len1 = (_f_int1) _fcdlen (str1);
00523 ptr1 = _fcdtocp (str1);
00524
00525 len2 = (_f_int1) _fcdlen (str2);
00526 ptr2 = _fcdtocp (str2);
00527
00528
00529
00530 if (len1 == 0 || len2 == 0)
00531 return (0);
00532
00533
00534
00535
00536
00537
00538 #ifdef _UNICOS
00539 #pragma _CRI shortloop
00540 #endif
00541 for (i = 0; i < WORDS; i++)
00542 mask[i] = 0;
00543 for (i = 0; i < len2; i++)
00544 mask[ptr2[i] & MASK] |= 1 << (BITS - (ptr2[i] >> SHIFT));
00545
00546
00547
00548
00549
00550 if (!bck) {
00551 for (i = 0; i < len1; i++)
00552 if (FOUND(ptr1[i]))
00553 return (i+1);
00554 }
00555 else {
00556 for (i = len1-1; i >= 0; i--)
00557 if (FOUND(ptr1[i]))
00558 return (i+1);
00559 }
00560
00561
00562
00563 return (0);
00564 }
00565 #endif