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 #define _SCANNER_SOURCE_
00027
00028 #include <ctype.h>
00029 #include <stdio.h>
00030 #define _STDIO_INCLUDED_
00031 #include <string.h>
00032 #include <limits.h>
00033 #include <errno.h>
00034
00035 #include "setup.h"
00036 #include "constant.h"
00037 #include "envrnmnt.h"
00038 #include "router.h"
00039 #include "symbol.h"
00040 #include "utility.h"
00041 #include "memalloc.h"
00042 #include "sysdep.h"
00043
00044 #include "scanner.h"
00045
00046 #include <stdlib.h>
00047
00048
00049
00050
00051
00052 static void *ScanSymbol(void *,char *,int,unsigned short *);
00053 static void *ScanString(void *,char *);
00054 static void ScanNumber(void *,char *,struct token *);
00055 static void DeallocateScannerData(void *);
00056
00057
00058
00059
00060
00061 globle void InitializeScannerData(
00062 void *theEnv)
00063 {
00064 AllocateEnvironmentData(theEnv,SCANNER_DATA,sizeof(struct scannerData),DeallocateScannerData);
00065 }
00066
00067
00068
00069
00070
00071 static void DeallocateScannerData(
00072 void *theEnv)
00073 {
00074 if (ScannerData(theEnv)->GlobalMax != 0)
00075 { genfree(theEnv,ScannerData(theEnv)->GlobalString,ScannerData(theEnv)->GlobalMax); }
00076 }
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 globle void GetToken(
00087 void *theEnv,
00088 char *logicalName,
00089 struct token *theToken)
00090 {
00091 int inchar;
00092 unsigned short type;
00093
00094
00095
00096
00097
00098 theToken->type = UNKNOWN_VALUE;
00099 theToken->value = NULL;
00100 theToken->printForm = "unknown";
00101 ScannerData(theEnv)->GlobalPos = 0;
00102 ScannerData(theEnv)->GlobalMax = 0;
00103
00104
00105
00106
00107
00108
00109 inchar = EnvGetcRouter(theEnv,logicalName);
00110 while ((inchar == ' ') || (inchar == '\n') || (inchar == '\f') ||
00111 (inchar == '\r') || (inchar == ';') || (inchar == '\t'))
00112 {
00113
00114
00115
00116
00117 if (inchar == ';')
00118 {
00119 inchar = EnvGetcRouter(theEnv,logicalName);
00120 while ((inchar != '\n') && (inchar != '\r') && (inchar != EOF) )
00121 { inchar = EnvGetcRouter(theEnv,logicalName); }
00122 }
00123 inchar = EnvGetcRouter(theEnv,logicalName);
00124 }
00125
00126
00127
00128
00129
00130 if (isalpha(inchar) || IsUTF8MultiByteStart(inchar))
00131 {
00132 theToken->type = SYMBOL;
00133 EnvUngetcRouter(theEnv,inchar,logicalName);
00134 theToken->value = (void *) ScanSymbol(theEnv,logicalName,0,&type);
00135 theToken->printForm = ValueToString(theToken->value);
00136 }
00137
00138
00139
00140
00141
00142 else if (isdigit(inchar))
00143 {
00144 EnvUngetcRouter(theEnv,inchar,logicalName);
00145 ScanNumber(theEnv,logicalName,theToken);
00146 }
00147
00148 else switch (inchar)
00149 {
00150
00151
00152
00153
00154 case '"':
00155 theToken->value = (void *) ScanString(theEnv,logicalName);
00156 theToken->type = STRING;
00157 theToken->printForm = StringPrintForm(theEnv,ValueToString(theToken->value));
00158 break;
00159
00160
00161
00162
00163
00164 case '-':
00165 case '.':
00166 case '+':
00167 EnvUngetcRouter(theEnv,inchar,logicalName);
00168 ScanNumber(theEnv,logicalName,theToken);
00169 break;
00170
00171
00172
00173
00174
00175 case '?':
00176 inchar = EnvGetcRouter(theEnv,logicalName);
00177 if (isalpha(inchar) || IsUTF8MultiByteStart(inchar)
00178 #if DEFGLOBAL_CONSTRUCT
00179 || (inchar == '*'))
00180 #else
00181 )
00182 #endif
00183 {
00184 EnvUngetcRouter(theEnv,inchar,logicalName);
00185 theToken->value = (void *) ScanSymbol(theEnv,logicalName,0,&type);
00186 theToken->type = SF_VARIABLE;
00187 #if DEFGLOBAL_CONSTRUCT
00188 if ((ValueToString(theToken->value)[0] == '*') &&
00189 (((int) strlen(ValueToString(theToken->value))) > 1) &&
00190 (ValueToString(theToken->value)[strlen(ValueToString(theToken->value)) - 1] == '*'))
00191 {
00192 size_t count;
00193
00194 theToken->type = GBL_VARIABLE;
00195 theToken->printForm = AppendStrings(theEnv,"?",ValueToString(theToken->value));
00196 count = strlen(ScannerData(theEnv)->GlobalString);
00197 ScannerData(theEnv)->GlobalString[count-1] = EOS;
00198 theToken->value = EnvAddSymbol(theEnv,ScannerData(theEnv)->GlobalString+1);
00199 ScannerData(theEnv)->GlobalString[count-1] = (char) inchar;
00200
00201 }
00202 else
00203 #endif
00204 theToken->printForm = AppendStrings(theEnv,"?",ValueToString(theToken->value));
00205 }
00206 else
00207 {
00208 theToken->type = SF_WILDCARD;
00209 theToken->value = (void *) EnvAddSymbol(theEnv,"?");
00210 EnvUngetcRouter(theEnv,inchar,logicalName);
00211 theToken->printForm = "?";
00212 }
00213 break;
00214
00215
00216
00217
00218
00219 case '$':
00220 if ((inchar = EnvGetcRouter(theEnv,logicalName)) == '?')
00221 {
00222 inchar = EnvGetcRouter(theEnv,logicalName);
00223 if (isalpha(inchar) || IsUTF8MultiByteStart(inchar)
00224 #if DEFGLOBAL_CONSTRUCT
00225 || (inchar == '*'))
00226 #else
00227 )
00228 #endif
00229 {
00230 EnvUngetcRouter(theEnv,inchar,logicalName);
00231 theToken->value = (void *) ScanSymbol(theEnv,logicalName,0,&type);
00232 theToken->type = MF_VARIABLE;
00233 #if DEFGLOBAL_CONSTRUCT
00234 if ((ValueToString(theToken->value)[0] == '*') &&
00235 ((int) (strlen(ValueToString(theToken->value))) > 1) &&
00236 (ValueToString(theToken->value)[strlen(ValueToString(theToken->value)) - 1] == '*'))
00237 {
00238 size_t count;
00239
00240 theToken->type = MF_GBL_VARIABLE;
00241 theToken->printForm = AppendStrings(theEnv,"$?",ValueToString(theToken->value));
00242 count = strlen(ScannerData(theEnv)->GlobalString);
00243 ScannerData(theEnv)->GlobalString[count-1] = EOS;
00244 theToken->value = EnvAddSymbol(theEnv,ScannerData(theEnv)->GlobalString+1);
00245 ScannerData(theEnv)->GlobalString[count-1] = (char) inchar;
00246 }
00247 else
00248 #endif
00249 theToken->printForm = AppendStrings(theEnv,"$?",ValueToString(theToken->value));
00250 }
00251 else
00252 {
00253 theToken->type = MF_WILDCARD;
00254 theToken->value = (void *) EnvAddSymbol(theEnv,"$?");
00255 theToken->printForm = "$?";
00256 EnvUngetcRouter(theEnv,inchar,logicalName);
00257 }
00258 }
00259 else
00260 {
00261 theToken->type = SYMBOL;
00262 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,'$',ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00263 EnvUngetcRouter(theEnv,inchar,logicalName);
00264 theToken->value = (void *) ScanSymbol(theEnv,logicalName,1,&type);
00265 theToken->printForm = ValueToString(theToken->value);
00266 }
00267 break;
00268
00269
00270
00271
00272
00273 case '<':
00274 theToken->type = SYMBOL;
00275 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,'<',ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00276 theToken->value = (void *) ScanSymbol(theEnv,logicalName,1,&type);
00277 theToken->printForm = ValueToString(theToken->value);
00278 break;
00279
00280
00281
00282
00283
00284 case '(':
00285 theToken->type = LPAREN;
00286 theToken->value = (void *) EnvAddSymbol(theEnv,"(");
00287 theToken->printForm = "(";
00288 break;
00289
00290 case ')':
00291 theToken->type= RPAREN;
00292 theToken->value = (void *) EnvAddSymbol(theEnv,")");
00293 theToken->printForm = ")";
00294 break;
00295
00296 case '~':
00297 theToken->type = NOT_CONSTRAINT;
00298 theToken->value = (void *) EnvAddSymbol(theEnv,"~");
00299 theToken->printForm = "~";
00300 break;
00301
00302 case '|':
00303 theToken->type = OR_CONSTRAINT;
00304 theToken->value = (void *) EnvAddSymbol(theEnv,"|");
00305 theToken->printForm = "|";
00306 break;
00307
00308 case '&':
00309 theToken->type = AND_CONSTRAINT;
00310 theToken->value = (void *) EnvAddSymbol(theEnv,"&");
00311 theToken->printForm = "&";
00312 break;
00313
00314
00315
00316
00317
00318 case EOF:
00319 case 0:
00320 case 3:
00321 theToken->type = STOP;
00322 theToken->value = (void *) EnvAddSymbol(theEnv,"stop");
00323 theToken->printForm = "";
00324 break;
00325
00326
00327
00328
00329
00330 default:
00331 if (isprint(inchar))
00332 {
00333 EnvUngetcRouter(theEnv,inchar,logicalName);
00334 theToken->value = (void *) ScanSymbol(theEnv,logicalName,0,&type);
00335 theToken->type = type;
00336 theToken->printForm = ValueToString(theToken->value);
00337 }
00338 else
00339 { theToken->printForm = "<<<unprintable character>>>"; }
00340 break;
00341 }
00342
00343
00344
00345
00346
00347 #if (! RUN_TIME) && (! BLOAD_ONLY)
00348 if (theToken->type == INSTANCE_NAME)
00349 {
00350 SavePPBuffer(theEnv,"[");
00351 SavePPBuffer(theEnv,theToken->printForm);
00352 SavePPBuffer(theEnv,"]");
00353 }
00354 else
00355 { SavePPBuffer(theEnv,theToken->printForm); }
00356 #endif
00357
00358
00359
00360
00361
00362 if (ScannerData(theEnv)->GlobalString != NULL)
00363 {
00364 rm(theEnv,ScannerData(theEnv)->GlobalString,ScannerData(theEnv)->GlobalMax);
00365 ScannerData(theEnv)->GlobalString = NULL;
00366 ScannerData(theEnv)->GlobalMax = 0;
00367 ScannerData(theEnv)->GlobalPos = 0;
00368 }
00369
00370 return;
00371 }
00372
00373
00374
00375
00376 static void *ScanSymbol(
00377 void *theEnv,
00378 char *logicalName,
00379 int count,
00380 unsigned short *type)
00381 {
00382 int inchar;
00383 #if OBJECT_SYSTEM
00384 void *symbol;
00385 #endif
00386
00387
00388
00389
00390
00391
00392 inchar = EnvGetcRouter(theEnv,logicalName);
00393 while ( (inchar != '<') && (inchar != '"') &&
00394 (inchar != '(') && (inchar != ')') &&
00395 (inchar != '&') && (inchar != '|') && (inchar != '~') &&
00396 (inchar != ' ') && (inchar != ';') &&
00397 (isprint(inchar) ||
00398 IsUTF8MultiByteStart(inchar) ||
00399 IsUTF8MultiByteContinuation(inchar)))
00400 {
00401 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00402
00403 count++;
00404 inchar = EnvGetcRouter(theEnv,logicalName);
00405 }
00406
00407
00408
00409
00410
00411
00412
00413 EnvUngetcRouter(theEnv,inchar,logicalName);
00414
00415
00416
00417
00418
00419
00420
00421
00422 #if OBJECT_SYSTEM
00423 if (count > 2)
00424 {
00425 if ((ScannerData(theEnv)->GlobalString[0] == '[') ? (ScannerData(theEnv)->GlobalString[count-1] == ']') : FALSE)
00426 {
00427 *type = INSTANCE_NAME;
00428 inchar = ']';
00429 }
00430 else
00431 {
00432 *type = SYMBOL;
00433 return(EnvAddSymbol(theEnv,ScannerData(theEnv)->GlobalString));
00434 }
00435 ScannerData(theEnv)->GlobalString[count-1] = EOS;
00436 symbol = EnvAddSymbol(theEnv,ScannerData(theEnv)->GlobalString+1);
00437 ScannerData(theEnv)->GlobalString[count-1] = (char) inchar;
00438 return(symbol);
00439 }
00440 else
00441 {
00442 *type = SYMBOL;
00443 return(EnvAddSymbol(theEnv,ScannerData(theEnv)->GlobalString));
00444 }
00445 #else
00446 *type = SYMBOL;
00447 return(EnvAddSymbol(theEnv,ScannerData(theEnv)->GlobalString));
00448 #endif
00449 }
00450
00451
00452
00453
00454 static void *ScanString(
00455 void *theEnv,
00456 char *logicalName)
00457 {
00458 int inchar;
00459 size_t pos = 0;
00460 size_t max = 0;
00461 char *theString = NULL;
00462 void *thePtr;
00463
00464
00465
00466
00467
00468
00469 inchar = EnvGetcRouter(theEnv,logicalName);
00470 while ((inchar != '"') && (inchar != EOF))
00471 {
00472 if (inchar == '\\')
00473 { inchar = EnvGetcRouter(theEnv,logicalName); }
00474
00475 theString = ExpandStringWithChar(theEnv,inchar,theString,&pos,&max,max+80);
00476 inchar = EnvGetcRouter(theEnv,logicalName);
00477 }
00478
00479 if ((inchar == EOF) && (ScannerData(theEnv)->IgnoreCompletionErrors == FALSE))
00480 {
00481 PrintErrorID(theEnv,"SCANNER",1,TRUE);
00482 EnvPrintRouter(theEnv,WERROR,"Encountered End-Of-File while scanning a string\n");
00483 }
00484
00485
00486
00487
00488
00489
00490 if (theString == NULL)
00491 { thePtr = EnvAddSymbol(theEnv,""); }
00492 else
00493 {
00494 thePtr = EnvAddSymbol(theEnv,theString);
00495 rm(theEnv,theString,max);
00496 }
00497
00498 return(thePtr);
00499 }
00500
00501
00502
00503
00504 static void ScanNumber(
00505 void *theEnv,
00506 char *logicalName,
00507 struct token *theToken)
00508 {
00509 int count = 0;
00510 int inchar, phase;
00511 int digitFound = FALSE;
00512 int processFloat = FALSE;
00513 double fvalue;
00514 long long lvalue;
00515 unsigned short type;
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526 inchar = EnvGetcRouter(theEnv,logicalName);
00527 phase = -1;
00528
00529 while ((phase != 5) && (phase != 9))
00530 {
00531 if (phase == -1)
00532 {
00533 if (isdigit(inchar))
00534 {
00535 phase = 0;
00536 digitFound = TRUE;
00537 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00538 count++;
00539 }
00540 else if ((inchar == '+') || (inchar == '-'))
00541 {
00542 phase = 0;
00543 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00544 count++;
00545 }
00546 else if (inchar == '.')
00547 {
00548 processFloat = TRUE;
00549 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00550 count++;
00551 phase = 1;
00552 }
00553 else if ((inchar == 'E') || (inchar == 'e'))
00554 {
00555 processFloat = TRUE;
00556 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00557 count++;
00558 phase = 2;
00559 }
00560 else if ( (inchar == '<') || (inchar == '"') ||
00561 (inchar == '(') || (inchar == ')') ||
00562 (inchar == '&') || (inchar == '|') || (inchar == '~') ||
00563 (inchar == ' ') || (inchar == ';') ||
00564 (isprint(inchar) == 0) )
00565 { phase = 5; }
00566 else
00567 {
00568 phase = 9;
00569 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00570 count++;
00571 }
00572 }
00573 else if (phase == 0)
00574 {
00575 if (isdigit(inchar))
00576 {
00577 digitFound = TRUE;
00578 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00579 count++;
00580 }
00581 else if (inchar == '.')
00582 {
00583 processFloat = TRUE;
00584 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00585 count++;
00586 phase = 1;
00587 }
00588 else if ((inchar == 'E') || (inchar == 'e'))
00589 {
00590 processFloat = TRUE;
00591 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00592 count++;
00593 phase = 2;
00594 }
00595 else if ( (inchar == '<') || (inchar == '"') ||
00596 (inchar == '(') || (inchar == ')') ||
00597 (inchar == '&') || (inchar == '|') || (inchar == '~') ||
00598 (inchar == ' ') || (inchar == ';') ||
00599 ((isprint(inchar) == 0) && (! IsUTF8MultiByteStart(inchar))) )
00600 { phase = 5; }
00601 else
00602 {
00603 phase = 9;
00604 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00605 count++;
00606 }
00607 }
00608 else if (phase == 1)
00609 {
00610 if (isdigit(inchar))
00611 {
00612 digitFound = TRUE;
00613 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00614 count++;
00615 }
00616 else if ((inchar == 'E') || (inchar == 'e'))
00617 {
00618 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00619 count++;
00620 phase = 2;
00621 }
00622 else if ( (inchar == '<') || (inchar == '"') ||
00623 (inchar == '(') || (inchar == ')') ||
00624 (inchar == '&') || (inchar == '|') || (inchar == '~') ||
00625 (inchar == ' ') || (inchar == ';') ||
00626 ((isprint(inchar) == 0) && (! IsUTF8MultiByteStart(inchar))) )
00627 { phase = 5; }
00628 else
00629 {
00630 phase = 9;
00631 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00632 count++;
00633 }
00634 }
00635 else if (phase == 2)
00636 {
00637 if (isdigit(inchar))
00638 {
00639 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00640 count++;
00641 phase = 3;
00642 }
00643 else if ((inchar == '+') || (inchar == '-'))
00644 {
00645 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00646 count++;
00647 phase = 3;
00648 }
00649 else if ( (inchar == '<') || (inchar == '"') ||
00650 (inchar == '(') || (inchar == ')') ||
00651 (inchar == '&') || (inchar == '|') || (inchar == '~') ||
00652 (inchar == ' ') || (inchar == ';') ||
00653 ((isprint(inchar) == 0) && (! IsUTF8MultiByteStart(inchar))) )
00654 {
00655 digitFound = FALSE;
00656 phase = 5;
00657 }
00658 else
00659 {
00660 phase = 9;
00661 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00662 count++;
00663 }
00664 }
00665 else if (phase == 3)
00666 {
00667 if (isdigit(inchar))
00668 {
00669 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00670 count++;
00671 }
00672 else if ( (inchar == '<') || (inchar == '"') ||
00673 (inchar == '(') || (inchar == ')') ||
00674 (inchar == '&') || (inchar == '|') || (inchar == '~') ||
00675 (inchar == ' ') || (inchar == ';') ||
00676 ((isprint(inchar) == 0) && (! IsUTF8MultiByteStart(inchar))) )
00677 {
00678 if ((ScannerData(theEnv)->GlobalString[count-1] == '+') || (ScannerData(theEnv)->GlobalString[count-1] == '-'))
00679 { digitFound = FALSE; }
00680 phase = 5;
00681 }
00682 else
00683 {
00684 phase = 9;
00685 ScannerData(theEnv)->GlobalString = ExpandStringWithChar(theEnv,inchar,ScannerData(theEnv)->GlobalString,&ScannerData(theEnv)->GlobalPos,&ScannerData(theEnv)->GlobalMax,ScannerData(theEnv)->GlobalMax+80);
00686 count++;
00687 }
00688 }
00689
00690 if ((phase != 5) && (phase != 9))
00691 { inchar = EnvGetcRouter(theEnv,logicalName); }
00692 }
00693
00694 if (phase == 9)
00695 {
00696 theToken->value = (void *) ScanSymbol(theEnv,logicalName,count,&type);
00697 theToken->type = type;
00698 theToken->printForm = ValueToString(theToken->value);
00699 return;
00700 }
00701
00702
00703
00704
00705
00706
00707 EnvUngetcRouter(theEnv,inchar,logicalName);
00708
00709 if (! digitFound)
00710 {
00711 theToken->type = SYMBOL;
00712 theToken->value = (void *) EnvAddSymbol(theEnv,ScannerData(theEnv)->GlobalString);
00713 theToken->printForm = ValueToString(theToken->value);
00714 return;
00715 }
00716
00717 if (processFloat)
00718 {
00719 fvalue = atof(ScannerData(theEnv)->GlobalString);
00720 theToken->type = FLOAT;
00721 theToken->value = (void *) EnvAddDouble(theEnv,fvalue);
00722 theToken->printForm = FloatToString(theEnv,ValueToDouble(theToken->value));
00723 }
00724 else
00725 {
00726 errno = 0;
00727 #if WIN_MVC
00728 lvalue = _strtoi64(ScannerData(theEnv)->GlobalString,NULL,10);
00729 #else
00730 lvalue = strtoll(ScannerData(theEnv)->GlobalString,NULL,10);
00731 #endif
00732 if (errno)
00733 {
00734 PrintWarningID(theEnv,"SCANNER",1,FALSE);
00735 EnvPrintRouter(theEnv,WWARNING,"Over or underflow of long long integer.\n");
00736 }
00737 theToken->type = INTEGER;
00738 theToken->value = (void *) EnvAddLong(theEnv,lvalue);
00739 theToken->printForm = LongIntegerToString(theEnv,ValueToLong(theToken->value));
00740 }
00741
00742 return;
00743 }
00744
00745
00746
00747
00748 globle void CopyToken(
00749 struct token *destination,
00750 struct token *source)
00751 {
00752 destination->type = source->type;
00753 destination->value = source->value;
00754 destination->printForm = source->printForm;
00755 }
00756
00757
00758
00759
00760
00761 globle void ResetLineCount(
00762 void *theEnv)
00763 {
00764 ScannerData(theEnv)->LineCount = 0;
00765 }
00766
00767
00768
00769
00770 globle long GetLineCount(
00771 void *theEnv)
00772 {
00773 return(ScannerData(theEnv)->LineCount);
00774 }
00775
00776
00777
00778
00779
00780 globle void IncrementLineCount(
00781 void *theEnv)
00782 {
00783 ScannerData(theEnv)->LineCount++;
00784 }
00785
00786
00787
00788
00789
00790 globle void DecrementLineCount(
00791 void *theEnv)
00792 {
00793 ScannerData(theEnv)->LineCount--;
00794 }