Open64 (mfef90, whirl2f, and IR tools)
TAG: version-openad; SVN changeset: 916
|
00001 /* 00002 00003 Copyright (C) 2000, 2001 Silicon Graphics, Inc. All Rights Reserved. 00004 00005 This program is free software; you can redistribute it and/or modify it 00006 under the terms of version 2 of the GNU General Public License as 00007 published by the Free Software Foundation. 00008 00009 This program is distributed in the hope that it would be useful, but 00010 WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00012 00013 Further, this software is distributed without any warranty that it is 00014 free of the rightful claim of any third person regarding infringement 00015 or the like. Any license provided herein, whether implied or 00016 otherwise, applies only to this software file. Patent licenses, if 00017 any, provided herein do not apply to combinations of this program with 00018 other software, or any other product whatsoever. 00019 00020 You should have received a copy of the GNU General Public License along 00021 with this program; if not, write the Free Software Foundation, Inc., 59 00022 Temple Place - Suite 330, Boston MA 02111-1307, USA. 00023 00024 Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pky, 00025 Mountain View, CA 94043, or: 00026 00027 http://www.sgi.com 00028 00029 For further information regarding this notice, see: 00030 00031 http://oss.sgi.com/projects/GenInfo/NoticeExplan 00032 00033 */ 00034 00035 00036 00037 static char USMID[] = "\n@(#)5.0_pl/sources/cond_comp.c 5.8 09/21/99 00:21:13\n"; 00038 00039 /* 00040 * Linux workaround - not necessary for all linux machine 00041 */ 00042 /* #ifdef _LINUX_LINUX*/ 00043 # include <time.h> 00044 /* #else*/ 00045 # include <sys/time.h> 00046 /* #endif*/ 00047 00048 # include "defines.h" /* Machine dependent ifdefs */ 00049 00050 # include "host.m" /* Host machine dependent macros.*/ 00051 # include "host.h" /* Host machine dependent header.*/ 00052 # include "target.m" /* Target machine dependent macros.*/ 00053 # include "target.h" /* Target machine dependent header.*/ 00054 00055 # include "globals.m" 00056 # include "tokens.m" 00057 # include "sytb.m" 00058 # include "p_globals.m" 00059 # include "src_input.m" 00060 # include "cond_comp.m" 00061 # include "debug.m" 00062 00063 # include "globals.h" 00064 # include "tokens.h" 00065 # include "sytb.h" 00066 # include "p_globals.h" 00067 # include "cond_comp.h" 00068 00069 00070 /*****************************************************************\ 00071 |* function prototypes of static functions declared in this file *| 00072 \*****************************************************************/ 00073 00074 static void cc_get_token(boolean); 00075 static void cc_get_next_char(void); 00076 static void cc_get_stmt(void); 00077 static boolean parse_cc_add_opnd (opnd_type *); 00078 static boolean parse_cc_level_2 (opnd_type *); 00079 static boolean parse_cc_level_3 (opnd_type *); 00080 static boolean parse_cc_level_4 (opnd_type *); 00081 static boolean parse_cc_level_5 (opnd_type *); 00082 static boolean parse_cc_level_6 (opnd_type *); 00083 static boolean parse_cc_level_7 (opnd_type *); 00084 static boolean parse_cc_level_8 (opnd_type *); 00085 static boolean parse_cc_mult_opnd (opnd_type *); 00086 static boolean parse_cc_or_opnd (opnd_type *); 00087 static boolean parse_cc_equiv_opnd (opnd_type *); 00088 static int srch_cc_sym_tbl (char *,int, int *); 00089 static int ntr_cc_sym_tbl(cc_token_type *, int); 00090 static boolean parse_cc_expr (opnd_type *); 00091 static boolean parse_cc_operand (opnd_type *); 00092 static void flush_cc_line(void); 00093 static int fold_cc_expr(opnd_type *); 00094 static void parse_define_str(int); 00095 static void copy_define_str(int, int); 00096 static void scan_cc_line(void); 00097 static void find_line_and_col(int, int *, int *); 00098 static void shift_cc_stmt_buf(int, int); 00099 static void shift_nxt_line(int, int); 00100 static void scan_cc_macro(int, int); 00101 static boolean scan_fortran_macro(int, int, int); 00102 static int expanded_macro_len(int, cc_arg_type *); 00103 static void insert_macro(int, cc_arg_type *, int, int, int); 00104 static void cc_advance_idx(void); 00105 static void adjust_continued_macro(int, int *); 00106 static char *get_dynamic_predef_str(int, int); 00107 static void free_arg_entry(cc_arg_type *); 00108 static cc_arg_type *alloc_arg_entry(int); 00109 00110 00111 /******************************************************************************\ 00112 |* *| 00113 |* Description: *| 00114 |* Parse conditional compilation statements. *| 00115 |* *| 00116 |* Input parameters: *| 00117 |* NONE *| 00118 |* *| 00119 |* Output parameters: *| 00120 |* NONE *| 00121 |* *| 00122 |* Returns: *| 00123 |* NOTHING *| 00124 |* *| 00125 \******************************************************************************/ 00126 00127 boolean parse_cc_line(void) 00128 00129 { 00130 int attr_idx; 00131 char ch; 00132 int col; 00133 char delim; 00134 boolean include_found = FALSE; 00135 int line; 00136 int name_idx; 00137 opnd_type opnd; 00138 int str_idx; 00139 char str[MAX_SRC_LINE_SIZE]; 00140 00141 00142 TRACE (Func_Entry, "parse_cc_line", NULL); 00143 00144 cc_get_stmt(); 00145 00146 CC_NEXT_LA_CH; 00147 00148 if (CC_LA_CH_VALUE != pound) { 00149 find_line_and_col(cc_stmt_buf_idx, &line, &col); 00150 PRINTMSG(line, 1164, Internal, col, "parse_cc_line"); 00151 flush_cc_line(); 00152 } 00153 00154 CC_NEXT_LA_CH; 00155 00156 cc_get_token(TRUE); 00157 00158 switch (TOKEN_VALUE(cc_token)) { 00159 00160 case Cc_Tok_Kwd_Define : 00161 00162 if (! ignore_source_line) { 00163 00164 cc_get_token(FALSE); 00165 00166 if (TOKEN_VALUE(cc_token) == Cc_Tok_Id) { 00167 00168 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 00169 TOKEN_LEN(cc_token), 00170 &name_idx); 00171 00172 if (attr_idx != NULL_IDX) { 00173 00174 if (CC_AT_DEFINED(attr_idx)) { 00175 /* issue message about redefinition */ 00176 00177 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1670, Warning, 00178 TOKEN_COLUMN(cc_token), 00179 TOKEN_STR(cc_token), 00180 0, 00181 STR_ARG); 00182 } 00183 } 00184 else { 00185 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 00186 } 00187 00188 parse_define_str(attr_idx); 00189 } 00190 else { 00191 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1165, Error, 00192 TOKEN_COLUMN(cc_token), 00193 "IDENTIFIER", 00194 0, 00195 STR_ARG); 00196 flush_cc_line(); 00197 } 00198 } 00199 else { 00200 flush_cc_line(); 00201 } 00202 break; 00203 00204 case Cc_Tok_Kwd_Elif : 00205 00206 if (CC_CURR_BLK_TYPE == Cc_If_Blk || 00207 CC_CURR_BLK_TYPE == Cc_Ifdef_Blk || 00208 CC_CURR_BLK_TYPE == Cc_Ifndef_Blk || 00209 CC_CURR_BLK_TYPE == Cc_Elif_Blk) { 00210 00211 /* blk ok, change curr block to else block */ 00212 00213 00214 CC_CURR_BLK_TYPE = Cc_Elif_Blk; 00215 00216 if (CC_CURR_BLK_IS_ACTIVE) { 00217 00218 if (! CC_CURR_BLK_DONE) { 00219 00220 scan_cc_line(); 00221 00222 # if 0 00223 printf("%s", &(cc_stmt_buf[1])); 00224 # endif 00225 00226 if (CC_LA_CH_VALUE == EOS) { 00227 ntr_next_msg_queue(CC_LA_CH_LINE, 1165, Error, 00228 CC_LA_CH_COLUMN, 00229 "expression", 00230 0, 00231 STR_ARG); 00232 } 00233 else if (parse_cc_expr(&opnd)) { 00234 00235 if (fold_cc_expr(&opnd)) { 00236 00237 ignore_source_line = FALSE; 00238 } 00239 else { 00240 ignore_source_line = TRUE; 00241 } 00242 00243 CC_CURR_BLK_DONE = (ignore_source_line == FALSE); 00244 } 00245 else { 00246 flush_cc_line(); 00247 } 00248 } 00249 else { 00250 ignore_source_line = TRUE; 00251 flush_cc_line(); 00252 } 00253 } 00254 else { 00255 flush_cc_line(); 00256 } 00257 } 00258 else { 00259 /* blk_stk error */ 00260 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1166, Error, 00261 TOKEN_COLUMN(cc_token), 00262 "No matching IF, IFDEF, or IFNDEF directive", 00263 0, 00264 STR_ARG); 00265 flush_cc_line(); 00266 CC_CURR_BLK_IN_ERROR = TRUE; 00267 } 00268 00269 break; 00270 00271 case Cc_Tok_Kwd_Else : 00272 00273 if (CC_CURR_BLK_TYPE == Cc_If_Blk || 00274 CC_CURR_BLK_TYPE == Cc_Ifdef_Blk || 00275 CC_CURR_BLK_TYPE == Cc_Ifndef_Blk || 00276 CC_CURR_BLK_TYPE == Cc_Elif_Blk) { 00277 00278 /* blk ok, change curr block to else block */ 00279 00280 00281 CC_CURR_BLK_TYPE = Cc_Else_Blk; 00282 00283 if (CC_CURR_BLK_IS_ACTIVE) { 00284 00285 if (! CC_CURR_BLK_DONE) { 00286 ignore_source_line = FALSE; 00287 CC_CURR_BLK_DONE = TRUE; 00288 } 00289 else { 00290 ignore_source_line = TRUE; 00291 } 00292 } 00293 } 00294 else { 00295 /* blk error */ 00296 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1166, Error, 00297 TOKEN_COLUMN(cc_token), 00298 "No matching IF, IFDEF, or IFNDEF directive", 00299 0, 00300 STR_ARG); 00301 CC_CURR_BLK_IN_ERROR = TRUE; 00302 } 00303 00304 flush_cc_line(); 00305 break; 00306 00307 case Cc_Tok_Kwd_Endif : 00308 00309 if (CC_CURR_BLK_TYPE == Cc_If_Blk || 00310 CC_CURR_BLK_TYPE == Cc_Ifdef_Blk || 00311 CC_CURR_BLK_TYPE == Cc_Ifndef_Blk || 00312 CC_CURR_BLK_TYPE == Cc_Elif_Blk || 00313 CC_CURR_BLK_TYPE == Cc_Else_Blk) { 00314 00315 if (CC_CURR_BLK_IS_ACTIVE) { 00316 ignore_source_line = FALSE; 00317 } 00318 00319 /* blk ok, pop off the block */ 00320 00321 POP_CC_BLK_STK; 00322 00323 } 00324 else { 00325 /* blk error */ 00326 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1166, Error, 00327 TOKEN_COLUMN(cc_token), 00328 "No matching IF, IFDEF, or IFNDEF directive", 00329 0, 00330 STR_ARG); 00331 CC_CURR_BLK_IN_ERROR = TRUE; 00332 } 00333 00334 flush_cc_line(); 00335 break; 00336 00337 case Cc_Tok_Kwd_If : 00338 00339 PUSH_CC_BLK_STK(Cc_If_Blk); 00340 00341 if (! ignore_source_line) { 00342 00343 CC_CURR_BLK_IS_ACTIVE = TRUE; 00344 00345 scan_cc_line(); 00346 00347 # if 0 00348 printf("%s", &(cc_stmt_buf[1])); 00349 # endif 00350 if (CC_LA_CH_VALUE == EOS) { 00351 ntr_next_msg_queue(CC_LA_CH_LINE, 1165, Error, 00352 CC_LA_CH_COLUMN, 00353 "expression", 00354 0, 00355 STR_ARG); 00356 } 00357 else if (parse_cc_expr(&opnd)) { 00358 00359 if (fold_cc_expr(&opnd)) { 00360 00361 ignore_source_line = FALSE; 00362 } 00363 else { 00364 ignore_source_line = TRUE; 00365 } 00366 00367 CC_CURR_BLK_DONE = (ignore_source_line == FALSE); 00368 } 00369 else { 00370 flush_cc_line(); 00371 } 00372 } 00373 else { 00374 flush_cc_line(); 00375 } 00376 break; 00377 00378 case Cc_Tok_Kwd_Ifdef : 00379 00380 PUSH_CC_BLK_STK(Cc_Ifdef_Blk); 00381 00382 if (! ignore_source_line) { 00383 00384 CC_CURR_BLK_IS_ACTIVE = TRUE; 00385 00386 cc_get_token(FALSE); 00387 00388 if (TOKEN_VALUE(cc_token) == Cc_Tok_Id) { 00389 00390 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 00391 TOKEN_LEN(cc_token), 00392 &name_idx); 00393 00394 if (attr_idx != NULL_IDX) { 00395 00396 if (CC_AT_DEFINED(attr_idx)) { 00397 ignore_source_line = FALSE; 00398 } 00399 else { 00400 ignore_source_line = TRUE; 00401 } 00402 } 00403 else { 00404 ignore_source_line = TRUE; 00405 } 00406 00407 CC_CURR_BLK_DONE = (ignore_source_line == FALSE); 00408 } 00409 else { 00410 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1165, Error, 00411 TOKEN_COLUMN(cc_token), 00412 "IDENTIFIER", 00413 0, 00414 STR_ARG); 00415 } 00416 00417 flush_cc_line(); 00418 } 00419 else { 00420 flush_cc_line(); 00421 } 00422 break; 00423 00424 case Cc_Tok_Kwd_Ifndef : 00425 00426 PUSH_CC_BLK_STK(Cc_Ifndef_Blk); 00427 00428 if (! ignore_source_line) { 00429 00430 CC_CURR_BLK_IS_ACTIVE = TRUE; 00431 00432 cc_get_token(FALSE); 00433 00434 if (TOKEN_VALUE(cc_token) == Cc_Tok_Id) { 00435 00436 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 00437 TOKEN_LEN(cc_token), 00438 &name_idx); 00439 00440 if (attr_idx != NULL_IDX) { 00441 00442 if (CC_AT_DEFINED(attr_idx)) { 00443 ignore_source_line = TRUE; 00444 } 00445 else { 00446 ignore_source_line = FALSE; 00447 } 00448 } 00449 else { 00450 ignore_source_line = FALSE; 00451 } 00452 00453 CC_CURR_BLK_DONE = (ignore_source_line == FALSE); 00454 } 00455 else { 00456 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1165, Error, 00457 TOKEN_COLUMN(cc_token), 00458 "IDENTIFIER", 00459 0, 00460 STR_ARG); 00461 } 00462 00463 flush_cc_line(); 00464 } 00465 else { 00466 flush_cc_line(); 00467 } 00468 break; 00469 00470 case Cc_Tok_Kwd_Include : 00471 00472 if (! ignore_source_line) { 00473 00474 if (CC_LA_CH_VALUE == quote || 00475 CC_LA_CH_VALUE == db_quote || 00476 CC_LA_CH_VALUE == '<') { 00477 00478 if (CC_LA_CH_VALUE == '<') { 00479 delim = '>'; 00480 angle_brkt_include = TRUE; 00481 } 00482 else { 00483 delim = CC_LA_CH_VALUE; 00484 } 00485 00486 str_idx = 0; 00487 00488 while ((ch = cc_stmt_buf[++cc_stmt_buf_idx]) != delim && 00489 ch != eos) { 00490 00491 if (str_idx < MAX_FILE_NAME_SIZE) { 00492 include_file[str_idx++] = ch; 00493 } 00494 else if (str_idx == MAX_FILE_NAME_SIZE) { 00495 00496 /* Include file name length exceeds maximum. */ 00497 00498 find_line_and_col(cc_stmt_buf_idx, &line, &col); 00499 ntr_next_msg_queue(line, 57, Error, 00500 col, 00501 (char *)NULL, 00502 (MAX_FILE_NAME_SIZE - 1), 00503 ARG_ARG); 00504 flush_cc_line(); 00505 break; 00506 } 00507 } 00508 00509 include_file[str_idx] = '\0'; 00510 00511 if (str_idx == NULL_IDX) { /* Include file name missing. */ 00512 find_line_and_col(cc_stmt_buf_idx, &line, &col); 00513 ntr_next_msg_queue(line, 58, Error, 00514 col, 00515 (char *)NULL, 00516 0, 00517 NO_ARG); 00518 } 00519 else if (ch == eos) { /* Missing delimiter on include file name*/ 00520 find_line_and_col(cc_stmt_buf_idx, &line, &col); 00521 ntr_next_msg_queue(line, 59, Error, 00522 col, 00523 (char *)NULL, 00524 0, 00525 NO_ARG); 00526 } 00527 else { /* check for comments */ 00528 include_found = TRUE; 00529 } 00530 } 00531 else { 00532 find_line_and_col(cc_stmt_buf_idx, &line, &col); 00533 ntr_next_msg_queue(line, 1165, Error, 00534 col, 00535 "INCLUDE file name", 00536 0, 00537 STR_ARG); 00538 } 00539 } 00540 00541 flush_cc_line(); 00542 break; 00543 00544 case Cc_Tok_Kwd_Undef : 00545 00546 if (! ignore_source_line) { 00547 00548 cc_get_token(FALSE); 00549 00550 if (TOKEN_VALUE(cc_token) == Cc_Tok_Id) { 00551 00552 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 00553 TOKEN_LEN(cc_token), 00554 &name_idx); 00555 00556 if (attr_idx != NULL_IDX) { 00557 CC_AT_DEFINED(attr_idx) = FALSE; 00558 } 00559 else { 00560 /* enter it in the symbol table for now BHJ */ 00561 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 00562 } 00563 } 00564 else { 00565 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1165, Error, 00566 TOKEN_COLUMN(cc_token), 00567 "IDENTIFIER", 00568 0, 00569 STR_ARG); 00570 } 00571 00572 flush_cc_line(); 00573 } 00574 else { 00575 flush_cc_line(); 00576 } 00577 break; 00578 00579 case Cc_Tok_Kwd_Error : 00580 00581 if (! ignore_source_line) { 00582 00583 str_idx = 0; 00584 00585 while (cc_stmt_buf_idx < MAX_SRC_LINE_SIZE && 00586 (ch = cc_stmt_buf[cc_stmt_buf_idx]) != eos && 00587 ch != newline) { 00588 00589 str[str_idx] = ch; 00590 str_idx++; 00591 cc_stmt_buf_idx++; 00592 } 00593 00594 str[str_idx] = '\0'; 00595 00596 if (cc_line_continued) { 00597 /* error, can't continue error line */ 00598 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1178, Error, 00599 TOKEN_COLUMN(cc_token), 00600 (char *)NULL, 00601 0, 00602 NO_ARG); 00603 } 00604 00605 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1177, Error, 00606 TOKEN_COLUMN(cc_token), 00607 str, 00608 0, 00609 STR_ARG); 00610 00611 flush_cc_line(); 00612 } 00613 else { 00614 flush_cc_line(); 00615 } 00616 break; 00617 00618 case Cc_Tok_EOS : 00619 break; 00620 00621 case Cc_Tok_Constant: 00622 /* this is a pound line directive coming in. Ftpp just ignored */ 00623 /* these, so I will too. */ 00624 flush_cc_line(); 00625 break; 00626 00627 default: 00628 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1165, Error, 00629 TOKEN_COLUMN(cc_token), 00630 "conditional compilation directive", 00631 0, 00632 STR_ARG); 00633 flush_cc_line(); 00634 break; 00635 } 00636 00637 if (CC_LA_CH_VALUE != EOS) { 00638 ntr_next_msg_queue(CC_LA_CH_LINE, 1165, Error, 00639 CC_LA_CH_COLUMN, 00640 EOS_STR, 00641 0, 00642 STR_ARG); 00643 flush_cc_line(); 00644 } 00645 00646 TRACE (Func_Exit, "parse_cc_line", NULL); 00647 00648 return(include_found); 00649 00650 } /* parse_cc_line */ 00651 00652 /******************************************************************************\ 00653 |* *| 00654 |* Description: *| 00655 |* <description> *| 00656 |* *| 00657 |* Input parameters: *| 00658 |* NONE *| 00659 |* *| 00660 |* Output parameters: *| 00661 |* NONE *| 00662 |* *| 00663 |* Returns: *| 00664 |* NOTHING *| 00665 |* *| 00666 \******************************************************************************/ 00667 00668 static void parse_define_str(int attr_idx) 00669 00670 { 00671 int arg_num; 00672 int id_start_idx; 00673 int i; 00674 int start_idx; 00675 cc_darg_type *arg_head = NULL; 00676 cc_darg_type *arg_tail = NULL; 00677 00678 00679 TRACE (Func_Entry, "parse_define_str", NULL); 00680 00681 if (CC_LA_CH_VALUE == LPAREN && 00682 cc_stmt_buf[cc_stmt_buf_idx-1] != blank && 00683 cc_stmt_buf[cc_stmt_buf_idx-1] != tab && 00684 cc_stmt_buf[cc_stmt_buf_idx-1] != '/') { 00685 /* macro with arguments. */ 00686 00687 CC_NEXT_LA_CH; 00688 CC_AT_NUM_ARGS(attr_idx) = 0; 00689 00690 while (CC_LA_CH_VALUE != RPAREN) { 00691 cc_get_token(FALSE); 00692 00693 if (TOKEN_VALUE(cc_token) == Cc_Tok_Id) { 00694 if (arg_head == NULL) { 00695 arg_head = (cc_darg_type *)malloc(sizeof(cc_darg_type)); 00696 arg_head->next = NULL; 00697 arg_tail = arg_head; 00698 } 00699 else { 00700 arg_tail->next = (cc_darg_type *)malloc(sizeof(cc_darg_type)); 00701 arg_tail = arg_tail->next; 00702 arg_tail->next = NULL; 00703 } 00704 00705 for (i = 0; i < CC_NUM_ID_WDS; i++) { 00706 arg_tail->name.words[i] = TOKEN_STR_WD(cc_token, i); 00707 } 00708 arg_tail->name_len = TOKEN_LEN(cc_token); 00709 CC_AT_NUM_ARGS(attr_idx) += 1; 00710 # if 0 00711 printf("arg %d = >%s<\n", CC_AT_NUM_ARGS(attr_idx), 00712 arg_tail->name.string); 00713 # endif 00714 } 00715 else { 00716 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1165, Error, 00717 TOKEN_COLUMN(cc_token), 00718 "IDENTIFIER", 00719 0, 00720 STR_ARG); 00721 } 00722 00723 if (CC_LA_CH_VALUE == COMMA) { 00724 CC_NEXT_LA_CH; 00725 } 00726 else if (CC_LA_CH_VALUE != RPAREN) { 00727 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1165, Error, 00728 TOKEN_COLUMN(cc_token), 00729 ")", 00730 0, 00731 STR_ARG); 00732 flush_cc_line(); 00733 goto EXIT; 00734 } 00735 } 00736 00737 /* swallow RPAREN */ 00738 CC_NEXT_LA_CH; 00739 00740 start_idx = cc_stmt_buf_idx; 00741 00742 if (CC_LA_CH_VALUE == EOS) { 00743 CC_AT_STR_LEN(attr_idx) = 0; 00744 CC_AT_DEFINED(attr_idx) = TRUE; 00745 goto EXIT; 00746 } 00747 00748 while (CC_LA_CH_VALUE != EOS) { 00749 if (CC_LA_CH_CLASS == Ch_Class_Letter || 00750 CC_LA_CH_VALUE == underscore) { 00751 00752 id_start_idx = cc_stmt_buf_idx; 00753 cc_get_token(FALSE); 00754 00755 if (TOKEN_VALUE(cc_token) == Cc_Tok_Id) { 00756 00757 if (strcmp(TOKEN_STR(cc_token), CC_AT_NAME_PTR(attr_idx)) 00758 == 0) { 00759 /* recursive macro definition */ 00760 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1549, Warning, 00761 TOKEN_COLUMN(cc_token), 00762 TOKEN_STR(cc_token), 00763 0, 00764 STR_ARG); 00765 flush_cc_line(); 00766 goto EXIT; 00767 } 00768 else { 00769 arg_num = 1; 00770 arg_tail = arg_head; 00771 while (arg_tail != NULL) { 00772 00773 if (strcmp(TOKEN_STR(cc_token), arg_tail->name.string) 00774 == 0) { 00775 # if 0 00776 printf("found match for %s\n", TOKEN_STR(cc_token)); 00777 # endif 00778 00779 shift_cc_stmt_buf(id_start_idx+TOKEN_LEN(cc_token), 00780 3 - TOKEN_LEN(cc_token)); 00781 00782 cc_stmt_buf[id_start_idx] = '\001'; 00783 cc_stmt_buf[id_start_idx+1] = TOKEN_LEN(cc_token); 00784 cc_stmt_buf[id_start_idx+2] = arg_num; 00785 00786 cc_stmt_buf_idx = id_start_idx+2; 00787 CC_NEXT_LA_CH; 00788 break; 00789 } 00790 arg_tail = arg_tail->next; 00791 arg_num++; 00792 } 00793 } 00794 } 00795 } 00796 else { 00797 CC_NEXT_LA_CH; 00798 } 00799 } 00800 00801 copy_define_str(attr_idx, start_idx); 00802 00803 flush_cc_line(); 00804 00805 # if 0 00806 printf("len = %d >%s<\n", len, CC_AT_STR_PTR(attr_idx)); 00807 # endif 00808 } 00809 else if (CC_LA_CH_VALUE == EOS) { 00810 CC_AT_NUM_ARGS(attr_idx) = 0; 00811 CC_AT_STR_LEN(attr_idx) = 0; 00812 00813 } 00814 else { 00815 start_idx = cc_stmt_buf_idx; 00816 00817 while (CC_LA_CH_VALUE != EOS) { 00818 if (CC_LA_CH_CLASS == Ch_Class_Letter || 00819 CC_LA_CH_VALUE == underscore) { 00820 00821 id_start_idx = cc_stmt_buf_idx; 00822 cc_get_token(FALSE); 00823 00824 if (TOKEN_VALUE(cc_token) == Cc_Tok_Id) { 00825 00826 if (strcmp(TOKEN_STR(cc_token), CC_AT_NAME_PTR(attr_idx)) 00827 == 0) { 00828 /* recursive macro definition */ 00829 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1549, Warning, 00830 TOKEN_COLUMN(cc_token), 00831 TOKEN_STR(cc_token), 00832 0, 00833 STR_ARG); 00834 flush_cc_line(); 00835 goto EXIT; 00836 } 00837 } 00838 } 00839 else { 00840 CC_NEXT_LA_CH; 00841 } 00842 } 00843 00844 CC_AT_NUM_ARGS(attr_idx) = 0; 00845 00846 copy_define_str(attr_idx, start_idx); 00847 00848 flush_cc_line(); 00849 00850 # if 0 00851 printf(">%s<\n", CC_AT_STR_PTR(attr_idx)); 00852 # endif 00853 } 00854 00855 CC_AT_DEFINED(attr_idx) = TRUE; 00856 00857 EXIT: 00858 00859 while (arg_head != NULL) { 00860 arg_tail = arg_head->next; 00861 free(arg_head); 00862 arg_head = arg_tail; 00863 } 00864 00865 TRACE (Func_Exit, "parse_define_str", NULL); 00866 00867 return; 00868 00869 } /* parse_define_str */ 00870 00871 /******************************************************************************\ 00872 |* *| 00873 |* Description: *| 00874 |* <description> *| 00875 |* *| 00876 |* Input parameters: *| 00877 |* NONE *| 00878 |* *| 00879 |* Output parameters: *| 00880 |* NONE *| 00881 |* *| 00882 |* Returns: *| 00883 |* NOTHING *| 00884 |* *| 00885 \******************************************************************************/ 00886 00887 static void copy_define_str(int attr_idx, 00888 int start_idx) 00889 00890 { 00891 char *char_ptr; 00892 int col; 00893 int idx; 00894 int len; 00895 int line; 00896 int wd_len; 00897 00898 TRACE (Func_Entry, "copy_define_str", NULL); 00899 00900 idx = start_idx; 00901 00902 len = 0; 00903 00904 while (cc_stmt_buf[idx] != newline) { 00905 if (cc_stmt_buf[idx] == '/' && 00906 cc_stmt_buf[idx+1] == '*') { 00907 /* don't count comments */ 00908 idx += 2; 00909 while (! (cc_stmt_buf[idx] == '*' && 00910 cc_stmt_buf[idx + 1] == '/') && 00911 cc_stmt_buf[idx] != newline) { 00912 idx++; 00913 } 00914 00915 if (cc_stmt_buf[idx] != newline) { 00916 idx++; 00917 } 00918 } 00919 else if (cc_stmt_buf[idx] == '\001') { 00920 /* macro argument insertion point */ 00921 /* skip ahead 3 chars */ 00922 idx += 2; 00923 len += 3; 00924 } 00925 else { 00926 len++; 00927 } 00928 idx++; 00929 } 00930 00931 idx--; 00932 00933 while (cc_stmt_buf[idx] == blank || 00934 cc_stmt_buf[idx] == tab || 00935 (cc_stmt_buf[idx] == '/' && 00936 cc_stmt_buf[idx-1] == '*')) { 00937 00938 if (cc_stmt_buf[idx] == '/' && 00939 cc_stmt_buf[idx-1] == '*') { 00940 00941 idx -= 2; 00942 while (! (cc_stmt_buf[idx] == '*' && 00943 cc_stmt_buf[idx - 1] == '/')) { 00944 idx--; 00945 } 00946 idx--; 00947 } 00948 else { 00949 len--; 00950 } 00951 00952 idx--; 00953 } 00954 00955 find_line_and_col(start_idx, &line, &col); 00956 CC_AT_START_LINE(attr_idx) = line; 00957 CC_AT_START_COL(attr_idx) = col; 00958 00959 if (len > 512) { 00960 ntr_next_msg_queue(line, 1630, Error, col, 00961 CC_AT_NAME_PTR(attr_idx), 00962 512, 00963 STR_ARG_ARG); 00964 } 00965 00966 CC_AT_STR_LEN(attr_idx) = len; 00967 00968 wd_len = WORD_LEN(len); 00969 CC_AT_STR_IDX(attr_idx) = str_pool_idx + 1; 00970 TBL_REALLOC_CK(str_pool,wd_len); 00971 00972 str_pool[CC_AT_STR_IDX(attr_idx) + wd_len - 1].name_long = 0; 00973 00974 char_ptr = CC_AT_STR_PTR(attr_idx); 00975 00976 while (len > 0) { 00977 if (cc_stmt_buf[start_idx] == '/' && 00978 cc_stmt_buf[start_idx+1] == '*') { 00979 /* comment */ 00980 00981 start_idx += 2; 00982 while (! (cc_stmt_buf[start_idx] == '*' && 00983 cc_stmt_buf[start_idx + 1] == '/') && 00984 cc_stmt_buf[start_idx] != newline) { 00985 start_idx++; 00986 } 00987 00988 if (cc_stmt_buf[start_idx] != newline) { 00989 start_idx++; 00990 } 00991 } 00992 else { 00993 *char_ptr = cc_stmt_buf[start_idx]; 00994 char_ptr++; 00995 len--; 00996 } 00997 start_idx++; 00998 } 00999 01000 TRACE (Func_Exit, "copy_define_str", NULL); 01001 01002 return; 01003 01004 } /* copy_define_str */ 01005 01006 /******************************************************************************\ 01007 |* *| 01008 |* Description: *| 01009 |* <description> *| 01010 |* *| 01011 |* Input parameters: *| 01012 |* NONE *| 01013 |* *| 01014 |* Output parameters: *| 01015 |* NONE *| 01016 |* *| 01017 |* Returns: *| 01018 |* NOTHING *| 01019 |* *| 01020 \******************************************************************************/ 01021 01022 static void scan_cc_line(void) 01023 01024 { 01025 int attr_idx; 01026 char *char_ptr; 01027 int col; 01028 int i; 01029 int id_start_idx; 01030 int len; 01031 int line; 01032 int name_idx; 01033 int paren_cnt = 0; 01034 int save_cc_stmt_buf_idx; 01035 01036 TRACE (Func_Entry, "scan_cc_line", NULL); 01037 01038 save_cc_stmt_buf_idx = cc_stmt_buf_idx; 01039 01040 while (CC_LA_CH_VALUE != EOS) { 01041 if (CC_LA_CH_CLASS == Ch_Class_Letter || 01042 CC_LA_CH_VALUE == underscore) { 01043 01044 id_start_idx = cc_stmt_buf_idx; 01045 cc_get_token(TRUE); 01046 01047 switch (TOKEN_VALUE(cc_token)) { 01048 01049 case Cc_Tok_Id : 01050 case Cc_Tok_Kwd_Define : 01051 case Cc_Tok_Kwd_Elif : 01052 case Cc_Tok_Kwd_Else : 01053 case Cc_Tok_Kwd_Endif : 01054 case Cc_Tok_Kwd_If : 01055 case Cc_Tok_Kwd_Ifdef : 01056 case Cc_Tok_Kwd_Ifndef : 01057 case Cc_Tok_Kwd_Include : 01058 case Cc_Tok_Kwd_Undef : 01059 01060 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 01061 TOKEN_LEN(cc_token), 01062 &name_idx); 01063 01064 if (attr_idx != NULL_IDX && 01065 CC_AT_DEFINED(attr_idx)) { 01066 01067 if (CC_AT_NUM_ARGS(attr_idx) == 0) { 01068 01069 if (CC_AT_DYNAMIC_PREDEF(attr_idx)) { 01070 find_line_and_col(id_start_idx, &line, &col); 01071 char_ptr = get_dynamic_predef_str(attr_idx, line); 01072 len = strlen(char_ptr); 01073 } 01074 else { 01075 char_ptr = CC_AT_STR_PTR(attr_idx); 01076 len = CC_AT_STR_LEN(attr_idx); 01077 } 01078 01079 shift_cc_stmt_buf(id_start_idx+TOKEN_LEN(cc_token), 01080 len - TOKEN_LEN(cc_token)); 01081 01082 01083 for (i = 0; i < len; i++) { 01084 cc_stmt_buf[i+id_start_idx] = char_ptr[i]; 01085 } 01086 01087 cc_stmt_buf_idx = id_start_idx - 1; 01088 CC_NEXT_LA_CH; 01089 } 01090 else { 01091 01092 scan_cc_macro(attr_idx, id_start_idx); 01093 } 01094 } 01095 break; 01096 01097 case Cc_Tok_Kwd_Defined : 01098 /* just parse through this, it is evaluated later */ 01099 01100 while (CC_LA_CH_VALUE == '(') { 01101 paren_cnt++; 01102 CC_NEXT_LA_CH; 01103 } 01104 01105 cc_get_token(FALSE); 01106 01107 while (paren_cnt) { 01108 if (CC_LA_CH_VALUE != ')') { 01109 flush_cc_line(); 01110 break; 01111 } 01112 else { 01113 CC_NEXT_LA_CH; 01114 paren_cnt--; 01115 } 01116 } 01117 break; 01118 } 01119 } 01120 else { 01121 CC_NEXT_LA_CH; 01122 } 01123 } 01124 01125 cc_stmt_buf_idx = save_cc_stmt_buf_idx - 1; 01126 CC_NEXT_LA_CH; 01127 01128 TRACE (Func_Exit, "scan_cc_line", NULL); 01129 01130 return; 01131 01132 } /* scan_cc_line */ 01133 01134 /******************************************************************************\ 01135 |* *| 01136 |* Description: *| 01137 |* <description> *| 01138 |* *| 01139 |* Input parameters: *| 01140 |* NONE *| 01141 |* *| 01142 |* Output parameters: *| 01143 |* NONE *| 01144 |* *| 01145 |* Returns: *| 01146 |* NOTHING *| 01147 |* *| 01148 \******************************************************************************/ 01149 01150 static void cc_advance_idx(void) 01151 01152 { 01153 int i; 01154 int save_pp_line_idx; 01155 01156 TRACE (Func_Entry, "cc_advance_idx", NULL); 01157 01158 save_pp_line_idx = pp_line_idx; 01159 prev_idx = cc_stmt_buf_idx; 01160 01161 cc_stmt_buf_idx++; 01162 01163 while (PP_LINE_TYPE == Comment_Line || 01164 cc_stmt_buf_idx == PP_EOL) { 01165 01166 /* advance to next line */ 01167 01168 pp_line_idx++; 01169 01170 if (pp_line_idx > end_stmt_line_idx || 01171 (PP_LINE_TYPE != Continuation_Line && 01172 PP_LINE_TYPE != Dir_Continuation_Line)) { 01173 01174 cc_stmt_buf_idx = nxt_line_end_idx[save_pp_line_idx]; 01175 break; 01176 } 01177 01178 if (source_form == Fixed_Form && 01179 PP_LINE_TYPE == Continuation_Line) { 01180 cc_stmt_buf_idx = NULL_IDX; 01181 01182 for (i = NXT_COL(1); i < PP_IDX; i++) { 01183 if (VALID_CC_ID_CHAR(nxt_line[i])) { 01184 cc_stmt_buf_idx = i; 01185 break; 01186 } 01187 } 01188 01189 if (cc_stmt_buf_idx == NULL_IDX) { 01190 cc_stmt_buf_idx = PP_IDX + 1; 01191 } 01192 } 01193 else { 01194 cc_stmt_buf_idx = PP_IDX + 1; 01195 } 01196 } 01197 01198 TRACE (Func_Exit, "cc_advance_idx", NULL); 01199 01200 return; 01201 01202 } /* cc_advance_idx */ 01203 01204 /******************************************************************************\ 01205 |* *| 01206 |* Description: *| 01207 |* <description> *| 01208 |* *| 01209 |* Input parameters: *| 01210 |* NONE *| 01211 |* *| 01212 |* Output parameters: *| 01213 |* NONE *| 01214 |* *| 01215 |* Returns: *| 01216 |* NOTHING *| 01217 |* *| 01218 \******************************************************************************/ 01219 01220 boolean scan_fixed_comment(void) 01221 01222 { 01223 int attr_idx; 01224 char *char_ptr; 01225 int col; 01226 boolean found_macro = FALSE; 01227 int i; 01228 int id_start_idx; 01229 int len; 01230 int macro_len; 01231 int name_idx; 01232 int save_pp_line_idx; 01233 01234 TRACE (Func_Entry, "scan_fixed_comment", NULL); 01235 01236 save_pp_line_idx = pp_line_idx; 01237 01238 end_stmt_line_idx = pp_line_idx; 01239 01240 cc_stmt_buf_idx = NXT_COL(0); 01241 01242 /* reset line type for now */ 01243 01244 PP_LINE_TYPE = Regular_Line; 01245 cc_advance_idx(); 01246 01247 id_start_idx = NXT_COL(1); 01248 col = nxt_line_col[NXT_COL(1)]; 01249 01250 CC_GET_ID_TOKEN; 01251 01252 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 01253 TOKEN_LEN(cc_token), 01254 &name_idx); 01255 01256 if (attr_idx != NULL_IDX && 01257 CC_AT_DEFINED(attr_idx)) { 01258 01259 found_macro = TRUE; 01260 01261 if (CC_AT_NUM_ARGS(attr_idx) == 0) { 01262 01263 if (CC_AT_DYNAMIC_PREDEF(attr_idx)) { 01264 char_ptr = get_dynamic_predef_str(attr_idx, 01265 TOKEN_LINE(cc_token)); 01266 len = strlen(char_ptr); 01267 } 01268 else { 01269 char_ptr = CC_AT_STR_PTR(attr_idx); 01270 len = CC_AT_STR_LEN(attr_idx); 01271 } 01272 01273 macro_len = (prev_idx - id_start_idx) + 1; 01274 shift_nxt_line(id_start_idx + macro_len, 01275 len - macro_len); 01276 01277 for (i = 0; i < len; i++) { 01278 nxt_line[i+id_start_idx] = char_ptr[i]; 01279 nxt_line_col[i+id_start_idx] = col; 01280 } 01281 } 01282 else { 01283 if (! scan_fortran_macro(attr_idx, id_start_idx, pp_line_idx)) { 01284 found_macro = FALSE; 01285 } 01286 } 01287 } 01288 01289 pp_line_idx = save_pp_line_idx; 01290 01291 if (found_macro) { 01292 for (i = NXT_COL(1); i <= nxt_line_end_idx[end_stmt_line_idx]; i++) { 01293 if (nxt_line[i] < 0) { 01294 nxt_line[i] = nxt_line[i] & 0xFF; 01295 } 01296 } 01297 } 01298 01299 PP_LINE_TYPE = Comment_Line; 01300 01301 01302 TRACE (Func_Exit, "scan_fixed_comment", NULL); 01303 01304 return(found_macro); 01305 01306 } /* scan_fixed_comment */ 01307 01308 /******************************************************************************\ 01309 |* *| 01310 |* Description: *| 01311 |* <description> *| 01312 |* *| 01313 |* Input parameters: *| 01314 |* NONE *| 01315 |* *| 01316 |* Output parameters: *| 01317 |* NONE *| 01318 |* *| 01319 |* Returns: *| 01320 |* NOTHING *| 01321 |* *| 01322 \******************************************************************************/ 01323 01324 boolean scan_fortran_stmt(void) 01325 01326 { 01327 int attr_idx; 01328 int col; 01329 char *char_ptr; 01330 int i; 01331 int id_start_idx; 01332 int len; 01333 int macro_len; 01334 int name_idx; 01335 boolean found_macro = FALSE; 01336 int save_pp_line_idx; 01337 int end_idx; 01338 01339 TRACE (Func_Entry, "scan_fortran_stmt", NULL); 01340 01341 end_stmt_line_idx = nxt_line_num_lines; 01342 pp_line_idx = 1; 01343 01344 cc_stmt_buf_idx = NXT_COL(0); 01345 cc_advance_idx(); 01346 01347 while (cc_stmt_buf_idx < pp_nxt_line_EOL[end_stmt_line_idx]) { 01348 01349 if (nxt_line[cc_stmt_buf_idx] > 0 && 01350 (ch_class[nxt_line[cc_stmt_buf_idx]] == Ch_Class_Letter || 01351 nxt_line[cc_stmt_buf_idx] == underscore)) { 01352 01353 id_start_idx = cc_stmt_buf_idx; 01354 col = nxt_line_col[cc_stmt_buf_idx]; 01355 save_pp_line_idx = pp_line_idx; 01356 01357 CC_GET_ID_TOKEN; 01358 01359 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 01360 TOKEN_LEN(cc_token), 01361 &name_idx); 01362 01363 if (attr_idx != NULL_IDX && 01364 CC_AT_DEFINED(attr_idx)) { 01365 01366 found_macro = TRUE; 01367 01368 if (CC_AT_NUM_ARGS(attr_idx) == 0) { 01369 01370 if (CC_AT_DYNAMIC_PREDEF(attr_idx)) { 01371 char_ptr = get_dynamic_predef_str(attr_idx, 01372 TOKEN_LINE(cc_token)); 01373 len = strlen(char_ptr); 01374 } 01375 else { 01376 char_ptr = CC_AT_STR_PTR(attr_idx); 01377 len = CC_AT_STR_LEN(attr_idx); 01378 } 01379 01380 end_idx = prev_idx + 1; 01381 01382 adjust_continued_macro(id_start_idx, &end_idx); 01383 01384 macro_len = end_idx - id_start_idx; 01385 01386 shift_nxt_line(end_idx, 01387 len - macro_len); 01388 01389 for (i = 0; i < len; i++) { 01390 nxt_line[i+id_start_idx] = char_ptr[i]; 01391 nxt_line_col[i+id_start_idx] = col; 01392 } 01393 01394 cc_stmt_buf_idx = id_start_idx + len - 1; 01395 pp_line_idx = save_pp_line_idx; 01396 cc_advance_idx(); 01397 } 01398 else { 01399 if (! scan_fortran_macro(attr_idx, id_start_idx, 01400 save_pp_line_idx)) { 01401 found_macro = FALSE; 01402 goto EXIT; 01403 } 01404 } 01405 } 01406 } 01407 else { 01408 cc_advance_idx(); 01409 } 01410 } 01411 01412 EXIT: 01413 01414 if (found_macro) { 01415 for (i = 1; i <= nxt_line_end_idx[end_stmt_line_idx]; i++) { 01416 if (nxt_line[i] < 0) { 01417 nxt_line[i] = nxt_line[i] & 0xFF; 01418 } 01419 } 01420 } 01421 01422 TRACE (Func_Exit, "scan_fortran_stmt", NULL); 01423 01424 return(found_macro); 01425 01426 } /* scan_fortran_stmt */ 01427 01428 /******************************************************************************\ 01429 |* *| 01430 |* Description: *| 01431 |* <description> *| 01432 |* *| 01433 |* Input parameters: *| 01434 |* NONE *| 01435 |* *| 01436 |* Output parameters: *| 01437 |* NONE *| 01438 |* *| 01439 |* Returns: *| 01440 |* NOTHING *| 01441 |* *| 01442 \******************************************************************************/ 01443 01444 static cc_arg_type *alloc_arg_entry(int num_chars) 01445 01446 { 01447 cc_arg_type *arg_ptr; 01448 int i; 01449 01450 01451 TRACE (Func_Entry, "alloc_arg_entry", NULL); 01452 01453 arg_ptr = (cc_arg_type *)malloc(sizeof(cc_arg_type)); 01454 01455 /* 18Jan01[sos]: compute num_chars accounting for ending '\0' */ 01456 num_chars = ((num_chars+TARGET_CHARS_PER_WORD)/ 01457 TARGET_CHARS_PER_WORD) * TARGET_CHARS_PER_WORD; 01458 01459 arg_ptr->name = (char *)malloc(num_chars); 01460 01461 for (i = 0; i < num_chars; i++) { 01462 arg_ptr->name[i] = '\0'; 01463 } 01464 01465 TRACE (Func_Exit, "alloc_arg_entry", NULL); 01466 01467 return(arg_ptr); 01468 01469 } /* alloc_arg_entry */ 01470 01471 /******************************************************************************\ 01472 |* *| 01473 |* Description: *| 01474 |* <description> *| 01475 |* *| 01476 |* Input parameters: *| 01477 |* NONE *| 01478 |* *| 01479 |* Output parameters: *| 01480 |* NONE *| 01481 |* *| 01482 |* Returns: *| 01483 |* NOTHING *| 01484 |* *| 01485 \******************************************************************************/ 01486 01487 static void free_arg_entry(cc_arg_type *arg_entry) 01488 01489 { 01490 01491 01492 TRACE (Func_Entry, "free_arg_entry", NULL); 01493 01494 free(arg_entry->name); 01495 free(arg_entry); 01496 01497 TRACE (Func_Exit, "free_arg_entry", NULL); 01498 01499 return; 01500 01501 } /* free_arg_entry */ 01502 01503 /******************************************************************************\ 01504 |* *| 01505 |* Description: *| 01506 |* <description> *| 01507 |* *| 01508 |* Input parameters: *| 01509 |* NONE *| 01510 |* *| 01511 |* Output parameters: *| 01512 |* NONE *| 01513 |* *| 01514 |* Returns: *| 01515 |* NOTHING *| 01516 |* *| 01517 \******************************************************************************/ 01518 01519 static void scan_cc_macro(int attr_idx, 01520 int id_start_idx) 01521 01522 { 01523 int arg_num; 01524 char *char_ptr; 01525 int col; 01526 int i; 01527 int j; 01528 int k; 01529 int len; 01530 int line; 01531 int paren_cnt = 0; 01532 cc_arg_type *arg_head = NULL; 01533 cc_arg_type *arg_tail = NULL; 01534 01535 TRACE (Func_Entry, "scan_cc_macro", NULL); 01536 01537 if (CC_LA_CH_VALUE == LPAREN) { 01538 /* macro with arguments. */ 01539 01540 cc_stmt_buf_idx++; 01541 01542 arg_num = 1; 01543 while (arg_num <= CC_AT_NUM_ARGS(attr_idx)) { 01544 01545 i = 0; 01546 k = cc_stmt_buf_idx; 01547 paren_cnt = 0; 01548 01549 while ((cc_stmt_buf[k] != RPAREN || 01550 paren_cnt > 0) && 01551 (cc_stmt_buf[k] != COMMA || 01552 paren_cnt > 0) && 01553 cc_stmt_buf[k] != EOS) { 01554 01555 if (cc_stmt_buf[k] == LPAREN || 01556 cc_stmt_buf[k] == '[') { 01557 paren_cnt++; 01558 } 01559 else if (cc_stmt_buf[k] == RPAREN || 01560 cc_stmt_buf[k] == ']') { 01561 paren_cnt--; 01562 } 01563 01564 k++; 01565 i++; 01566 } 01567 01568 if (arg_head == NULL) { 01569 arg_head = alloc_arg_entry(i); 01570 arg_head->next = NULL; 01571 arg_tail = arg_head; 01572 } 01573 else { 01574 arg_tail->next = alloc_arg_entry(i); 01575 arg_tail = arg_tail->next; 01576 arg_tail->next = NULL; 01577 } 01578 01579 i = 0; 01580 paren_cnt = 0; 01581 01582 while ((cc_stmt_buf[cc_stmt_buf_idx] != RPAREN || 01583 paren_cnt > 0) && 01584 (cc_stmt_buf[cc_stmt_buf_idx] != COMMA || 01585 paren_cnt > 0) && 01586 cc_stmt_buf[cc_stmt_buf_idx] != EOS) { 01587 01588 if (cc_stmt_buf[cc_stmt_buf_idx] == LPAREN || 01589 cc_stmt_buf[cc_stmt_buf_idx] == '[') { 01590 paren_cnt++; 01591 } 01592 else if (cc_stmt_buf[cc_stmt_buf_idx] == RPAREN || 01593 cc_stmt_buf[cc_stmt_buf_idx] == ']') { 01594 paren_cnt--; 01595 } 01596 01597 arg_tail->name[i] = cc_stmt_buf[cc_stmt_buf_idx]; 01598 cc_stmt_buf_idx++; 01599 i++; 01600 } 01601 01602 arg_tail->name_len = i; 01603 01604 if (cc_stmt_buf[cc_stmt_buf_idx] == COMMA && 01605 arg_num < CC_AT_NUM_ARGS(attr_idx)) { 01606 CC_NEXT_LA_CH; 01607 } 01608 else if (cc_stmt_buf[cc_stmt_buf_idx] == RPAREN && 01609 arg_num < CC_AT_NUM_ARGS(attr_idx)) { 01610 /* not enough args */ 01611 find_line_and_col(cc_stmt_buf_idx, &line, &col); 01612 ntr_next_msg_queue(line, 1550, Warning, col, 01613 CC_AT_NAME_PTR(attr_idx), 01614 0, 01615 STR_ARG); 01616 flush_cc_line(); 01617 goto EXIT; 01618 } 01619 01620 arg_num++; 01621 } 01622 01623 if (cc_stmt_buf[cc_stmt_buf_idx] != RPAREN) { 01624 /* too many args */ 01625 find_line_and_col(cc_stmt_buf_idx, &line, &col); 01626 ntr_next_msg_queue(line, 1551, Warning, col, 01627 CC_AT_NAME_PTR(attr_idx), 01628 0, 01629 STR_ARG); 01630 flush_cc_line(); 01631 goto EXIT; 01632 } 01633 01634 /* determine macro length */ 01635 01636 len = CC_AT_STR_LEN(attr_idx); 01637 01638 for (i = 0; i < CC_AT_STR_LEN(attr_idx); i++) { 01639 if ((CC_AT_STR_PTR(attr_idx))[i] == '\001') { 01640 i += 2; 01641 arg_num = 1; 01642 arg_tail = arg_head; 01643 while (arg_num != (CC_AT_STR_PTR(attr_idx))[i]) { 01644 arg_tail = arg_tail->next; 01645 arg_num++; 01646 } 01647 01648 len += (arg_tail->name_len - 3); 01649 } 01650 } 01651 01652 /* cc_stmt_buf_idx is the end of replacement */ 01653 /* id_start_idx is the start of replacement */ 01654 01655 shift_cc_stmt_buf(cc_stmt_buf_idx, 01656 len-((cc_stmt_buf_idx - id_start_idx) + 1)); 01657 01658 char_ptr = CC_AT_STR_PTR(attr_idx); 01659 01660 j = 0; 01661 i = 0; 01662 while (i < len) { 01663 if (char_ptr[j] == '\001') { 01664 j += 2; 01665 arg_num = 1; 01666 arg_tail = arg_head; 01667 while (arg_num != char_ptr[j]) { 01668 arg_tail = arg_tail->next; 01669 arg_num++; 01670 } 01671 01672 for (k = 0; k < arg_tail->name_len; k++) { 01673 cc_stmt_buf[i+id_start_idx] = arg_tail->name[k]; 01674 i++; 01675 } 01676 } 01677 else { 01678 cc_stmt_buf[i+id_start_idx] = char_ptr[j]; 01679 i++; 01680 } 01681 01682 j++; 01683 } 01684 01685 cc_stmt_buf_idx = id_start_idx - 1; 01686 CC_NEXT_LA_CH; 01687 } 01688 01689 EXIT: 01690 01691 while (arg_head != NULL) { 01692 arg_tail = arg_head->next; 01693 free_arg_entry(arg_head); 01694 arg_head = arg_tail; 01695 } 01696 01697 TRACE (Func_Exit, "scan_cc_macro", NULL); 01698 01699 return; 01700 01701 } /* scan_cc_macro */ 01702 01703 /******************************************************************************\ 01704 |* *| 01705 |* Description: *| 01706 |* <description> *| 01707 |* *| 01708 |* Input parameters: *| 01709 |* NONE *| 01710 |* *| 01711 |* Output parameters: *| 01712 |* NONE *| 01713 |* *| 01714 |* Returns: *| 01715 |* NOTHING *| 01716 |* *| 01717 \******************************************************************************/ 01718 01719 static boolean scan_fortran_macro(int attr_idx, 01720 int id_start_idx, 01721 int save_pp_line_idx) 01722 01723 { 01724 int arg_num; 01725 int col; 01726 int i; 01727 int j; 01728 boolean ok = TRUE; 01729 int paren_cnt = 0; 01730 cc_arg_type *arg_head = NULL; 01731 cc_arg_type *arg_tail = NULL; 01732 int save_line_idx; 01733 int save_cc_stmt_buf_idx; 01734 01735 01736 TRACE (Func_Entry, "scan_fortran_macro", NULL); 01737 01738 if (nxt_line[cc_stmt_buf_idx] == lparen) { 01739 /* macro with arguments. */ 01740 01741 col = nxt_line_col[id_start_idx]; 01742 01743 cc_advance_idx(); 01744 01745 arg_num = 1; 01746 while (arg_num <= CC_AT_NUM_ARGS(attr_idx)) { 01747 01748 while (nxt_line[cc_stmt_buf_idx] == blank || 01749 nxt_line[cc_stmt_buf_idx] == tab) { 01750 cc_advance_idx(); 01751 } 01752 01753 save_line_idx = pp_line_idx; 01754 save_cc_stmt_buf_idx = cc_stmt_buf_idx; 01755 01756 i = 0; 01757 paren_cnt = 0; 01758 01759 while ((nxt_line[cc_stmt_buf_idx] != rparen || 01760 paren_cnt > 0) && 01761 (nxt_line[cc_stmt_buf_idx] != comma || 01762 paren_cnt > 0) && 01763 nxt_line[cc_stmt_buf_idx] != eos) { 01764 01765 if (nxt_line[cc_stmt_buf_idx] == lparen || 01766 nxt_line[cc_stmt_buf_idx] == lbrkt) { 01767 paren_cnt++; 01768 } 01769 else if (nxt_line[cc_stmt_buf_idx] == rparen || 01770 nxt_line[cc_stmt_buf_idx] == rbrkt) { 01771 paren_cnt--; 01772 } 01773 01774 cc_advance_idx(); 01775 i++; 01776 } 01777 01778 if (arg_head == NULL) { 01779 arg_head = alloc_arg_entry(i); 01780 arg_head->next = NULL; 01781 arg_tail = arg_head; 01782 } 01783 else { 01784 arg_tail->next = alloc_arg_entry(i); 01785 arg_tail = arg_tail->next; 01786 arg_tail->next = NULL; 01787 } 01788 01789 cc_stmt_buf_idx = save_cc_stmt_buf_idx; 01790 pp_line_idx = save_line_idx; 01791 01792 i = 0; 01793 paren_cnt = 0; 01794 01795 while ((nxt_line[cc_stmt_buf_idx] != rparen || 01796 paren_cnt > 0) && 01797 (nxt_line[cc_stmt_buf_idx] != comma || 01798 paren_cnt > 0) && 01799 nxt_line[cc_stmt_buf_idx] != eos) { 01800 01801 if (nxt_line[cc_stmt_buf_idx] == lparen || 01802 nxt_line[cc_stmt_buf_idx] == lbrkt) { 01803 paren_cnt++; 01804 } 01805 else if (nxt_line[cc_stmt_buf_idx] == rparen || 01806 nxt_line[cc_stmt_buf_idx] == rbrkt) { 01807 paren_cnt--; 01808 } 01809 01810 arg_tail->name[i] = nxt_line[cc_stmt_buf_idx]; 01811 cc_advance_idx(); 01812 i++; 01813 } 01814 01815 j = i - 1; 01816 while (arg_tail->name[j] == blank || 01817 arg_tail->name[j] == tab) { 01818 j--; 01819 } 01820 01821 arg_tail->name[++j] = '\0'; 01822 arg_tail->name_len = j; 01823 01824 01825 if (nxt_line[cc_stmt_buf_idx] == comma && 01826 arg_num < CC_AT_NUM_ARGS(attr_idx)) { 01827 cc_advance_idx(); 01828 } 01829 else if (nxt_line[cc_stmt_buf_idx] == rparen && 01830 arg_num < CC_AT_NUM_ARGS(attr_idx)) { 01831 /* not enough args */ 01832 ntr_next_msg_queue(PP_LINE_NUM, 1550, Warning, 01833 nxt_line_col[cc_stmt_buf_idx], 01834 CC_AT_NAME_PTR(attr_idx), 01835 0, 01836 STR_ARG); 01837 ok = FALSE; 01838 goto EXIT; 01839 } 01840 01841 arg_num++; 01842 } 01843 01844 if (nxt_line[cc_stmt_buf_idx] != rparen) { 01845 /* too many args */ 01846 ntr_next_msg_queue(PP_LINE_NUM, 1551, Warning, 01847 nxt_line_col[cc_stmt_buf_idx], 01848 CC_AT_NAME_PTR(attr_idx), 01849 0, 01850 STR_ARG); 01851 ok = FALSE; 01852 goto EXIT; 01853 } 01854 01855 insert_macro(attr_idx, 01856 arg_head, 01857 id_start_idx, 01858 col, 01859 save_pp_line_idx); 01860 01861 } 01862 else { 01863 ok = FALSE; 01864 } 01865 01866 EXIT: 01867 01868 while (arg_head != NULL) { 01869 arg_tail = arg_head->next; 01870 free_arg_entry(arg_head); 01871 arg_head = arg_tail; 01872 } 01873 01874 TRACE (Func_Exit, "scan_fortran_macro", NULL); 01875 01876 return(ok); 01877 01878 } /* scan_fortran_macro */ 01879 01880 /******************************************************************************\ 01881 |* *| 01882 |* Description: *| 01883 |* <description> *| 01884 |* *| 01885 |* Input parameters: *| 01886 |* NONE *| 01887 |* *| 01888 |* Output parameters: *| 01889 |* NONE *| 01890 |* *| 01891 |* Returns: *| 01892 |* NOTHING *| 01893 |* *| 01894 \******************************************************************************/ 01895 01896 void init_cond_comp(void) 01897 01898 { 01899 int ln_idx; 01900 int word; 01901 01902 TRACE (Func_Entry, "init_cond_comp", NULL); 01903 01904 /* initialize cc_initial_token used to initialize token */ 01905 01906 for (word = 0; word < CC_NUM_ID_WDS; word++) { 01907 TOKEN_STR_WD(cc_initial_token, word) = 0; 01908 } 01909 01910 TOKEN_LEN(cc_initial_token) = 0; 01911 TOKEN_VALUE(cc_initial_token) = Cc_Tok_Unknown; 01912 TOKEN_ERR(cc_initial_token) = FALSE; 01913 TOKEN_KIND_STR(cc_initial_token)[0] = EOS; 01914 TOKEN_KIND_LEN(cc_initial_token) = 0; 01915 TOKEN_COLUMN(cc_initial_token) = 0; 01916 TOKEN_LINE(cc_initial_token) = 0; 01917 01918 01919 CHECK_INITIAL_ALLOC (cc_attr_tbl, NULL_IDX); 01920 CHECK_INITIAL_ALLOC (cc_ln_tbl, NULL_IDX); 01921 CHECK_INITIAL_ALLOC (cc_blk_stk_tbl, NULL_IDX); 01922 01923 ln_idx = cc_ln_tbl_idx + 1; 01924 01925 TBL_REALLOC_CK(cc_ln_tbl, 2); 01926 CLEAR_TBL_NTRY(cc_ln_tbl, ln_idx); 01927 CC_LN_NAME_IDX(ln_idx) = NAME_POOL_ZERO_IDX; /* Zero word */ 01928 CC_LN_NAME_LEN(ln_idx) = HOST_BYTES_PER_WORD; 01929 cc_ln_fw_idx = ln_idx; 01930 01931 CLEAR_TBL_NTRY(cc_ln_tbl, cc_ln_tbl_idx); 01932 CC_LN_NAME_IDX(cc_ln_tbl_idx) = NAME_POOL_ONES_IDX; /* Ones word */ 01933 CC_LN_NAME_LEN(cc_ln_tbl_idx) = HOST_BYTES_PER_WORD; 01934 cc_ln_lw_idx = cc_ln_tbl_idx; 01935 01936 TRACE (Func_Exit, "init_cond_comp", NULL); 01937 01938 return; 01939 01940 } /* init_cond_comp */ 01941 01942 /******************************************************************************\ 01943 |* *| 01944 |* Description: *| 01945 |* <description> *| 01946 |* *| 01947 |* Input parameters: *| 01948 |* NONE *| 01949 |* *| 01950 |* Output parameters: *| 01951 |* NONE *| 01952 |* *| 01953 |* Returns: *| 01954 |* NOTHING *| 01955 |* *| 01956 \******************************************************************************/ 01957 01958 void enter_predefined_macros(void) 01959 01960 { 01961 int attr_idx; 01962 int name_idx; 01963 01964 01965 # if defined(_TARGET_OS_UNICOS) || defined(_TARGET_OS_MAX) 01966 01967 union {long int_form; 01968 char char_form[9]; 01969 } cpu_type; 01970 01971 # endif 01972 01973 01974 TRACE (Func_Entry, "enter_predefined_macros", NULL); 01975 01976 /****************************************\ 01977 |* These are dynamic predefined macros. *| 01978 |* Enter them without a string and save *| 01979 |* the index in global variables. *| 01980 \****************************************/ 01981 01982 /************\ 01983 |* __line__ *| 01984 \************/ 01985 01986 cc_token = cc_initial_token; 01987 01988 strcpy(TOKEN_STR(cc_token), "__line__"); 01989 TOKEN_LEN(cc_token) = 8; 01990 01991 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 01992 TOKEN_LEN(cc_token), 01993 &name_idx); 01994 01995 01996 if (attr_idx == NULL_IDX) { 01997 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 01998 PUT_VALUE_IN_AT_STR(attr_idx, 1); 01999 CC_AT_DEFINED(attr_idx) = TRUE; 02000 CC_AT_DYNAMIC_PREDEF(attr_idx) = TRUE; 02001 line_macro_idx = attr_idx; 02002 } 02003 else { 02004 /* error, cannot be redefined */ 02005 } 02006 02007 /************\ 02008 |* __LINE__ *| 02009 \************/ 02010 02011 cc_token = cc_initial_token; 02012 02013 strcpy(TOKEN_STR(cc_token), "__LINE__"); 02014 TOKEN_LEN(cc_token) = 8; 02015 02016 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02017 TOKEN_LEN(cc_token), 02018 &name_idx); 02019 02020 02021 if (attr_idx == NULL_IDX) { 02022 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02023 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02024 CC_AT_DEFINED(attr_idx) = TRUE; 02025 CC_AT_DYNAMIC_PREDEF(attr_idx) = TRUE; 02026 LINE_macro_idx = attr_idx; 02027 } 02028 else { 02029 /* error, cannot be redefined */ 02030 } 02031 02032 /************\ 02033 |* __file__ *| 02034 \************/ 02035 02036 cc_token = cc_initial_token; 02037 02038 strcpy(TOKEN_STR(cc_token), "__file__"); 02039 TOKEN_LEN(cc_token) = 8; 02040 02041 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02042 TOKEN_LEN(cc_token), 02043 &name_idx); 02044 02045 02046 if (attr_idx == NULL_IDX) { 02047 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02048 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02049 CC_AT_DEFINED(attr_idx) = TRUE; 02050 CC_AT_DYNAMIC_PREDEF(attr_idx) = TRUE; 02051 file_macro_idx = attr_idx; 02052 } 02053 else { 02054 /* error, cannot be redefined */ 02055 } 02056 02057 /************\ 02058 |* __FILE__ *| 02059 \************/ 02060 02061 cc_token = cc_initial_token; 02062 02063 strcpy(TOKEN_STR(cc_token), "__FILE__"); 02064 TOKEN_LEN(cc_token) = 8; 02065 02066 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02067 TOKEN_LEN(cc_token), 02068 &name_idx); 02069 02070 02071 if (attr_idx == NULL_IDX) { 02072 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02073 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02074 CC_AT_DEFINED(attr_idx) = TRUE; 02075 CC_AT_DYNAMIC_PREDEF(attr_idx) = TRUE; 02076 FILE_macro_idx = attr_idx; 02077 } 02078 else { 02079 /* error, cannot be redefined */ 02080 } 02081 02082 /************\ 02083 |* __date__ *| 02084 \************/ 02085 02086 cc_token = cc_initial_token; 02087 02088 strcpy(TOKEN_STR(cc_token), "__date__"); 02089 TOKEN_LEN(cc_token) = 8; 02090 02091 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02092 TOKEN_LEN(cc_token), 02093 &name_idx); 02094 02095 02096 if (attr_idx == NULL_IDX) { 02097 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02098 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02099 CC_AT_DEFINED(attr_idx) = TRUE; 02100 CC_AT_DYNAMIC_PREDEF(attr_idx) = TRUE; 02101 date_macro_idx = attr_idx; 02102 } 02103 else { 02104 /* error, cannot be redefined */ 02105 } 02106 02107 /************\ 02108 |* __DATE__ *| 02109 \************/ 02110 02111 cc_token = cc_initial_token; 02112 02113 strcpy(TOKEN_STR(cc_token), "__DATE__"); 02114 TOKEN_LEN(cc_token) = 8; 02115 02116 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02117 TOKEN_LEN(cc_token), 02118 &name_idx); 02119 02120 02121 if (attr_idx == NULL_IDX) { 02122 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02123 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02124 CC_AT_DEFINED(attr_idx) = TRUE; 02125 CC_AT_DYNAMIC_PREDEF(attr_idx) = TRUE; 02126 DATE_macro_idx = attr_idx; 02127 } 02128 else { 02129 /* error, cannot be redefined */ 02130 } 02131 02132 /************\ 02133 |* __time__ *| 02134 \************/ 02135 02136 cc_token = cc_initial_token; 02137 02138 strcpy(TOKEN_STR(cc_token), "__time__"); 02139 TOKEN_LEN(cc_token) = 8; 02140 02141 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02142 TOKEN_LEN(cc_token), 02143 &name_idx); 02144 02145 02146 if (attr_idx == NULL_IDX) { 02147 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02148 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02149 CC_AT_DEFINED(attr_idx) = TRUE; 02150 CC_AT_DYNAMIC_PREDEF(attr_idx) = TRUE; 02151 time_macro_idx = attr_idx; 02152 } 02153 else { 02154 /* error, cannot be redefined */ 02155 } 02156 02157 /************\ 02158 |* __TIME__ *| 02159 \************/ 02160 02161 cc_token = cc_initial_token; 02162 02163 strcpy(TOKEN_STR(cc_token), "__TIME__"); 02164 TOKEN_LEN(cc_token) = 8; 02165 02166 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02167 TOKEN_LEN(cc_token), 02168 &name_idx); 02169 02170 02171 if (attr_idx == NULL_IDX) { 02172 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02173 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02174 CC_AT_DEFINED(attr_idx) = TRUE; 02175 CC_AT_DYNAMIC_PREDEF(attr_idx) = TRUE; 02176 TIME_macro_idx = attr_idx; 02177 } 02178 else { 02179 /* error, cannot be redefined */ 02180 } 02181 02182 02183 # ifdef _UNICOS 02184 02185 /*********************\ 02186 |* Predefine _UNICOS *| 02187 \*********************/ 02188 02189 cc_token = cc_initial_token; 02190 02191 strcpy(TOKEN_STR(cc_token), "_UNICOS"); 02192 TOKEN_LEN(cc_token) = 7; 02193 02194 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02195 TOKEN_LEN(cc_token), 02196 &name_idx); 02197 02198 02199 if (attr_idx == NULL_IDX) { 02200 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02201 PUT_VALUE_IN_AT_STR(attr_idx, _UNICOS); 02202 CC_AT_DEFINED(attr_idx) = TRUE; 02203 } 02204 02205 02206 # endif 02207 02208 02209 #if defined(_HOST_OS_UNICOS) || defined(_HOST_OS_SOLARIS) || \ 02210 defined(_HOST_OS_MAX) || (defined(_HOST_OS_IRIX) || defined(_HOST_OS_LINUX)) 02211 02212 /******************\ 02213 |* Predefine unix *| 02214 \******************/ 02215 02216 cc_token = cc_initial_token; 02217 02218 strcpy(TOKEN_STR(cc_token), "unix"); 02219 TOKEN_LEN(cc_token) = 4; 02220 02221 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02222 TOKEN_LEN(cc_token), 02223 &name_idx); 02224 02225 if (attr_idx == NULL_IDX) { 02226 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02227 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02228 CC_AT_DEFINED(attr_idx) = TRUE; 02229 } 02230 02231 02232 /********************\ 02233 |* Predefine __unix *| 02234 \********************/ 02235 02236 cc_token = cc_initial_token; 02237 02238 strcpy(TOKEN_STR(cc_token), "__unix"); 02239 TOKEN_LEN(cc_token) = 6; 02240 02241 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02242 TOKEN_LEN(cc_token), 02243 &name_idx); 02244 02245 if (attr_idx == NULL_IDX) { 02246 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02247 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02248 CC_AT_DEFINED(attr_idx) = TRUE; 02249 } 02250 02251 # endif 02252 02253 02254 #if defined(_TARGET_OS_UNICOS) || defined(_TARGET_OS_MAX) 02255 02256 /* Define cray, _CRAY, and CRAY if the target is a PVP or MPP. */ 02257 02258 /******************\ 02259 |* Predefine cray *| 02260 \******************/ 02261 02262 cc_token = cc_initial_token; 02263 02264 strcpy(TOKEN_STR(cc_token), "cray"); 02265 TOKEN_LEN(cc_token) = 4; 02266 02267 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02268 TOKEN_LEN(cc_token), 02269 &name_idx); 02270 02271 02272 if (attr_idx == NULL_IDX) { 02273 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02274 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02275 CC_AT_DEFINED(attr_idx) = TRUE; 02276 } 02277 02278 02279 /******************\ 02280 |* Predefine CRAY *| 02281 \******************/ 02282 02283 cc_token = cc_initial_token; 02284 02285 strcpy(TOKEN_STR(cc_token), "CRAY"); 02286 TOKEN_LEN(cc_token) = 4; 02287 02288 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02289 TOKEN_LEN(cc_token), 02290 &name_idx); 02291 02292 02293 if (attr_idx == NULL_IDX) { 02294 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02295 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02296 CC_AT_DEFINED(attr_idx) = TRUE; 02297 } 02298 02299 02300 /*******************\ 02301 |* Predefine _CRAY *| 02302 \*******************/ 02303 02304 cc_token = cc_initial_token; 02305 02306 strcpy(TOKEN_STR(cc_token), "_CRAY"); 02307 TOKEN_LEN(cc_token) = 5; 02308 02309 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02310 TOKEN_LEN(cc_token), 02311 &name_idx); 02312 02313 if (attr_idx == NULL_IDX) { 02314 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02315 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02316 CC_AT_DEFINED(attr_idx) = TRUE; 02317 } 02318 02319 02320 /**********************\ 02321 |* Predefine _MEMSIZE *| 02322 \**********************/ 02323 02324 cc_token = cc_initial_token; 02325 02326 strcpy(TOKEN_STR(cc_token), "_MEMSIZE"); 02327 TOKEN_LEN(cc_token) = 8; 02328 02329 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02330 TOKEN_LEN(cc_token), 02331 &name_idx); 02332 02333 if (attr_idx == NULL_IDX) { 02334 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02335 PUT_VALUE_IN_AT_STR(attr_idx, target_machine.fld.mcmsz); 02336 CC_AT_DEFINED(attr_idx) = TRUE; 02337 } 02338 02339 #endif 02340 02341 02342 # ifdef _TARGET_OS_UNICOS 02343 02344 # if defined(_GETPMC_AVAILABLE) 02345 cpu_type.int_form = target_machine.fld.mcpmt; 02346 cpu_type.char_form[8] = '\0'; 02347 # else 02348 strcpy(cpu_type.char_form, target_machine.fld.mcpmt); 02349 # endif 02350 02351 if (strcmp("CRAY-C90", cpu_type.char_form) == 0) { 02352 02353 /**********************\ 02354 |* Predefine _CRAYC90 *| 02355 \**********************/ 02356 02357 cc_token = cc_initial_token; 02358 02359 strcpy(TOKEN_STR(cc_token), "_CRAYC90"); 02360 TOKEN_LEN(cc_token) = 8; 02361 02362 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02363 TOKEN_LEN(cc_token), 02364 &name_idx); 02365 02366 if (attr_idx == NULL_IDX) { 02367 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02368 PUT_VALUE_IN_AT_STR(attr_idx, 128); 02369 CC_AT_DEFINED(attr_idx) = TRUE; 02370 } 02371 02372 02373 /***************************\ 02374 |* Predefine _MAXVL to 128 *| 02375 \***************************/ 02376 02377 cc_token = cc_initial_token; 02378 02379 strcpy(TOKEN_STR(cc_token), "_MAXVL"); 02380 TOKEN_LEN(cc_token) = 6; 02381 02382 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02383 TOKEN_LEN(cc_token), 02384 &name_idx); 02385 02386 if (attr_idx == NULL_IDX) { 02387 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02388 PUT_VALUE_IN_AT_STR(attr_idx, 128); 02389 CC_AT_DEFINED(attr_idx) = TRUE; 02390 } 02391 } 02392 else if (strcmp("CRAY-TS", cpu_type.char_form) == 0) { 02393 02394 /**********************\ 02395 |* Predefine _CRAYT90 *| 02396 \**********************/ 02397 02398 cc_token = cc_initial_token; 02399 02400 strcpy(TOKEN_STR(cc_token), "_CRAYT90"); 02401 TOKEN_LEN(cc_token) = 8; 02402 02403 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02404 TOKEN_LEN(cc_token), 02405 &name_idx); 02406 02407 if (attr_idx == NULL_IDX) { 02408 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02409 PUT_VALUE_IN_AT_STR(attr_idx, 128); 02410 CC_AT_DEFINED(attr_idx) = TRUE; 02411 } 02412 02413 /***************************\ 02414 |* Predefine _MAXVL to 128 *| 02415 \***************************/ 02416 02417 cc_token = cc_initial_token; 02418 02419 strcpy(TOKEN_STR(cc_token), "_MAXVL"); 02420 TOKEN_LEN(cc_token) = 6; 02421 02422 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02423 TOKEN_LEN(cc_token), 02424 &name_idx); 02425 02426 if (attr_idx == NULL_IDX) { 02427 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02428 PUT_VALUE_IN_AT_STR(attr_idx, 128); 02429 CC_AT_DEFINED(attr_idx) = TRUE; 02430 } 02431 02432 02433 /*********************\ 02434 |* Predefine _ADDR64 *| 02435 \*********************/ 02436 02437 cc_token = cc_initial_token; 02438 02439 strcpy(TOKEN_STR(cc_token), "_ADDR64"); 02440 TOKEN_LEN(cc_token) = 7; 02441 02442 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02443 TOKEN_LEN(cc_token), 02444 &name_idx); 02445 02446 if (attr_idx == NULL_IDX) { 02447 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02448 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02449 CC_AT_DEFINED(attr_idx) = TRUE; 02450 } 02451 } 02452 else if (strcmp("CRAY-YMP", cpu_type.char_form) == 0) { 02453 02454 /**************************\ 02455 |* Predefine _MAXVL to 64 *| 02456 \**************************/ 02457 02458 cc_token = cc_initial_token; 02459 strcpy(TOKEN_STR(cc_token), "_MAXVL"); 02460 TOKEN_LEN(cc_token) = 6; 02461 02462 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02463 TOKEN_LEN(cc_token), 02464 &name_idx); 02465 02466 02467 if (attr_idx == NULL_IDX) { 02468 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02469 PUT_VALUE_IN_AT_STR(attr_idx, 64); 02470 CC_AT_DEFINED(attr_idx) = TRUE; 02471 } 02472 } 02473 02474 if (target_machine.fld.mcaddr32) { 02475 02476 /*****************\ 02477 |* Predefine YMP *| 02478 \*****************/ 02479 02480 cc_token = cc_initial_token; 02481 02482 strcpy(TOKEN_STR(cc_token), "YMP"); 02483 TOKEN_LEN(cc_token) = 3; 02484 02485 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02486 TOKEN_LEN(cc_token), 02487 &name_idx); 02488 02489 if (attr_idx == NULL_IDX) { 02490 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02491 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02492 CC_AT_DEFINED(attr_idx) = TRUE; 02493 } 02494 02495 02496 /*********************\ 02497 |* Predefine _ADDR32 *| 02498 \*********************/ 02499 02500 cc_token = cc_initial_token; 02501 02502 strcpy(TOKEN_STR(cc_token), "_ADDR32"); 02503 TOKEN_LEN(cc_token) = 7; 02504 02505 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02506 TOKEN_LEN(cc_token), 02507 &name_idx); 02508 02509 if (attr_idx == NULL_IDX) { 02510 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02511 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02512 CC_AT_DEFINED(attr_idx) = TRUE; 02513 } 02514 } 02515 02516 02517 if (target_triton && target_ieee) { 02518 02519 /***********************\ 02520 |* Predefine _CRAYIEEE *| 02521 \***********************/ 02522 02523 cc_token = cc_initial_token; 02524 02525 strcpy(TOKEN_STR(cc_token), "_CRAYIEEE"); 02526 TOKEN_LEN(cc_token) = 9; 02527 02528 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02529 TOKEN_LEN(cc_token), 02530 &name_idx); 02531 02532 if (attr_idx == NULL_IDX) { 02533 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02534 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02535 CC_AT_DEFINED(attr_idx) = TRUE; 02536 } 02537 02538 } 02539 02540 # endif 02541 02542 02543 # ifdef _TARGET_OS_MAX 02544 02545 /**********************\ 02546 |* Predefine _CRAYMPP *| 02547 \**********************/ 02548 02549 cc_token = cc_initial_token; 02550 02551 strcpy(TOKEN_STR(cc_token), "_CRAYMPP"); 02552 TOKEN_LEN(cc_token) = 8; 02553 02554 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02555 TOKEN_LEN(cc_token), 02556 &name_idx); 02557 02558 if (attr_idx == NULL_IDX) { 02559 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02560 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02561 CC_AT_DEFINED(attr_idx) = TRUE; 02562 } 02563 02564 02565 /**********************************\ 02566 |* Predefine CRAY-T3D or CRAY-T3E *| 02567 \**********************************/ 02568 02569 # if defined(_GETPMC_AVAILABLE) 02570 cpu_type.int_form = target_machine.fld.mcpmt; 02571 cpu_type.char_form[8] = '\0'; 02572 # else 02573 strcpy(cpu_type.char_form, target_machine.fld.mcpmt); 02574 # endif 02575 02576 cc_token = cc_initial_token; 02577 02578 if (strcmp("CRAY-T3D", cpu_type.char_form) == 0) { 02579 strcpy(TOKEN_STR(cc_token), "_CRAYT3D"); 02580 } 02581 else { 02582 strcpy(TOKEN_STR(cc_token), "_CRAYT3E"); 02583 } 02584 02585 TOKEN_LEN(cc_token) = 8; 02586 02587 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02588 TOKEN_LEN(cc_token), 02589 &name_idx); 02590 02591 if (attr_idx == NULL_IDX) { 02592 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02593 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02594 CC_AT_DEFINED(attr_idx) = TRUE; 02595 } 02596 02597 02598 /***********************\ 02599 |* Predefine _CRAYIEEE *| 02600 \***********************/ 02601 02602 cc_token = cc_initial_token; 02603 02604 strcpy(TOKEN_STR(cc_token), "_CRAYIEEE"); 02605 TOKEN_LEN(cc_token) = 9; 02606 02607 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02608 TOKEN_LEN(cc_token), 02609 &name_idx); 02610 02611 if (attr_idx == NULL_IDX) { 02612 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02613 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02614 CC_AT_DEFINED(attr_idx) = TRUE; 02615 } 02616 02617 /*********************\ 02618 |* Predefine _ADDR64 *| 02619 \*********************/ 02620 02621 cc_token = cc_initial_token; 02622 02623 strcpy(TOKEN_STR(cc_token), "_ADDR64"); 02624 TOKEN_LEN(cc_token) = 7; 02625 02626 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02627 TOKEN_LEN(cc_token), 02628 &name_idx); 02629 02630 if (attr_idx == NULL_IDX) { 02631 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02632 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02633 CC_AT_DEFINED(attr_idx) = TRUE; 02634 } 02635 02636 02637 # endif 02638 02639 02640 #ifdef _TARGET_OS_SOLARIS 02641 02642 cc_token = cc_initial_token; 02643 02644 strcpy(TOKEN_STR(cc_token), "__sparc"); 02645 TOKEN_LEN(cc_token) = 7; 02646 02647 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02648 TOKEN_LEN(cc_token), 02649 &name_idx); 02650 02651 if (attr_idx == NULL_IDX) { 02652 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02653 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02654 CC_AT_DEFINED(attr_idx) = TRUE; 02655 } 02656 02657 cc_token = cc_initial_token; 02658 02659 strcpy(TOKEN_STR(cc_token), "sun"); 02660 TOKEN_LEN(cc_token) = 3; 02661 02662 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02663 TOKEN_LEN(cc_token), 02664 &name_idx); 02665 02666 if (attr_idx == NULL_IDX) { 02667 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02668 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02669 CC_AT_DEFINED(attr_idx) = TRUE; 02670 } 02671 02672 cc_token = cc_initial_token; 02673 02674 strcpy(TOKEN_STR(cc_token), "_SUN"); 02675 TOKEN_LEN(cc_token) = 4; 02676 02677 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02678 TOKEN_LEN(cc_token), 02679 &name_idx); 02680 02681 if (attr_idx == NULL_IDX) { 02682 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02683 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02684 CC_AT_DEFINED(attr_idx) = TRUE; 02685 } 02686 02687 cc_token = cc_initial_token; 02688 02689 strcpy(TOKEN_STR(cc_token), "sparc"); 02690 TOKEN_LEN(cc_token) = 5; 02691 02692 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02693 TOKEN_LEN(cc_token), 02694 &name_idx); 02695 02696 if (attr_idx == NULL_IDX) { 02697 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02698 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02699 CC_AT_DEFINED(attr_idx) = TRUE; 02700 } 02701 02702 cc_token = cc_initial_token; 02703 02704 strcpy(TOKEN_STR(cc_token), "_SPARC"); 02705 TOKEN_LEN(cc_token) = 6; 02706 02707 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 02708 TOKEN_LEN(cc_token), 02709 &name_idx); 02710 02711 if (attr_idx == NULL_IDX) { 02712 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 02713 PUT_VALUE_IN_AT_STR(attr_idx, 1); 02714 CC_AT_DEFINED(attr_idx) = TRUE; 02715 } 02716 02717 02718 #endif 02719 02720 02721 TRACE (Func_Exit, "enter_predefined_macros", NULL); 02722 02723 return; 02724 02725 } /* enter_predefined_macros */ 02726 02727 02728 /******************************************************************************\ 02729 |* *| 02730 |* Description: *| 02731 |* <description> *| 02732 |* *| 02733 |* Input parameters: *| 02734 |* NONE *| 02735 |* *| 02736 |* Output parameters: *| 02737 |* NONE *| 02738 |* *| 02739 |* Returns: *| 02740 |* NOTHING *| 02741 |* *| 02742 \******************************************************************************/ 02743 02744 static void cc_get_token(boolean keyword_expected) 02745 02746 { 02747 int i; 02748 int idx; 02749 boolean its_unsigned = FALSE; 02750 char upper_str[CC_MAX_ID_LEN+1]; 02751 char str[80]; 02752 long64 the_constant; 02753 02754 02755 TRACE (Func_Entry, "cc_get_token", NULL); 02756 02757 cc_token = cc_initial_token; 02758 02759 TOKEN_LINE(cc_token) = CC_LA_CH_LINE; 02760 TOKEN_COLUMN(cc_token) = CC_LA_CH_COLUMN; 02761 02762 if (CC_LA_CH_VALUE == eos) { 02763 TOKEN_VALUE(cc_token) = Cc_Tok_EOS; 02764 } 02765 else if (CC_LA_CH_CLASS == Ch_Class_Letter || 02766 CC_LA_CH_VALUE == underscore) { 02767 02768 02769 TOKEN_LEN(cc_token) = 0; 02770 02771 while (cc_stmt_buf[cc_stmt_buf_idx] != newline && 02772 cc_stmt_buf[cc_stmt_buf_idx] != blank && 02773 cc_stmt_buf[cc_stmt_buf_idx] != tab && 02774 VALID_CC_ID_CHAR(cc_stmt_buf[cc_stmt_buf_idx])) { 02775 02776 if (TOKEN_LEN(cc_token) < CC_MAX_ID_LEN) { 02777 ADD_TO_CC_TOKEN_STR(cc_stmt_buf[cc_stmt_buf_idx], 02778 TOKEN_LEN(cc_token)); 02779 } 02780 02781 cc_stmt_buf_idx++; 02782 } 02783 02784 cc_stmt_buf_idx--; 02785 CC_NEXT_LA_CH; 02786 02787 TOKEN_VALUE(cc_token) = Cc_Tok_Id; 02788 02789 /* see if it is a keyword */ 02790 02791 if (keyword_expected) { 02792 02793 for (i = 0; i < TOKEN_LEN(cc_token); i++) { 02794 if (islower((TOKEN_STR(cc_token))[i])) { 02795 upper_str[i] = TOUPPER((TOKEN_STR(cc_token))[i]); 02796 } 02797 else { 02798 upper_str[i] = (TOKEN_STR(cc_token))[i]; 02799 } 02800 } 02801 02802 upper_str[i] ='\0'; 02803 02804 switch(upper_str[0]) { 02805 case 'D': 02806 if (TOKEN_LEN(cc_token) == 6 && 02807 EQUAL_STRS(upper_str, "DEFINE")) { 02808 TOKEN_VALUE(cc_token) = Cc_Tok_Kwd_Define; 02809 } 02810 else if (TOKEN_LEN(cc_token) == 7 && 02811 EQUAL_STRS(upper_str, "DEFINED")) { 02812 TOKEN_VALUE(cc_token) = Cc_Tok_Kwd_Defined; 02813 } 02814 break; 02815 02816 case 'E': 02817 if (TOKEN_LEN(cc_token) == 4 && 02818 EQUAL_STRS(upper_str, "ELIF")) { 02819 TOKEN_VALUE(cc_token) = Cc_Tok_Kwd_Elif; 02820 } 02821 else if (TOKEN_LEN(cc_token) == 4 && 02822 EQUAL_STRS(upper_str, "ELSE")) { 02823 TOKEN_VALUE(cc_token) = Cc_Tok_Kwd_Else; 02824 } 02825 else if (TOKEN_LEN(cc_token) == 5 && 02826 EQUAL_STRS(upper_str, "ENDIF")) { 02827 TOKEN_VALUE(cc_token) = Cc_Tok_Kwd_Endif; 02828 } 02829 else if (TOKEN_LEN(cc_token) == 5 && 02830 EQUAL_STRS(upper_str, "ERROR")) { 02831 TOKEN_VALUE(cc_token) = Cc_Tok_Kwd_Error; 02832 } 02833 break; 02834 02835 case 'I': 02836 if (TOKEN_LEN(cc_token) == 2 && 02837 EQUAL_STRS(upper_str, "IF")) { 02838 TOKEN_VALUE(cc_token) = Cc_Tok_Kwd_If; 02839 } 02840 else if (TOKEN_LEN(cc_token) == 5 && 02841 EQUAL_STRS(upper_str, "IFDEF")) { 02842 TOKEN_VALUE(cc_token) = Cc_Tok_Kwd_Ifdef; 02843 } 02844 else if (TOKEN_LEN(cc_token) == 6 && 02845 EQUAL_STRS(upper_str, "IFNDEF")) { 02846 TOKEN_VALUE(cc_token) = Cc_Tok_Kwd_Ifndef; 02847 } 02848 else if (TOKEN_LEN(cc_token) == 7 && 02849 EQUAL_STRS(upper_str, "INCLUDE")) { 02850 TOKEN_VALUE(cc_token) = Cc_Tok_Kwd_Include; 02851 } 02852 02853 break; 02854 02855 case 'U': 02856 if (TOKEN_LEN(cc_token) == 5 && 02857 EQUAL_STRS(upper_str, "UNDEF")) { 02858 TOKEN_VALUE(cc_token) = Cc_Tok_Kwd_Undef; 02859 } 02860 02861 break; 02862 02863 } 02864 } 02865 } 02866 else if (CC_LA_CH_CLASS == Ch_Class_Digit) { 02867 02868 idx = 0; 02869 if (CC_LA_CH_VALUE == ZERO) { 02870 /* possibly either oct or hex */ 02871 02872 str[idx] = CC_LA_CH_VALUE; 02873 idx++; 02874 CC_NEXT_LA_CH; 02875 02876 if (CC_LA_CH_VALUE == 'X' || 02877 CC_LA_CH_VALUE == 'x') { 02878 str[idx] = CC_LA_CH_VALUE; 02879 idx++; 02880 CC_NEXT_LA_CH; 02881 } 02882 } 02883 02884 while (CC_LA_CH_CLASS == Ch_Class_Digit && 02885 idx < 79) { 02886 str[idx] = CC_LA_CH_VALUE; 02887 CC_NEXT_LA_CH; 02888 idx++; 02889 } 02890 02891 str[idx] = '\0'; 02892 02893 if (CC_LA_CH_VALUE == 'L' || 02894 CC_LA_CH_VALUE == 'l') { 02895 /* just swallow it for now */ 02896 CC_NEXT_LA_CH; 02897 02898 if (CC_LA_CH_VALUE == 'U' || 02899 CC_LA_CH_VALUE == 'u') { 02900 /* just swallow it for now */ 02901 CC_NEXT_LA_CH; 02902 its_unsigned = TRUE; 02903 } 02904 } 02905 02906 if (CC_LA_CH_VALUE == 'U' || 02907 CC_LA_CH_VALUE == 'u') { 02908 /* just swallow it for now */ 02909 CC_NEXT_LA_CH; 02910 its_unsigned = TRUE; 02911 02912 if (CC_LA_CH_VALUE == 'L' || 02913 CC_LA_CH_VALUE == 'l') { 02914 /* just swallow it for now */ 02915 CC_NEXT_LA_CH; 02916 } 02917 } 02918 02919 if (its_unsigned) { 02920 the_constant = (long64) strtoul(str, NULL, 0); 02921 } 02922 else { 02923 the_constant = (long64) strtol(str, NULL, 0); 02924 } 02925 02926 TOKEN_CONST_TBL_IDX(cc_token) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE, 02927 the_constant); 02928 02929 TOKEN_VALUE(cc_token) = Cc_Tok_Constant; 02930 02931 } 02932 else { 02933 02934 switch(CC_LA_CH_VALUE) { 02935 02936 case '#': 02937 02938 CC_NEXT_LA_CH; 02939 break; 02940 02941 case '+': 02942 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Add; 02943 02944 CC_NEXT_LA_CH; 02945 break; 02946 02947 case '/': 02948 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Div; 02949 02950 CC_NEXT_LA_CH; 02951 break; 02952 02953 case '%': 02954 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Mod; 02955 02956 CC_NEXT_LA_CH; 02957 break; 02958 02959 case '*': 02960 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Mult; 02961 02962 CC_NEXT_LA_CH; 02963 break; 02964 02965 case '-': 02966 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Sub; 02967 02968 CC_NEXT_LA_CH; 02969 break; 02970 02971 case '!': 02972 if (cc_stmt_buf[cc_stmt_buf_idx + 1] == '=') { 02973 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Ne; 02974 CC_NEXT_LA_CH; 02975 } 02976 else { 02977 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Not; 02978 } 02979 02980 CC_NEXT_LA_CH; 02981 break; 02982 02983 case '~': 02984 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Bnot; 02985 02986 CC_NEXT_LA_CH; 02987 break; 02988 02989 case '^': 02990 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Neqv; 02991 02992 CC_NEXT_LA_CH; 02993 break; 02994 02995 case '=': 02996 if (cc_stmt_buf[cc_stmt_buf_idx+1] == '=') { 02997 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Eq; 02998 CC_NEXT_LA_CH; 02999 } 03000 03001 CC_NEXT_LA_CH; 03002 break; 03003 03004 case '>': 03005 03006 if (cc_stmt_buf[cc_stmt_buf_idx + 1] == '=') { 03007 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Ge; 03008 CC_NEXT_LA_CH; 03009 } 03010 else if (cc_stmt_buf[cc_stmt_buf_idx + 1] == '>') { 03011 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Rshift; 03012 CC_NEXT_LA_CH; 03013 } 03014 else { 03015 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Gt; 03016 } 03017 03018 CC_NEXT_LA_CH; 03019 break; 03020 03021 case '<': 03022 03023 if (cc_stmt_buf[cc_stmt_buf_idx + 1] == '=') { 03024 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Le; 03025 CC_NEXT_LA_CH; 03026 } 03027 else if (cc_stmt_buf[cc_stmt_buf_idx + 1] == '<') { 03028 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Lshift; 03029 CC_NEXT_LA_CH; 03030 } 03031 else { 03032 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Lt; 03033 } 03034 03035 CC_NEXT_LA_CH; 03036 break; 03037 03038 case '&': 03039 03040 if (cc_stmt_buf[cc_stmt_buf_idx + 1] == '&') { 03041 TOKEN_VALUE(cc_token) = Cc_Tok_Op_And; 03042 CC_NEXT_LA_CH; 03043 } 03044 else { 03045 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Band; 03046 } 03047 03048 CC_NEXT_LA_CH; 03049 break; 03050 03051 case '|': 03052 03053 if (cc_stmt_buf[cc_stmt_buf_idx + 1] == '|') { 03054 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Or; 03055 CC_NEXT_LA_CH; 03056 } 03057 else { 03058 TOKEN_VALUE(cc_token) = Cc_Tok_Op_Bor; 03059 } 03060 03061 CC_NEXT_LA_CH; 03062 break; 03063 03064 } /* end switch */ 03065 03066 } 03067 03068 TRACE (Func_Exit, "cc_get_token", NULL); 03069 03070 return; 03071 03072 } /* cc_get_token */ 03073 03074 /******************************************************************************\ 03075 |* *| 03076 |* Description: *| 03077 |* <description> *| 03078 |* *| 03079 |* Input parameters: *| 03080 |* NONE *| 03081 |* *| 03082 |* Output parameters: *| 03083 |* NONE *| 03084 |* *| 03085 |* Returns: *| 03086 |* NOTHING *| 03087 |* *| 03088 \******************************************************************************/ 03089 03090 static void cc_get_next_char(void) 03091 03092 { 03093 03094 int col; 03095 int line; 03096 03097 03098 TRACE (Func_Entry, "cc_get_next_char", NULL); 03099 03100 cc_stmt_buf_idx++; 03101 03102 BACK: 03103 03104 /* skip any leading white space */ 03105 while (cc_stmt_buf[cc_stmt_buf_idx] == blank || 03106 cc_stmt_buf[cc_stmt_buf_idx] == tab) { 03107 03108 cc_stmt_buf_idx++; 03109 } 03110 03111 if (cc_stmt_buf[cc_stmt_buf_idx] == '/' && 03112 cc_stmt_buf[cc_stmt_buf_idx + 1] == '*') { 03113 /* this is a comment */ 03114 cc_stmt_buf_idx += 2; 03115 03116 while (! (cc_stmt_buf[cc_stmt_buf_idx] == '*' && 03117 cc_stmt_buf[cc_stmt_buf_idx + 1] == '/') && 03118 cc_stmt_buf[cc_stmt_buf_idx] != newline) { 03119 cc_stmt_buf_idx++; 03120 } 03121 03122 if (cc_stmt_buf[cc_stmt_buf_idx] != newline) { 03123 cc_stmt_buf_idx += 2; 03124 goto BACK; 03125 } 03126 } 03127 03128 if (cc_stmt_buf[cc_stmt_buf_idx] == newline) { 03129 CC_LA_CH_VALUE = eos; 03130 } 03131 else { 03132 CC_LA_CH_VALUE = cc_stmt_buf[cc_stmt_buf_idx]; 03133 } 03134 03135 find_line_and_col(cc_stmt_buf_idx, &line, &col); 03136 CC_LA_CH_LINE = line; 03137 CC_LA_CH_COLUMN = col; 03138 CC_LA_CH_CLASS = (CC_LA_CH_VALUE == (char) EOF) ? 03139 Ch_Class_EOF : ch_class[CC_LA_CH_VALUE]; 03140 03141 03142 TRACE (Func_Exit, "cc_get_next_char", NULL); 03143 03144 return; 03145 03146 } /* cc_get_next_char */ 03147 03148 /******************************************************************************\ 03149 |* *| 03150 |* Description: *| 03151 |* <description> *| 03152 |* *| 03153 |* Input parameters: *| 03154 |* NONE *| 03155 |* *| 03156 |* Output parameters: *| 03157 |* NONE *| 03158 |* *| 03159 |* Returns: *| 03160 |* NOTHING *| 03161 |* *| 03162 \******************************************************************************/ 03163 03164 static void cc_get_stmt(void) 03165 03166 { 03167 int char_start_idx; 03168 int comment_start_idx; 03169 char delim; 03170 int idx; 03171 boolean in_char_context = FALSE; 03172 boolean is_define_dir = FALSE; 03173 int save_idx; 03174 int start_col; 03175 int start_line; 03176 03177 TRACE (Func_Entry, "cc_get_stmt", NULL); 03178 03179 cc_line_continued = FALSE; 03180 03181 cc_stmt_buf_len = cc_stmt_buf_idx; 03182 cc_stmt_buf_idx = NULL_IDX; 03183 03184 CC_NEXT_LA_CH; /* # */ 03185 03186 CC_NEXT_LA_CH; 03187 03188 cc_get_token(TRUE); 03189 03190 if (TOKEN_VALUE(cc_token) == Cc_Tok_Kwd_Define) { 03191 is_define_dir = TRUE; 03192 } 03193 03194 cc_stmt_buf_idx = NULL_IDX; 03195 03196 while (cc_stmt_buf[++cc_stmt_buf_idx] != eos) { 03197 03198 if (cc_stmt_buf[cc_stmt_buf_idx] == QUOTE || 03199 cc_stmt_buf[cc_stmt_buf_idx] == DBL_QUOTE) { 03200 03201 if (in_char_context) { 03202 03203 if (delim == cc_stmt_buf[cc_stmt_buf_idx] && 03204 delim != cc_stmt_buf[cc_stmt_buf_idx+1]) { 03205 in_char_context = FALSE; 03206 } 03207 else if (delim == cc_stmt_buf[cc_stmt_buf_idx] && 03208 delim == cc_stmt_buf[cc_stmt_buf_idx+1]) { 03209 cc_stmt_buf_idx++; 03210 } 03211 } 03212 else { 03213 /* not in character context. */ 03214 03215 in_char_context = TRUE; 03216 char_start_idx = cc_stmt_buf_idx; 03217 delim = cc_stmt_buf[cc_stmt_buf_idx]; 03218 } 03219 } 03220 03221 if (! in_char_context && 03222 cc_stmt_buf[cc_stmt_buf_idx] == '/' && 03223 cc_stmt_buf[cc_stmt_buf_idx + 1] == '*') { 03224 /* this is a comment */ 03225 comment_start_idx = cc_stmt_buf_idx; 03226 start_line = cc_stmt_buf_line[cc_stmt_buf_num_lines].line; 03227 start_col = comment_start_idx - 03228 cc_stmt_buf_line[cc_stmt_buf_num_lines].start_idx; 03229 cc_stmt_buf_idx += 2; 03230 03231 while (! (cc_stmt_buf[cc_stmt_buf_idx] == '*' && 03232 cc_stmt_buf[cc_stmt_buf_idx + 1] == '/')) { 03233 03234 # if 0 03235 if (cc_stmt_buf[cc_stmt_buf_idx] == eos || 03236 cc_stmt_buf_idx >= MAX_STMT_CHAR_SIZE - MAX_SRC_LINE_SIZE) { 03237 ntr_next_msg_queue(start_line, xxxx, Error, 03238 start_col, 03239 (char *)NULL, 03240 0, 03241 NO_ARG); 03242 goto EXIT; 03243 } 03244 # endif 03245 03246 if (cc_stmt_buf[cc_stmt_buf_idx] == newline) { 03247 cc_stmt_buf_idx--; 03248 save_idx = cc_stmt_buf_idx; 03249 read_line(TRUE); 03250 cc_stmt_buf_len = cc_stmt_buf_idx; 03251 cc_line_continued = TRUE; 03252 cc_stmt_buf_idx = save_idx; 03253 03254 if (on_off_flags.preprocess_only || on_off_flags.save_dot_i) { 03255 /* print blank line */ 03256 fprintf(dot_i_fptr, "\n"); 03257 } 03258 } 03259 cc_stmt_buf_idx++; 03260 } 03261 03262 cc_stmt_buf_idx += 2; 03263 } 03264 03265 03266 if (cc_stmt_buf[cc_stmt_buf_idx] == newline && 03267 cc_stmt_buf[cc_stmt_buf_idx - 1] == '\\') { 03268 cc_stmt_buf_idx -= 2; 03269 03270 save_idx = cc_stmt_buf_idx; 03271 read_line(TRUE); 03272 cc_stmt_buf_len = cc_stmt_buf_idx; 03273 cc_line_continued = TRUE; 03274 cc_stmt_buf_idx = save_idx; 03275 03276 if (on_off_flags.preprocess_only || on_off_flags.save_dot_i) { 03277 /* print blank line */ 03278 fprintf(dot_i_fptr, "\n"); 03279 } 03280 03281 } 03282 else if (is_define_dir && 03283 cc_stmt_buf[cc_stmt_buf_idx] == amp && 03284 source_form == Free_Form) { 03285 03286 idx = cc_stmt_buf_idx + 1; 03287 03288 while (cc_stmt_buf[idx] == blank || 03289 cc_stmt_buf[idx] == tab) { 03290 idx++; 03291 } 03292 03293 if (cc_stmt_buf[idx] == '!' || 03294 cc_stmt_buf[idx] == newline) { 03295 03296 cc_stmt_buf_idx--; 03297 03298 save_idx = cc_stmt_buf_idx; 03299 read_line(TRUE); 03300 cc_stmt_buf_len = cc_stmt_buf_idx; 03301 cc_line_continued = TRUE; 03302 cc_stmt_buf_idx = save_idx; 03303 03304 idx = cc_stmt_buf_idx + 1; 03305 03306 while (cc_stmt_buf[idx] == blank || 03307 cc_stmt_buf[idx] == tab) { 03308 idx++; 03309 } 03310 03311 if (cc_stmt_buf[idx] == amp) { 03312 shift_cc_stmt_buf(idx+1, 03313 cc_stmt_buf_idx - idx); 03314 } 03315 03316 if (on_off_flags.preprocess_only || on_off_flags.save_dot_i) { 03317 /* print blank line */ 03318 fprintf(dot_i_fptr, "\n"); 03319 } 03320 } 03321 } 03322 else if (! in_char_context && 03323 is_define_dir && 03324 cc_stmt_buf[cc_stmt_buf_idx] == '!') { 03325 03326 idx = cc_stmt_buf_idx; 03327 while (cc_stmt_buf[idx] != newline) { 03328 idx++; 03329 } 03330 03331 if (cc_stmt_buf[idx-1] == '\\') { 03332 idx--; 03333 } 03334 03335 shift_cc_stmt_buf(idx, 03336 cc_stmt_buf_idx - idx); 03337 cc_stmt_buf_idx--; 03338 03339 } 03340 } 03341 03342 if (in_char_context) { 03343 find_line_and_col(char_start_idx, &start_line, &start_col); 03344 ntr_next_msg_queue(start_line, 1631, Warning, 03345 start_col, 03346 (char *)NULL, 03347 0, 03348 NO_ARG); 03349 } 03350 03351 # if 0 03352 EXIT: 03353 # endif 03354 03355 cc_stmt_buf_line[cc_stmt_buf_num_lines+1].line = 03356 cc_stmt_buf_line[cc_stmt_buf_num_lines].line; 03357 cc_stmt_buf_line[cc_stmt_buf_num_lines+1].start_idx = cc_stmt_buf_idx; 03358 cc_stmt_buf_len = cc_stmt_buf_idx; 03359 cc_stmt_buf[cc_stmt_buf_idx+1] = '\0'; 03360 cc_stmt_buf_idx = NULL_IDX; 03361 03362 TRACE (Func_Exit, "cc_get_stmt", NULL); 03363 03364 return; 03365 03366 } /* cc_get_stmt */ 03367 03368 /******************************************************************************\ 03369 |* *| 03370 |* Description: *| 03371 |* BNF level-5-expr { defined-binary-op level-5-expr } *| 03372 |* *| 03373 |* Input parameters: *| 03374 |* NONE *| 03375 |* *| 03376 |* Output parameters: *| 03377 |* NONE *| 03378 |* *| 03379 |* Returns: *| 03380 |* *| 03381 \******************************************************************************/ 03382 03383 static boolean parse_cc_expr (opnd_type *result) 03384 03385 { 03386 opnd_type opnd; 03387 boolean parsed_ok = TRUE; 03388 03389 TRACE (Func_Entry, "parse_cc_expr", NULL); 03390 03391 parsed_ok = parse_cc_level_8(&opnd); 03392 03393 COPY_OPND((*result), opnd) 03394 03395 # if 0 03396 print_ir(OPND_IDX(opnd)); 03397 # endif 03398 03399 TRACE (Func_Exit, "parse_cc_expr", NULL); 03400 03401 return(parsed_ok); 03402 } /* parse_cc_expr */ 03403 03404 /******************************************************************************\ 03405 |* *| 03406 |* Description: *| 03407 |* BNF [not-op] level-5-expr *| 03408 |* *| 03409 |* Input parameters: *| 03410 |* NONE *| 03411 |* *| 03412 |* Output parameters: *| 03413 |* NONE *| 03414 |* *| 03415 |* Returns: *| 03416 |* NOTHING *| 03417 |* *| 03418 \******************************************************************************/ 03419 03420 static boolean parse_cc_mult_opnd(opnd_type *result) 03421 03422 { 03423 int ir_idx = NULL_IDX; 03424 opnd_type opnd; 03425 boolean parsed_ok = TRUE; 03426 03427 03428 TRACE (Func_Entry, "parse_cc_mult_opnd", NULL); 03429 03430 if ((cc_stmt_buf[cc_stmt_buf_idx] == '!' && 03431 cc_stmt_buf[cc_stmt_buf_idx+1] != '=') || 03432 cc_stmt_buf[cc_stmt_buf_idx] == '~' || 03433 cc_stmt_buf[cc_stmt_buf_idx] == '+' || 03434 cc_stmt_buf[cc_stmt_buf_idx] == '-') { 03435 03436 cc_get_token(FALSE); 03437 03438 NTR_IR_TBL(ir_idx); 03439 OPND_FLD((*result)) = IR_Tbl_Idx; 03440 OPND_IDX((*result)) = ir_idx; 03441 switch (TOKEN_VALUE(cc_token)) { 03442 case Cc_Tok_Op_Add : 03443 IR_OPR(ir_idx) = Uplus_Opr; 03444 break; 03445 case Cc_Tok_Op_Sub : 03446 IR_OPR(ir_idx) = Uminus_Opr; 03447 break; 03448 case Cc_Tok_Op_Bnot : 03449 IR_OPR(ir_idx) = Bnot_Opr; 03450 break; 03451 case Cc_Tok_Op_Not : 03452 IR_OPR(ir_idx) = Not_Opr; 03453 break; 03454 } 03455 03456 IR_LINE_NUM(ir_idx) = TOKEN_LINE(cc_token); 03457 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(cc_token); 03458 } 03459 03460 parsed_ok = parse_cc_operand(&opnd); 03461 03462 if (ir_idx) { 03463 COPY_OPND(IR_OPND_L(ir_idx), opnd); 03464 } 03465 else { 03466 COPY_OPND((*result), opnd); 03467 } 03468 03469 TRACE (Func_Exit, "parse_cc_mult_opnd", NULL); 03470 03471 return(parsed_ok); 03472 } /* parse_cc_mult_opnd */ 03473 03474 /******************************************************************************\ 03475 |* *| 03476 |* Description: *| 03477 |* BNF opnd {mult-op opnd} *| 03478 |* *| 03479 |* Input parameters: *| 03480 |* NONE *| 03481 |* *| 03482 |* Output parameters: *| 03483 |* NONE *| 03484 |* *| 03485 |* Returns: *| 03486 |* NOTHING *| 03487 |* *| 03488 \******************************************************************************/ 03489 03490 static boolean parse_cc_add_opnd(opnd_type *result) 03491 03492 { 03493 int ir_idx; 03494 opnd_type opnd; 03495 boolean parsed_ok = TRUE; 03496 03497 TRACE (Func_Entry, "parse_cc_add_opnd", NULL); 03498 03499 parsed_ok = parse_cc_mult_opnd(&opnd) && parsed_ok; 03500 03501 if (CC_LA_CH_VALUE == '+' || 03502 CC_LA_CH_VALUE == '/' || 03503 CC_LA_CH_VALUE == '%' || 03504 CC_LA_CH_VALUE == '*' || 03505 CC_LA_CH_VALUE == '-' || 03506 CC_LA_CH_VALUE == '!' || 03507 CC_LA_CH_VALUE == '~' || 03508 CC_LA_CH_VALUE == '^' || 03509 CC_LA_CH_VALUE == '=' || 03510 CC_LA_CH_VALUE == '>' || 03511 CC_LA_CH_VALUE == '<' || 03512 CC_LA_CH_VALUE == '&' || 03513 CC_LA_CH_VALUE == '|') { 03514 03515 cc_get_token(FALSE); 03516 } 03517 03518 while (TOKEN_VALUE(cc_token) == Cc_Tok_Op_Mult || 03519 TOKEN_VALUE(cc_token) == Cc_Tok_Op_Div || 03520 TOKEN_VALUE(cc_token) == Cc_Tok_Op_Mod) { 03521 03522 NTR_IR_TBL(ir_idx); 03523 switch (TOKEN_VALUE(cc_token)) { 03524 case Cc_Tok_Op_Mult : 03525 IR_OPR(ir_idx) = Mult_Opr; 03526 break; 03527 case Cc_Tok_Op_Div : 03528 IR_OPR(ir_idx) = Div_Opr; 03529 break; 03530 case Cc_Tok_Op_Mod : 03531 IR_OPR(ir_idx) = Mod_Opr; 03532 break; 03533 } 03534 IR_LINE_NUM(ir_idx) = TOKEN_LINE(cc_token); 03535 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(cc_token); 03536 03537 COPY_OPND(IR_OPND_L(ir_idx), opnd); 03538 03539 parsed_ok = parse_cc_mult_opnd(&opnd) && parsed_ok; 03540 03541 COPY_OPND(IR_OPND_R(ir_idx), opnd); 03542 03543 OPND_FLD(opnd) = IR_Tbl_Idx; 03544 OPND_IDX(opnd) = ir_idx; 03545 03546 if (CC_LA_CH_VALUE == '+' || 03547 CC_LA_CH_VALUE == '/' || 03548 CC_LA_CH_VALUE == '%' || 03549 CC_LA_CH_VALUE == '*' || 03550 CC_LA_CH_VALUE == '-' || 03551 CC_LA_CH_VALUE == '!' || 03552 CC_LA_CH_VALUE == '~' || 03553 CC_LA_CH_VALUE == '^' || 03554 CC_LA_CH_VALUE == '=' || 03555 CC_LA_CH_VALUE == '>' || 03556 CC_LA_CH_VALUE == '<' || 03557 CC_LA_CH_VALUE == '&' || 03558 CC_LA_CH_VALUE == '|') { 03559 03560 cc_get_token(FALSE); 03561 } 03562 } 03563 03564 COPY_OPND((*result), opnd) 03565 03566 TRACE (Func_Exit, "parse_cc_add_opnd", NULL); 03567 03568 return(parsed_ok); 03569 } /* parse_cc_add_opnd */ 03570 03571 /******************************************************************************\ 03572 |* *| 03573 |* Description: *| 03574 |* BNF [add-op] add-opnd {add-op add-opnd} *| 03575 |* *| 03576 |* Input parameters: *| 03577 |* NONE *| 03578 |* *| 03579 |* Output parameters: *| 03580 |* NONE *| 03581 |* *| 03582 |* Returns: *| 03583 |* NOTHING *| 03584 |* *| 03585 \******************************************************************************/ 03586 03587 static boolean parse_cc_level_2(opnd_type *result) 03588 03589 { 03590 int ir_idx = NULL_IDX; 03591 opnd_type opnd; 03592 boolean parsed_ok = TRUE; 03593 03594 TRACE (Func_Entry, "parse_cc_level_2", NULL); 03595 03596 parsed_ok = parse_cc_add_opnd(&opnd); 03597 03598 if (ir_idx) { 03599 COPY_OPND(IR_OPND_L(ir_idx), opnd); 03600 OPND_FLD(opnd) = IR_Tbl_Idx; 03601 OPND_IDX(opnd) = ir_idx; 03602 } 03603 03604 while (TOKEN_VALUE(cc_token) == Cc_Tok_Op_Add || 03605 TOKEN_VALUE(cc_token) == Cc_Tok_Op_Sub) { 03606 03607 NTR_IR_TBL(ir_idx); 03608 switch (TOKEN_VALUE(cc_token)) { 03609 case Cc_Tok_Op_Add : 03610 IR_OPR(ir_idx) = Plus_Opr; 03611 break; 03612 case Cc_Tok_Op_Sub : 03613 IR_OPR(ir_idx) = Minus_Opr; 03614 } 03615 IR_LINE_NUM(ir_idx) = TOKEN_LINE(cc_token); 03616 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(cc_token); 03617 03618 COPY_OPND(IR_OPND_L(ir_idx), opnd); 03619 03620 parsed_ok = parse_cc_add_opnd(&opnd) && parsed_ok; 03621 03622 COPY_OPND(IR_OPND_R(ir_idx), opnd); 03623 03624 OPND_FLD(opnd) = IR_Tbl_Idx; 03625 OPND_IDX(opnd) = ir_idx; 03626 } 03627 03628 COPY_OPND((*result), opnd) 03629 03630 TRACE (Func_Exit, "parse_cc_level_2", NULL); 03631 03632 return(parsed_ok); 03633 } /* parse_cc_level_2 */ 03634 03635 /******************************************************************************\ 03636 |* *| 03637 |* Description: *| 03638 |* BNF shift-opnd {shift-op shift-opnd} *| 03639 |* *| 03640 |* Input parameters: *| 03641 |* NONE *| 03642 |* *| 03643 |* Output parameters: *| 03644 |* NONE *| 03645 |* *| 03646 |* Returns: *| 03647 |* NOTHING *| 03648 |* *| 03649 \******************************************************************************/ 03650 03651 static boolean parse_cc_level_3(opnd_type *result) 03652 03653 { 03654 int ir_idx = NULL_IDX; 03655 opnd_type opnd; 03656 boolean parsed_ok = TRUE; 03657 03658 TRACE (Func_Entry, "parse_cc_level_3", NULL); 03659 03660 parsed_ok = parse_cc_level_2(&opnd); 03661 03662 while (TOKEN_VALUE(cc_token) == Cc_Tok_Op_Lshift || 03663 TOKEN_VALUE(cc_token) == Cc_Tok_Op_Rshift) { 03664 03665 NTR_IR_TBL(ir_idx); 03666 switch (TOKEN_VALUE(cc_token)) { 03667 case Cc_Tok_Op_Lshift : 03668 IR_OPR(ir_idx) = Shiftl_Opr; 03669 break; 03670 case Cc_Tok_Op_Rshift : 03671 IR_OPR(ir_idx) = Shiftr_Opr; 03672 } 03673 IR_LINE_NUM(ir_idx) = TOKEN_LINE(cc_token); 03674 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(cc_token); 03675 03676 COPY_OPND(IR_OPND_L(ir_idx), opnd); 03677 03678 parsed_ok = parse_cc_level_2(&opnd) && parsed_ok; 03679 03680 COPY_OPND(IR_OPND_R(ir_idx), opnd); 03681 03682 OPND_FLD(opnd) = IR_Tbl_Idx; 03683 OPND_IDX(opnd) = ir_idx; 03684 } 03685 03686 COPY_OPND((*result), opnd) 03687 03688 TRACE (Func_Exit, "parse_cc_level_3", NULL); 03689 03690 return(parsed_ok); 03691 } /* parse_cc_level_3 */ 03692 03693 /******************************************************************************\ 03694 |* *| 03695 |* Description: *| 03696 |* BNF [level-2-expr rel-op] level-2-expr *| 03697 |* *| 03698 |* Input parameters: *| 03699 |* NONE *| 03700 |* *| 03701 |* Output parameters: *| 03702 |* NONE *| 03703 |* *| 03704 |* Returns: *| 03705 |* NOTHING *| 03706 |* *| 03707 \******************************************************************************/ 03708 03709 static boolean parse_cc_level_4(opnd_type *result) 03710 03711 { 03712 int ir_idx; 03713 opnd_type opnd; 03714 boolean parsed_ok = TRUE; 03715 03716 TRACE (Func_Entry, "parse_cc_level_4", NULL); 03717 03718 parsed_ok = parse_cc_level_3(&opnd); 03719 03720 if (TOKEN_VALUE(cc_token) == Cc_Tok_Op_Ge || 03721 TOKEN_VALUE(cc_token) == Cc_Tok_Op_Gt || 03722 TOKEN_VALUE(cc_token) == Cc_Tok_Op_Le || 03723 TOKEN_VALUE(cc_token) == Cc_Tok_Op_Lt) { 03724 03725 NTR_IR_TBL(ir_idx); 03726 switch (TOKEN_VALUE(cc_token)) { 03727 case Cc_Tok_Op_Ge : 03728 IR_OPR(ir_idx) = Ge_Opr; 03729 break; 03730 case Cc_Tok_Op_Gt : 03731 IR_OPR(ir_idx) = Gt_Opr; 03732 break; 03733 case Cc_Tok_Op_Le : 03734 IR_OPR(ir_idx) = Le_Opr; 03735 break; 03736 case Cc_Tok_Op_Lt : 03737 IR_OPR(ir_idx) = Lt_Opr; 03738 break; 03739 } 03740 IR_LINE_NUM(ir_idx) = TOKEN_LINE(cc_token); 03741 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(cc_token); 03742 03743 COPY_OPND(IR_OPND_L(ir_idx), opnd); 03744 03745 parsed_ok = parse_cc_level_3(&opnd) && parsed_ok; 03746 03747 COPY_OPND(IR_OPND_R(ir_idx), opnd); 03748 03749 OPND_FLD(opnd) = IR_Tbl_Idx; 03750 OPND_IDX(opnd) = ir_idx; 03751 } 03752 03753 COPY_OPND((*result), opnd) 03754 03755 TRACE (Func_Exit, "parse_cc_level_4", NULL); 03756 03757 return(parsed_ok); 03758 } /* parse_cc_level_4 */ 03759 03760 /******************************************************************************\ 03761 |* *| 03762 |* Description: *| 03763 |* BNF [level-4-expr rel-op] level-4-expr *| 03764 |* *| 03765 |* Input parameters: *| 03766 |* NONE *| 03767 |* *| 03768 |* Output parameters: *| 03769 |* NONE *| 03770 |* *| 03771 |* Returns: *| 03772 |* NOTHING *| 03773 |* *| 03774 \******************************************************************************/ 03775 03776 static boolean parse_cc_level_5(opnd_type *result) 03777 03778 { 03779 int ir_idx; 03780 opnd_type opnd; 03781 boolean parsed_ok = TRUE; 03782 03783 TRACE (Func_Entry, "parse_cc_level_5", NULL); 03784 03785 parsed_ok = parse_cc_level_4(&opnd); 03786 03787 if (TOKEN_VALUE(cc_token) == Cc_Tok_Op_Eq || 03788 TOKEN_VALUE(cc_token) == Cc_Tok_Op_Ne) { 03789 03790 NTR_IR_TBL(ir_idx); 03791 switch (TOKEN_VALUE(cc_token)) { 03792 case Cc_Tok_Op_Eq : 03793 IR_OPR(ir_idx) = Eq_Opr; 03794 break; 03795 case Cc_Tok_Op_Ne : 03796 IR_OPR(ir_idx) = Ne_Opr; 03797 break; 03798 } 03799 IR_LINE_NUM(ir_idx) = TOKEN_LINE(cc_token); 03800 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(cc_token); 03801 03802 COPY_OPND(IR_OPND_L(ir_idx), opnd); 03803 03804 parsed_ok = parse_cc_level_4(&opnd) && parsed_ok; 03805 03806 COPY_OPND(IR_OPND_R(ir_idx), opnd); 03807 03808 OPND_FLD(opnd) = IR_Tbl_Idx; 03809 OPND_IDX(opnd) = ir_idx; 03810 } 03811 03812 COPY_OPND((*result), opnd) 03813 03814 TRACE (Func_Exit, "parse_cc_level_5", NULL); 03815 03816 return(parsed_ok); 03817 } /* parse_cc_level_5 */ 03818 03819 /******************************************************************************\ 03820 |* *| 03821 |* Description: *| 03822 |* BNF and_opnd { and_op and_opnd } *| 03823 |* *| 03824 |* Input parameters: *| 03825 |* NONE *| 03826 |* *| 03827 |* Output parameters: *| 03828 |* NONE *| 03829 |* *| 03830 |* Returns: *| 03831 |* NOTHING *| 03832 |* *| 03833 \******************************************************************************/ 03834 03835 static boolean parse_cc_or_opnd(opnd_type *result) 03836 03837 { 03838 int ir_idx; 03839 opnd_type opnd; 03840 boolean parsed_ok = TRUE; 03841 03842 TRACE (Func_Entry, "parse_cc_or_opnd", NULL); 03843 03844 parsed_ok = parse_cc_level_5(&opnd); 03845 03846 while (TOKEN_VALUE(cc_token) == Cc_Tok_Op_Band) { 03847 03848 NTR_IR_TBL(ir_idx); 03849 IR_OPR(ir_idx) = Band_Opr; 03850 IR_LINE_NUM(ir_idx) = TOKEN_LINE(cc_token); 03851 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(cc_token); 03852 03853 COPY_OPND(IR_OPND_L(ir_idx), opnd) 03854 03855 parsed_ok = parse_cc_level_5(&opnd) && parsed_ok; 03856 03857 COPY_OPND(IR_OPND_R(ir_idx), opnd) 03858 03859 OPND_FLD(opnd) = IR_Tbl_Idx; 03860 OPND_IDX(opnd) = ir_idx; 03861 } 03862 03863 COPY_OPND((*result), opnd) 03864 03865 TRACE (Func_Exit, "parse_cc_or_opnd", NULL); 03866 03867 return(parsed_ok); 03868 } /* parse_cc_or_opnd */ 03869 03870 /******************************************************************************\ 03871 |* *| 03872 |* Description: *| 03873 |* BNF equiv-opnd { equiv-op equiv-opnd } *| 03874 |* *| 03875 |* Input parameters: *| 03876 |* NONE *| 03877 |* *| 03878 |* Output parameters: *| 03879 |* NONE *| 03880 |* *| 03881 |* Returns: *| 03882 |* NOTHING *| 03883 |* *| 03884 \******************************************************************************/ 03885 03886 static boolean parse_cc_level_6(opnd_type *result) 03887 03888 { 03889 int ir_idx; 03890 opnd_type opnd; 03891 boolean parsed_ok = TRUE; 03892 03893 TRACE (Func_Entry, "parse_cc_level_6", NULL); 03894 03895 parsed_ok = parse_cc_or_opnd(&opnd); 03896 03897 while (TOKEN_VALUE(cc_token) == Cc_Tok_Op_Neqv) { 03898 03899 NTR_IR_TBL(ir_idx); 03900 IR_OPR(ir_idx) = Neqv_Opr; 03901 IR_LINE_NUM(ir_idx) = TOKEN_LINE(cc_token); 03902 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(cc_token); 03903 03904 COPY_OPND(IR_OPND_L(ir_idx), opnd) 03905 03906 parsed_ok = parse_cc_equiv_opnd(&opnd) && parsed_ok; 03907 03908 COPY_OPND(IR_OPND_R(ir_idx), opnd) 03909 03910 OPND_FLD(opnd) = IR_Tbl_Idx; 03911 OPND_IDX(opnd) = ir_idx; 03912 } 03913 03914 COPY_OPND((*result), opnd) 03915 03916 TRACE (Func_Exit, "parse_cc_level_6", NULL); 03917 03918 return(parsed_ok); 03919 } /* parse_cc_level_6 */ 03920 03921 /******************************************************************************\ 03922 |* *| 03923 |* Description: *| 03924 |* BNF or_opnd { or_op or_opnd } *| 03925 |* *| 03926 |* Input parameters: *| 03927 |* NONE *| 03928 |* *| 03929 |* Output parameters: *| 03930 |* NONE *| 03931 |* *| 03932 |* Returns: *| 03933 |* NOTHING *| 03934 |* *| 03935 \******************************************************************************/ 03936 03937 static boolean parse_cc_equiv_opnd(opnd_type *result) 03938 03939 { 03940 int ir_idx; 03941 opnd_type opnd; 03942 boolean parsed_ok = TRUE; 03943 03944 TRACE (Func_Entry, "parse_cc_equiv_opnd", NULL); 03945 03946 parsed_ok = parse_cc_level_6(&opnd); 03947 03948 while (TOKEN_VALUE(cc_token) == Cc_Tok_Op_Bor) { 03949 03950 NTR_IR_TBL(ir_idx); 03951 IR_OPR(ir_idx) = Bor_Opr; 03952 IR_LINE_NUM(ir_idx) = TOKEN_LINE(cc_token); 03953 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(cc_token); 03954 03955 COPY_OPND(IR_OPND_L(ir_idx), opnd) 03956 03957 parsed_ok = parse_cc_level_6(&opnd) && parsed_ok; 03958 03959 COPY_OPND(IR_OPND_R(ir_idx), opnd) 03960 03961 OPND_FLD(opnd) = IR_Tbl_Idx; 03962 OPND_IDX(opnd) = ir_idx; 03963 } 03964 03965 COPY_OPND((*result), opnd) 03966 03967 TRACE (Func_Exit, "parse_cc_equiv_opnd", NULL); 03968 03969 return(parsed_ok); 03970 } /* parse_cc_equiv_opnd */ 03971 03972 /******************************************************************************\ 03973 |* *| 03974 |* Description: *| 03975 |* BNF and_opnd { and_op and_opnd } *| 03976 |* *| 03977 |* Input parameters: *| 03978 |* NONE *| 03979 |* *| 03980 |* Output parameters: *| 03981 |* NONE *| 03982 |* *| 03983 |* Returns: *| 03984 |* NOTHING *| 03985 |* *| 03986 \******************************************************************************/ 03987 03988 static boolean parse_cc_level_7(opnd_type *result) 03989 03990 { 03991 int ir_idx; 03992 opnd_type opnd; 03993 boolean parsed_ok = TRUE; 03994 03995 TRACE (Func_Entry, "parse_cc_level_7", NULL); 03996 03997 parsed_ok = parse_cc_equiv_opnd(&opnd); 03998 03999 while (TOKEN_VALUE(cc_token) == Cc_Tok_Op_And) { 04000 04001 NTR_IR_TBL(ir_idx); 04002 IR_OPR(ir_idx) = And_Opr; 04003 IR_LINE_NUM(ir_idx) = TOKEN_LINE(cc_token); 04004 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(cc_token); 04005 04006 COPY_OPND(IR_OPND_L(ir_idx), opnd) 04007 04008 parsed_ok = parse_cc_equiv_opnd(&opnd) && parsed_ok; 04009 04010 COPY_OPND(IR_OPND_R(ir_idx), opnd) 04011 04012 OPND_FLD(opnd) = IR_Tbl_Idx; 04013 OPND_IDX(opnd) = ir_idx; 04014 } 04015 04016 COPY_OPND((*result), opnd) 04017 04018 TRACE (Func_Exit, "parse_cc_level_7", NULL); 04019 04020 return(parsed_ok); 04021 } /* parse_cc_level_7 */ 04022 04023 /******************************************************************************\ 04024 |* *| 04025 |* Description: *| 04026 |* BNF or_opnd { or_op or_opnd } *| 04027 |* *| 04028 |* Input parameters: *| 04029 |* NONE *| 04030 |* *| 04031 |* Output parameters: *| 04032 |* NONE *| 04033 |* *| 04034 |* Returns: *| 04035 |* NOTHING *| 04036 |* *| 04037 \******************************************************************************/ 04038 04039 static boolean parse_cc_level_8(opnd_type *result) 04040 04041 { 04042 int ir_idx; 04043 opnd_type opnd; 04044 boolean parsed_ok = TRUE; 04045 04046 TRACE (Func_Entry, "parse_cc_level_8", NULL); 04047 04048 parsed_ok = parse_cc_level_7(&opnd); 04049 04050 while (TOKEN_VALUE(cc_token) == Cc_Tok_Op_Or) { 04051 04052 NTR_IR_TBL(ir_idx); 04053 IR_OPR(ir_idx) = Or_Opr; 04054 IR_LINE_NUM(ir_idx) = TOKEN_LINE(cc_token); 04055 IR_COL_NUM(ir_idx) = TOKEN_COLUMN(cc_token); 04056 04057 COPY_OPND(IR_OPND_L(ir_idx), opnd) 04058 04059 parsed_ok = parse_cc_level_7(&opnd) && parsed_ok; 04060 04061 COPY_OPND(IR_OPND_R(ir_idx), opnd) 04062 04063 OPND_FLD(opnd) = IR_Tbl_Idx; 04064 OPND_IDX(opnd) = ir_idx; 04065 } 04066 04067 COPY_OPND((*result), opnd) 04068 04069 TRACE (Func_Exit, "parse_cc_level_8", NULL); 04070 04071 return(parsed_ok); 04072 } /* parse_cc_level_8 */ 04073 04074 /******************************************************************************\ 04075 |* *| 04076 |* Description: *| 04077 |* <description> *| 04078 |* *| 04079 |* Input parameters: *| 04080 |* NONE *| 04081 |* *| 04082 |* Output parameters: *| 04083 |* NONE *| 04084 |* *| 04085 |* Returns: *| 04086 |* NOTHING *| 04087 |* *| 04088 \******************************************************************************/ 04089 static boolean parse_cc_operand (opnd_type *the_opnd) 04090 04091 { 04092 int attr_idx; 04093 int col; 04094 int ir_idx; 04095 int line; 04096 int name_idx; 04097 int paren_cnt = 0; 04098 boolean parsed_ok = TRUE; 04099 04100 04101 TRACE (Func_Entry, "parse_cc_operand", NULL); 04102 04103 if (CC_LA_CH_VALUE == '(' ) { 04104 04105 line = CC_LA_CH_LINE; 04106 col = CC_LA_CH_COLUMN; 04107 04108 CC_NEXT_LA_CH; /* swallow ( */ 04109 04110 if (!parse_cc_expr(the_opnd)) { 04111 parsed_ok = FALSE; 04112 } 04113 else if (CC_LA_CH_VALUE == ')') { 04114 /* insert paren_opr */ 04115 NTR_IR_TBL(ir_idx); 04116 IR_OPR(ir_idx) = Paren_Opr; 04117 COPY_OPND(IR_OPND_L(ir_idx), (*the_opnd)); 04118 OPND_FLD((*the_opnd)) = IR_Tbl_Idx; 04119 OPND_IDX((*the_opnd)) = ir_idx; 04120 IR_LINE_NUM(ir_idx) = line; 04121 IR_COL_NUM(ir_idx) = col; 04122 04123 CC_NEXT_LA_CH; /* swallow ) */ 04124 goto EXIT; 04125 } 04126 else { 04127 /* unmatched paranthesis */ 04128 ntr_next_msg_queue(CC_LA_CH_LINE, 1165, Error, 04129 CC_LA_CH_COLUMN, 04130 ")", 04131 0, 04132 STR_ARG); 04133 parsed_ok = FALSE; 04134 flush_cc_line(); 04135 } 04136 goto EXIT; 04137 } 04138 else if (CC_LA_CH_CLASS == Ch_Class_Digit || 04139 CC_LA_CH_CLASS == Ch_Class_Letter || 04140 CC_LA_CH_VALUE == underscore) { 04141 04142 cc_get_token(TRUE); 04143 04144 OPND_LINE_NUM((*the_opnd)) = TOKEN_LINE(cc_token); 04145 OPND_COL_NUM((*the_opnd)) = TOKEN_COLUMN(cc_token); 04146 OPND_FLD((*the_opnd)) = CN_Tbl_Idx; 04147 04148 switch (TOKEN_VALUE(cc_token)) { 04149 04150 case Cc_Tok_Id : 04151 case Cc_Tok_Kwd_Define : 04152 case Cc_Tok_Kwd_Elif : 04153 case Cc_Tok_Kwd_Else : 04154 case Cc_Tok_Kwd_Endif : 04155 case Cc_Tok_Kwd_If : 04156 case Cc_Tok_Kwd_Ifdef : 04157 case Cc_Tok_Kwd_Ifndef : 04158 case Cc_Tok_Kwd_Include : 04159 case Cc_Tok_Kwd_Undef : 04160 04161 /* all of these are identifiers. They can't be defined or */ 04162 /* the scan would have replaced them already. Replace them */ 04163 /* with a 0. */ 04164 04165 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 04166 TOKEN_LEN(cc_token), 04167 &name_idx); 04168 04169 if (attr_idx != NULL_IDX && 04170 CC_AT_DEFINED(attr_idx)) { 04171 04172 PRINTMSG(TOKEN_LINE(cc_token), 626, Internal, 04173 TOKEN_COLUMN(cc_token), 04174 "defined macro to be replaced", "parse_cc_operand"); 04175 04176 } 04177 04178 OPND_IDX((*the_opnd)) = C_INT_TO_CN(CG_INTEGER_DEFAULT_TYPE, 0); 04179 break; 04180 04181 case Cc_Tok_Constant : 04182 04183 OPND_IDX((*the_opnd)) = TOKEN_CONST_TBL_IDX(cc_token); 04184 break; 04185 04186 case Cc_Tok_Kwd_Defined : 04187 04188 while (CC_LA_CH_VALUE == '(') { 04189 paren_cnt++; 04190 CC_NEXT_LA_CH; 04191 } 04192 04193 cc_get_token(FALSE); 04194 04195 if (TOKEN_VALUE(cc_token) != Tok_Id) { 04196 ntr_next_msg_queue(TOKEN_LINE(cc_token), 1165, Error, 04197 TOKEN_COLUMN(cc_token), 04198 "IDENTIFIER", 04199 0, 04200 STR_ARG); 04201 parsed_ok = FALSE; 04202 flush_cc_line(); 04203 } 04204 else { 04205 04206 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 04207 TOKEN_LEN(cc_token), 04208 &name_idx); 04209 04210 04211 if (attr_idx != NULL_IDX && 04212 CC_AT_DEFINED(attr_idx)) { 04213 04214 /* defined, replace with 1 */ 04215 OPND_IDX((*the_opnd)) = CN_INTEGER_ONE_IDX; 04216 } 04217 else { 04218 /* else, replace with 0 */ 04219 OPND_IDX((*the_opnd)) = CN_INTEGER_ZERO_IDX; 04220 } 04221 } 04222 04223 while (paren_cnt) { 04224 if (CC_LA_CH_VALUE != ')') { 04225 ntr_next_msg_queue(CC_LA_CH_LINE, 1165, Error, 04226 CC_LA_CH_COLUMN, 04227 ")", 04228 0, 04229 STR_ARG); 04230 parsed_ok = FALSE; 04231 flush_cc_line(); 04232 break; 04233 } 04234 else { 04235 CC_NEXT_LA_CH; 04236 paren_cnt--; 04237 } 04238 } 04239 04240 break; 04241 } 04242 } 04243 else { 04244 ntr_next_msg_queue(CC_LA_CH_LINE, 1165, Error, 04245 CC_LA_CH_COLUMN, 04246 "identifier or integer constant", 04247 0, 04248 STR_ARG); 04249 parsed_ok = FALSE; 04250 flush_cc_line(); 04251 } 04252 04253 EXIT: 04254 TRACE (Func_Exit, "parse_cc_operand", NULL); 04255 04256 return(parsed_ok); 04257 04258 } /* parse_cc_operand */ 04259 04260 /******************************************************************************\ 04261 |* *| 04262 |* Description: *| 04263 |* <description> *| 04264 |* *| 04265 |* Input parameters: *| 04266 |* NONE *| 04267 |* *| 04268 |* Output parameters: *| 04269 |* NONE *| 04270 |* *| 04271 |* Returns: *| 04272 |* NOTHING *| 04273 |* *| 04274 \******************************************************************************/ 04275 04276 static int srch_cc_sym_tbl (char *name_str, 04277 int name_len, 04278 int *name_idx) 04279 04280 { 04281 int idx; 04282 long tst_val; 04283 04284 04285 TRACE (Func_Entry, "srch_cc_sym_tbl", name_str); 04286 04287 tst_val = srch_name_tbl(name_str, 04288 name_len, 04289 &idx, 04290 cc_ln_tbl, 04291 str_pool, 04292 cc_ln_fw_idx, 04293 cc_ln_lw_idx); 04294 04295 *name_idx = idx; 04296 04297 if (tst_val != 0) { 04298 idx = NULL_IDX; 04299 TRACE (Func_Exit, "srch_cc_sym_tbl", NULL); 04300 } 04301 else { 04302 TRACE (Func_Exit, "srch_cc_sym_tbl", 04303 &str_pool[CC_LN_NAME_IDX(idx)].name_char); 04304 idx = CC_LN_ATTR_IDX(idx); 04305 } 04306 return (idx); 04307 04308 } /* srch_cc_sym_tbl */ 04309 04310 /******************************************************************************\ 04311 |* *| 04312 |* Description: *| 04313 |* ntr_cc_sym_tbl adds the token name to the the name pool, links it *| 04314 |* to an attribute table entry through the local name table, and *| 04315 |* reserves an attribute table entry for the identifier or label. *| 04316 |* The attribute table entry field name_idx is linked to the name in *| 04317 |* the name pool. *| 04318 |* *| 04319 |* Input parameters: *| 04320 |* token token containing identifier or label and *| 04321 |* length of name to be added to symbol table *| 04322 |* *| 04323 |* name_idx local name table index where entry is to *| 04324 |* be inserted *| 04325 |* *| 04326 |* Output parameters: *| 04327 |* NONE *| 04328 |* *| 04329 |* Returns: *| 04330 |* attribute table index of reserved entry *| 04331 |* *| 04332 \******************************************************************************/ 04333 04334 static int ntr_cc_sym_tbl(cc_token_type *token, 04335 int name_idx) 04336 04337 { 04338 register int attr_idx; 04339 register int i; 04340 register int np_idx; 04341 04342 # if defined(_HOST64) && !defined(_WHIRL_HOST64_TARGET64) 04343 register long *name_tbl_base; /* name table base address */ 04344 # endif 04345 04346 04347 TRACE (Func_Entry, "ntr_cc_sym_tbl", TOKEN_STR(*token)); 04348 04349 TBL_REALLOC_CK(cc_ln_tbl, 1); /* add local name table entry */ 04350 04351 NTR_CC_NAME_POOL((long *) TOKEN_STR(*token), TOKEN_LEN(*token), np_idx); 04352 04353 /* reserve attribute table entry and fill in common definition fields */ 04354 04355 NTR_CC_ATTR_TBL(attr_idx); 04356 CC_AT_NAME_LEN(attr_idx) = TOKEN_LEN(*token); 04357 CC_AT_NAME_IDX(attr_idx) = np_idx; 04358 04359 cc_ln_lw_idx = cc_ln_tbl_idx; 04360 04361 /* Enter name in correct position. Link name pool and attribute table */ 04362 04363 04364 # if defined(_HOST64) && !defined(_WHIRL_HOST64_TARGET64) 04365 04366 name_tbl_base = (long *) cc_ln_tbl; 04367 04368 for (i = cc_ln_tbl_idx; i >= name_idx; i--) { 04369 name_tbl_base [i] = name_tbl_base [i-1]; 04370 } 04371 # else 04372 04373 for (i = cc_ln_tbl_idx; i >= name_idx; i--) { 04374 cc_ln_tbl [i] = cc_ln_tbl [i-1]; 04375 } 04376 # endif 04377 04378 CLEAR_TBL_NTRY(cc_ln_tbl, name_idx); 04379 CC_LN_ATTR_IDX(name_idx) = attr_idx; 04380 CC_LN_NAME_IDX(name_idx) = np_idx; 04381 CC_LN_NAME_LEN(name_idx) = TOKEN_LEN(*token); 04382 04383 TRACE (Func_Exit, "ntr_cc_sym_tbl", TOKEN_STR(*token)); 04384 04385 return (attr_idx); 04386 04387 } /* ntr_cc_sym_tbl */ 04388 04389 /******************************************************************************\ 04390 |* *| 04391 |* Description: *| 04392 |* <description> *| 04393 |* *| 04394 |* Input parameters: *| 04395 |* NONE *| 04396 |* *| 04397 |* Output parameters: *| 04398 |* NONE *| 04399 |* *| 04400 |* Returns: *| 04401 |* NOTHING *| 04402 |* *| 04403 \******************************************************************************/ 04404 04405 static void flush_cc_line(void) 04406 04407 { 04408 int col; 04409 int line; 04410 04411 TRACE (Func_Entry, "flush_cc_line", NULL); 04412 04413 cc_stmt_buf_idx = cc_stmt_buf_len; 04414 04415 find_line_and_col(cc_stmt_buf_idx, &line, &col); 04416 CC_LA_CH_VALUE = eos; 04417 CC_LA_CH_LINE = line; 04418 CC_LA_CH_COLUMN = col; 04419 CC_LA_CH_CLASS = ch_class[CC_LA_CH_VALUE]; 04420 04421 cc_get_token(FALSE); 04422 04423 TRACE (Func_Exit, "flush_cc_line", NULL); 04424 04425 return; 04426 04427 } /* flush_cc_line */ 04428 04429 /******************************************************************************\ 04430 |* *| 04431 |* Description: *| 04432 |* Handle the command line -D option by putting the define in the table. *| 04433 |* *| 04434 |* Input parameters: *| 04435 |* NONE *| 04436 |* *| 04437 |* Output parameters: *| 04438 |* NONE *| 04439 |* *| 04440 |* Returns: *| 04441 |* NOTHING *| 04442 |* *| 04443 \******************************************************************************/ 04444 04445 boolean enter_cmd_line_cc_define(char *str, 04446 char *value, 04447 boolean is_define) 04448 04449 { 04450 int attr_idx; 04451 int idx; 04452 int name_idx; 04453 boolean ok = TRUE; 04454 int tidx; 04455 04456 TRACE (Func_Entry, "enter_cmd_line_cc_define", NULL); 04457 04458 idx = 0; 04459 while (str[idx] == ' ' || str[idx] == '\t') { 04460 idx++; 04461 } 04462 04463 tidx = 0; 04464 04465 if (ch_class[str[idx]] == Ch_Class_Letter || 04466 str[idx] == underscore) { 04467 04468 cc_token = cc_initial_token; 04469 04470 while (ch_class[str[idx]] == Ch_Class_Letter || 04471 ch_class[str[idx]] == Ch_Class_Digit || 04472 str[idx] == underscore || 04473 str[idx] == dollar || 04474 str[idx] == at_sign) { 04475 04476 (TOKEN_STR(cc_token))[tidx] = str[idx]; 04477 tidx++; 04478 idx++; 04479 } 04480 04481 TOKEN_LEN(cc_token) = tidx; 04482 04483 attr_idx = srch_cc_sym_tbl(TOKEN_STR(cc_token), 04484 TOKEN_LEN(cc_token), 04485 &name_idx); 04486 04487 if (attr_idx == NULL_IDX) { 04488 attr_idx = ntr_cc_sym_tbl(&cc_token, name_idx); 04489 } 04490 04491 if (is_define) { 04492 CC_AT_DEFINED(attr_idx) = TRUE; 04493 04494 if (value != NULL) { 04495 strcpy(temp_id_str.string, value); 04496 CC_AT_STR_LEN(attr_idx) = strlen(temp_id_str.string); 04497 NTR_CC_NAME_POOL(temp_id_str.words, CC_AT_STR_LEN(attr_idx), 04498 CC_AT_STR_IDX(attr_idx)); 04499 } 04500 else { 04501 PUT_VALUE_IN_AT_STR(attr_idx, 1); 04502 } 04503 } 04504 else { 04505 CC_AT_DEFINED(attr_idx) = FALSE; 04506 } 04507 } 04508 else { 04509 ok = FALSE; 04510 } 04511 04512 04513 TRACE (Func_Exit, "enter_cmd_line_cc_define", NULL); 04514 04515 return(ok); 04516 04517 } /* enter_cmd_line_cc_define */ 04518 04519 /******************************************************************************\ 04520 |* *| 04521 |* Description: *| 04522 |* <description> *| 04523 |* *| 04524 |* Input parameters: *| 04525 |* NONE *| 04526 |* *| 04527 |* Output parameters: *| 04528 |* NONE *| 04529 |* *| 04530 |* Returns: *| 04531 |* NOTHING *| 04532 |* *| 04533 \******************************************************************************/ 04534 04535 static int fold_cc_expr(opnd_type *opnd) 04536 04537 { 04538 int l_value; 04539 int ir_idx; 04540 opnd_type loc_opnd; 04541 int r_value; 04542 long result; 04543 04544 TRACE (Func_Entry, "fold_cc_expr", NULL); 04545 04546 switch (OPND_FLD((*opnd))) { 04547 case CN_Tbl_Idx : 04548 result = (long) CN_INT_TO_C(OPND_IDX((*opnd))); 04549 break; 04550 04551 case IR_Tbl_Idx : 04552 ir_idx = OPND_IDX((*opnd)); 04553 04554 COPY_OPND(loc_opnd, IR_OPND_L(ir_idx)); 04555 04556 l_value = fold_cc_expr(&loc_opnd); 04557 04558 if (IR_FLD_R(ir_idx) != NO_Tbl_Idx) { 04559 COPY_OPND(loc_opnd, IR_OPND_R(ir_idx)); 04560 04561 r_value = fold_cc_expr(&loc_opnd); 04562 } 04563 04564 switch (IR_OPR(ir_idx)) { 04565 case Uplus_Opr : 04566 result = l_value; 04567 break; 04568 04569 case Uminus_Opr : 04570 result = -l_value; 04571 break; 04572 04573 case Plus_Opr : 04574 result = l_value + r_value; 04575 break; 04576 04577 case Minus_Opr : 04578 result = l_value - r_value; 04579 break; 04580 04581 case Div_Opr : 04582 result = l_value / r_value; 04583 break; 04584 04585 case Mod_Opr : 04586 result = l_value % r_value; 04587 break; 04588 04589 case Mult_Opr : 04590 result = l_value * r_value; 04591 break; 04592 04593 case Not_Opr : 04594 result = (l_value != 0 ? 0 : 1); 04595 break; 04596 04597 case Bnot_Opr : 04598 result = ~l_value; 04599 break; 04600 04601 case Ne_Opr : 04602 result = (l_value != r_value ? 1 : 0); 04603 break; 04604 04605 case Eq_Opr : 04606 result = (l_value == r_value ? 1 : 0); 04607 break; 04608 04609 case Lt_Opr : 04610 result = (l_value < r_value ? 1 : 0); 04611 break; 04612 04613 case Le_Opr : 04614 result = (l_value <= r_value ? 1 : 0); 04615 break; 04616 04617 case Gt_Opr : 04618 result = (l_value > r_value ? 1 : 0); 04619 break; 04620 04621 case Ge_Opr : 04622 result = (l_value >= r_value ? 1 : 0); 04623 break; 04624 04625 case Neqv_Opr : 04626 result = l_value ^ r_value; 04627 break; 04628 04629 case And_Opr : 04630 result = (l_value && r_value ? 1 : 0); 04631 break; 04632 04633 case Band_Opr : 04634 result = l_value & r_value; 04635 break; 04636 04637 case Or_Opr : 04638 result = (l_value || r_value ? 1 : 0); 04639 break; 04640 04641 case Bor_Opr : 04642 result = l_value | r_value; 04643 break; 04644 04645 case Shiftl_Opr : 04646 result = l_value << r_value; 04647 break; 04648 04649 case Shiftr_Opr : 04650 result = l_value >> r_value; 04651 break; 04652 04653 case Paren_Opr : 04654 result = l_value; 04655 break; 04656 04657 default: 04658 PRINTMSG(IR_LINE_NUM(ir_idx), 1164, Internal, 04659 IR_COL_NUM(ir_idx), "parse_cc_line"); 04660 break; 04661 } 04662 break; 04663 04664 default: 04665 PRINTMSG(OPND_LINE_NUM((*opnd)), 1164, Internal, 04666 OPND_COL_NUM((*opnd)), "parse_cc_line"); 04667 break; 04668 } 04669 04670 TRACE (Func_Exit, "fold_cc_expr", NULL); 04671 04672 return(result); 04673 04674 } /* fold_cc_expr */ 04675 04676 /******************************************************************************\ 04677 |* *| 04678 |* Description: *| 04679 |* <description> *| 04680 |* *| 04681 |* Input parameters: *| 04682 |* NONE *| 04683 |* *| 04684 |* Output parameters: *| 04685 |* NONE *| 04686 |* *| 04687 |* Returns: *| 04688 |* NOTHING *| 04689 |* *| 04690 \******************************************************************************/ 04691 04692 static void find_line_and_col(int idx, 04693 int *line, 04694 int *col) 04695 04696 { 04697 int i = 1; 04698 04699 TRACE (Func_Entry,"find_line_and_col" , NULL); 04700 04701 if (cc_stmt_buf_num_lines == 1) { 04702 *line = cc_stmt_buf_line[1].line; 04703 *col = idx; 04704 } 04705 else { 04706 for (i = 2; i <= cc_stmt_buf_num_lines+1; i++) { 04707 if (cc_stmt_buf_line[i].start_idx >= idx) { 04708 *line = cc_stmt_buf_line[i-1].line; 04709 *col = idx - cc_stmt_buf_line[i-1].start_idx; 04710 break; 04711 } 04712 } 04713 # ifdef _DEBUG 04714 if (i > cc_stmt_buf_num_lines + 1) { 04715 PRINTMSG(PP_LINE_NUM, 626, Internal, 1, 04716 "valid line num", "find_line_and_col"); 04717 } 04718 # endif 04719 } 04720 04721 04722 TRACE (Func_Exit, "find_line_and_col", NULL); 04723 04724 return; 04725 04726 } /* find_line_and_col */ 04727 04728 /******************************************************************************\ 04729 |* *| 04730 |* Description: *| 04731 |* <description> *| 04732 |* *| 04733 |* Input parameters: *| 04734 |* NONE *| 04735 |* *| 04736 |* Output parameters: *| 04737 |* NONE *| 04738 |* *| 04739 |* Returns: *| 04740 |* NOTHING *| 04741 |* *| 04742 \******************************************************************************/ 04743 04744 static void shift_cc_stmt_buf(int start_idx, 04745 int shift) 04746 04747 { 04748 int i; 04749 04750 TRACE (Func_Entry, "shift_cc_stmt_buf", NULL); 04751 04752 if (shift > 0) { 04753 for (i = cc_stmt_buf_len+1; i >= start_idx; i--) { 04754 cc_stmt_buf[i+shift] = cc_stmt_buf[i]; 04755 } 04756 } 04757 else if (shift < 0) { 04758 for (i = start_idx; i <= cc_stmt_buf_len+1; i++) { 04759 cc_stmt_buf[i+shift] = cc_stmt_buf[i]; 04760 } 04761 } 04762 04763 for (i = 1; i <= cc_stmt_buf_num_lines + 1; i++) { 04764 if (cc_stmt_buf_line[i].start_idx >= start_idx) { 04765 cc_stmt_buf_line[i].start_idx += shift; 04766 } 04767 } 04768 04769 cc_stmt_buf_len += shift; 04770 04771 TRACE (Func_Exit, "shift_cc_stmt_buf", NULL); 04772 04773 return; 04774 04775 } /* shift_cc_stmt_buf */ 04776 04777 /******************************************************************************\ 04778 |* *| 04779 |* Description: *| 04780 |* <description> *| 04781 |* *| 04782 |* Input parameters: *| 04783 |* NONE *| 04784 |* *| 04785 |* Output parameters: *| 04786 |* NONE *| 04787 |* *| 04788 |* Returns: *| 04789 |* NOTHING *| 04790 |* *| 04791 \******************************************************************************/ 04792 04793 static void shift_nxt_line(int start_idx, 04794 int shift) 04795 04796 { 04797 int end_line; 04798 int i; 04799 int curr_line = NULL_IDX; 04800 04801 TRACE (Func_Entry, "shift_nxt_line", NULL); 04802 04803 for (i = 1; i <= nxt_line_num_lines; i++) { 04804 if (start_idx >= nxt_line_start_idx[i] && 04805 start_idx <= nxt_line_end_idx[i]) { 04806 curr_line = i; 04807 break; 04808 } 04809 } 04810 04811 # ifdef _DEBUG 04812 if (start_idx == NULL_IDX) { 04813 PRINTMSG(pp_nxt_line_num[1], 626, Internal, 1, 04814 "valid start_idx", "shift_nxt_line"); 04815 } 04816 # endif 04817 04818 if (extra_nxt_line) { 04819 end_line = extra_nxt_line; 04820 } 04821 else { 04822 end_line = nxt_line_num_lines; 04823 } 04824 04825 if (nxt_line_end_idx[end_line]+shift >= MAX_STMT_CHAR_SIZE) { 04826 PRINTMSG(pp_nxt_line_num[end_line], 1593, Limit, 0); 04827 } 04828 04829 if (shift > 0) { 04830 for (i = nxt_line_end_idx[end_line]; i >= start_idx; i--) { 04831 nxt_line[i+shift] = nxt_line[i]; 04832 nxt_line_col[i+shift] = nxt_line_col[i]; 04833 } 04834 } 04835 else if (shift < 0) { 04836 for (i = start_idx; i <= nxt_line_end_idx[end_line]; i++) { 04837 nxt_line[i+shift] = nxt_line[i]; 04838 nxt_line_col[i+shift] = nxt_line_col[i]; 04839 } 04840 } 04841 04842 nxt_line_end_idx[curr_line] += shift; 04843 pp_nxt_line_length[curr_line] += shift; 04844 pp_nxt_line_EOL[curr_line] += shift; 04845 pp_orig_line_size[curr_line] += shift; 04846 04847 for (i = curr_line + 1; i <= end_line; i++) { 04848 nxt_line_start_idx[i] += shift; 04849 nxt_line_end_idx[i] += shift; 04850 pp_nxt_line_EOL[i] += shift; 04851 } 04852 04853 TRACE (Func_Exit, "shift_nxt_line", NULL); 04854 04855 return; 04856 04857 } /* shift_nxt_line */ 04858 04859 /******************************************************************************\ 04860 |* *| 04861 |* Description: *| 04862 |* <description> *| 04863 |* *| 04864 |* Input parameters: *| 04865 |* NONE *| 04866 |* *| 04867 |* Output parameters: *| 04868 |* NONE *| 04869 |* *| 04870 |* Returns: *| 04871 |* NOTHING *| 04872 |* *| 04873 \******************************************************************************/ 04874 04875 static int expanded_macro_len(int attr_idx, 04876 cc_arg_type *arg_head) 04877 04878 { 04879 int arg_num; 04880 cc_arg_type *arg_tail; 04881 int i; 04882 int len; 04883 04884 TRACE (Func_Entry, "expanded_macro_len", NULL); 04885 04886 len = CC_AT_STR_LEN(attr_idx); 04887 04888 for (i = 0; i < CC_AT_STR_LEN(attr_idx); i++) { 04889 if ((CC_AT_STR_PTR(attr_idx))[i] == '\001') { 04890 i += 2; 04891 arg_num = 1; 04892 arg_tail = arg_head; 04893 while (arg_num != (CC_AT_STR_PTR(attr_idx))[i]) { 04894 arg_tail = arg_tail->next; 04895 arg_num++; 04896 } 04897 04898 len += (arg_tail->name_len - 3); 04899 } 04900 } 04901 04902 TRACE (Func_Exit, "expanded_macro_len", NULL); 04903 04904 return(len); 04905 04906 } /* expanded_macro_len */ 04907 04908 /******************************************************************************\ 04909 |* *| 04910 |* Description: *| 04911 |* <description> *| 04912 |* *| 04913 |* Input parameters: *| 04914 |* NONE *| 04915 |* *| 04916 |* Output parameters: *| 04917 |* NONE *| 04918 |* *| 04919 |* Returns: *| 04920 |* NOTHING *| 04921 |* *| 04922 \******************************************************************************/ 04923 04924 static void insert_macro(int attr_idx, 04925 cc_arg_type *arg_head, 04926 int id_start_idx, 04927 int col, 04928 int save_pp_line_idx) 04929 04930 { 04931 int arg_num; 04932 cc_arg_type *arg_tail; 04933 char *char_ptr; 04934 int i; 04935 int j; 04936 int k; 04937 int len; 04938 int end_idx; 04939 04940 TRACE (Func_Entry, "insert_macro", NULL); 04941 04942 /* cc_stmt_buf_idx is the end of replacement ')' */ 04943 /* id_start_idx is the start of replacement */ 04944 04945 end_idx = cc_stmt_buf_idx + 1; 04946 04947 adjust_continued_macro(id_start_idx, &end_idx); 04948 04949 len = expanded_macro_len(attr_idx, arg_head); 04950 04951 shift_nxt_line(end_idx, 04952 len-(end_idx - id_start_idx)); 04953 04954 char_ptr = CC_AT_STR_PTR(attr_idx); 04955 04956 j = 0; 04957 i = 0; 04958 while (i < len) { 04959 if (char_ptr[j] == '\001') { 04960 j += 2; 04961 arg_num = 1; 04962 arg_tail = arg_head; 04963 while (arg_num != char_ptr[j]) { 04964 arg_tail = arg_tail->next; 04965 arg_num++; 04966 } 04967 04968 for (k = 0; k < arg_tail->name_len; k++) { 04969 nxt_line[i+id_start_idx] = arg_tail->name[k]; 04970 nxt_line_col[i+id_start_idx] = col; 04971 i++; 04972 } 04973 } 04974 else { 04975 nxt_line[i+id_start_idx] = char_ptr[j]; 04976 nxt_line_col[i+id_start_idx] = col; 04977 i++; 04978 } 04979 04980 j++; 04981 } 04982 04983 cc_stmt_buf_idx = id_start_idx + len - 1; 04984 pp_line_idx = save_pp_line_idx; 04985 cc_advance_idx(); 04986 04987 04988 TRACE (Func_Exit, "insert_macro", NULL); 04989 04990 return; 04991 04992 } /* insert_macro */ 04993 04994 /******************************************************************************\ 04995 |* *| 04996 |* Description: *| 04997 |* <description> *| 04998 |* *| 04999 |* Input parameters: *| 05000 |* NONE *| 05001 |* *| 05002 |* Output parameters: *| 05003 |* NONE *| 05004 |* *| 05005 |* Returns: *| 05006 |* NOTHING *| 05007 |* *| 05008 \******************************************************************************/ 05009 05010 static void adjust_continued_macro(int start_idx, 05011 int *end_idx) 05012 05013 { 05014 int start_line = NULL_IDX; 05015 int end_line = NULL_IDX; 05016 int i; 05017 boolean keep_end_line = FALSE; 05018 05019 TRACE (Func_Entry, "adjust_continued_macro", NULL); 05020 05021 for (i = 1; i <= nxt_line_num_lines; i++) { 05022 if (start_idx >= nxt_line_start_idx[i] && 05023 start_idx <= nxt_line_end_idx[i]) { 05024 05025 start_line = i; 05026 } 05027 05028 if (*end_idx >= nxt_line_start_idx[i] && 05029 *end_idx <= nxt_line_end_idx[i]) { 05030 05031 end_line = i; 05032 } 05033 05034 if (start_line != NULL_IDX && end_line != NULL_IDX) { 05035 break; 05036 } 05037 } 05038 05039 if (end_line > start_line) { 05040 /* have continuation */ 05041 05042 for (i = *end_idx; i < pp_nxt_line_EOL[end_line]; i++) { 05043 if (nxt_line[i] != blank && 05044 nxt_line[i] != tab) { 05045 keep_end_line = TRUE; 05046 break; 05047 } 05048 } 05049 05050 if (keep_end_line) { 05051 /* blank out the end_line from nxt_line_idx to end_idx - 1 */ 05052 05053 for (i = pp_nxt_line_idx[end_line]+1; i < *end_idx; i++) { 05054 nxt_line[i] = blank; 05055 } 05056 05057 /* change end_line to the previous line */ 05058 05059 end_line--; 05060 } 05061 05062 *end_idx = pp_nxt_line_EOL[end_line]; 05063 05064 /* see if new end_line is still greater than start_line */ 05065 05066 if (end_line > start_line) { 05067 pp_orig_line_size[start_line] += nxt_line_end_idx[end_line] - 05068 nxt_line_end_idx[start_line]; 05069 nxt_line_end_idx[start_line] = nxt_line_end_idx[end_line]; 05070 pp_nxt_line_EOL[start_line] = pp_nxt_line_EOL[end_line]; 05071 pp_nxt_line_length[start_line] = nxt_line_end_idx[start_line] - 05072 nxt_line_start_idx[start_line]; 05073 05074 for (i = end_line + 1; 05075 i <= (extra_nxt_line ? extra_nxt_line : end_stmt_line_idx); 05076 i++) { 05077 nxt_line_start_idx[i-(end_line-start_line)] = nxt_line_start_idx[i]; 05078 nxt_line_end_idx[i-(end_line-start_line)] = nxt_line_end_idx[i]; 05079 pp_orig_line_size[i-(end_line-start_line)] = pp_orig_line_size[i]; 05080 pp_nxt_line_EOL[i-(end_line-start_line)] = pp_nxt_line_EOL[i]; 05081 pp_nxt_line_length[i-(end_line-start_line)] = pp_nxt_line_length[i]; 05082 pp_nxt_line_idx[i-(end_line-start_line)] = pp_nxt_line_idx[i]; 05083 pp_nxt_line_type[i-(end_line-start_line)] = pp_nxt_line_type[i]; 05084 pp_nxt_line_num[i-(end_line-start_line)] = pp_nxt_line_num[i]; 05085 pp_change_source_form[i-(end_line-start_line)] = 05086 pp_change_source_form[i]; 05087 pp_expected_line[i-(end_line-start_line)] = 05088 pp_expected_line[i]; 05089 } 05090 05091 nxt_line_num_lines -= (end_line - start_line); 05092 end_stmt_line_idx -= (end_line - start_line); 05093 05094 if (extra_nxt_line != NULL_IDX) { 05095 extra_nxt_line -= (end_line - start_line); 05096 } 05097 } 05098 } 05099 05100 TRACE (Func_Exit, "adjust_continued_macro", NULL); 05101 05102 return; 05103 05104 } /* adjust_continued_macro */ 05105 05106 /******************************************************************************\ 05107 |* *| 05108 |* Description: *| 05109 |* <description> *| 05110 |* *| 05111 |* Input parameters: *| 05112 |* NONE *| 05113 |* *| 05114 |* Output parameters: *| 05115 |* NONE *| 05116 |* *| 05117 |* Returns: *| 05118 |* NOTHING *| 05119 |* *| 05120 \******************************************************************************/ 05121 05122 static char *get_dynamic_predef_str(int attr_idx, 05123 int line) 05124 05125 { 05126 time_t clock; 05127 int file_line; 05128 int g_idx; 05129 struct tm *tmptr; 05130 05131 static char str[MAX_PATH_NAME_SIZE + 1]; 05132 05133 TRACE (Func_Entry, "get_dynamic_predef_str", NULL); 05134 05135 str[0] = '\0'; 05136 05137 if (attr_idx == line_macro_idx || attr_idx == LINE_macro_idx) { 05138 GLOBAL_LINE_TO_FILE_LINE(line, g_idx, file_line); 05139 sprintf(str, "%d", file_line); 05140 } 05141 else if (attr_idx == file_macro_idx || attr_idx == FILE_macro_idx) { 05142 get_curr_file_name(str); 05143 } 05144 else if (attr_idx == date_macro_idx || attr_idx == DATE_macro_idx) { 05145 clock = time(NULL); 05146 tmptr = localtime(&clock); 05147 sprintf(str, "\"%02d/%02d/%02d\"", 05148 tmptr->tm_mon+1, tmptr->tm_mday, 05149 (tmptr->tm_year % 100)); 05150 05151 } 05152 else if (attr_idx == time_macro_idx || attr_idx == TIME_macro_idx) { 05153 clock = time(NULL); 05154 tmptr = localtime(&clock); 05155 sprintf(str, "\"%02d:%02d:%02d\"", 05156 tmptr->tm_hour, tmptr->tm_min, tmptr->tm_sec); 05157 } 05158 05159 TRACE (Func_Exit, "get_dynamic_predef_str", NULL); 05160 05161 return(str); 05162 05163 } /* get_dynamic_predef_str */