home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3182 < prev    next >
Encoding:
Internet Message Format  |  1991-04-11  |  43.5 KB

  1. From: bob@reed.UUCP (Bob Ankeney)
  2. Newsgroups: alt.sources
  3. Subject: PL/M to C converter Part 02/03
  4. Message-ID: <16304@reed.UUCP>
  5. Date: 9 Apr 91 17:01:59 GMT
  6.  
  7.  
  8. #!/bin/sh
  9. # this is part 2 of a multipart archive
  10. # do not concatenate these parts, unpack them in order with /bin/sh
  11. # file io.c continued
  12. #
  13. CurArch=2
  14. if test ! -r s2_seq_.tmp
  15. then echo "Please unpack part 1 first!"
  16.      exit 1; fi
  17. ( read Scheck
  18.   if test "$Scheck" != $CurArch
  19.   then echo "Please unpack part $Scheck next!"
  20.        exit 1;
  21.   else exit 0; fi
  22. ) < s2_seq_.tmp || exit 1
  23. sed 's/^X//' << 'SHAR_EOF' >> io.c
  24. X}
  25. X
  26. X/*
  27. X *    Print all white space up first new-line (if any).
  28. X *    Move white_space_start to point past first new-line.
  29. X */
  30. Xout_pre_line(token)
  31. XTOKEN    *token;
  32. X{
  33. X    while ((token->white_space_start < token->white_space_end) &&
  34. X        (*token->white_space_start != '\n')) {
  35. X        out_char(*token->white_space_start);
  36. X        token->white_space_start++;
  37. X    }
  38. X}
  39. X
  40. X/*
  41. X *    Print all white space up to but not including last new-line.
  42. X *    Move white_space_start to point to last new-line.
  43. X */
  44. Xout_pre_white(token)
  45. XTOKEN    *token;
  46. X{
  47. X    char    *ptr;
  48. X    int    length;
  49. X
  50. X    for (ptr = token->white_space_end;
  51. X        (ptr > token->white_space_start) && (*(ptr - 1) != '\n') ; )
  52. X            ptr--;
  53. X
  54. X    if (ptr == token->white_space_start)
  55. X        return;
  56. X
  57. X        /* Compute length of white space */
  58. X    length = ptr - token->white_space_start - 1;
  59. X
  60. X    if (length)
  61. X        out_data(token->white_space_start, length);
  62. X
  63. X    token->white_space_start = ptr - 1;
  64. X}
  65. X
  66. X/*
  67. X *    Output token name
  68. X */
  69. Xout_token_name(token)
  70. XTOKEN    *token;
  71. X{
  72. X    if (is_a_type(token))
  73. X        out_type(token->token_type);
  74. X    else
  75. X        out_data(token->token_name, strlen(token->token_name));
  76. X}
  77. X
  78. X/*
  79. X *    Output white space and token name
  80. X */
  81. Xout_token(token)
  82. XTOKEN    *token;
  83. X{
  84. X    out_white_space(token);
  85. X    out_token_name(token);
  86. X}
  87. X
  88. X/*
  89. X *    Output guaranteed white space and token name
  90. X */
  91. Xout_must_token(token)
  92. XTOKEN    *token;
  93. X{
  94. X    out_must_white(token);
  95. X    out_token_name(token);
  96. X}
  97. X
  98. X/*
  99. X *    Output case converted token name
  100. X */
  101. Xout_cvt_name(token)
  102. XTOKEN    *token;
  103. X{
  104. X    char    *ptr;
  105. X
  106. X    for (ptr = token->token_name; *ptr; ptr++) {
  107. X        if (is_a_lc_char(*ptr))
  108. X            out_char(*ptr - 32);
  109. X        else
  110. X        if (is_a_uc_char(*ptr))
  111. X            out_char(*ptr + 32);
  112. X        else
  113. X            out_char(*ptr);
  114. X    }
  115. X}
  116. X
  117. X/*
  118. X *    Output string
  119. X */
  120. Xout_str(string)
  121. Xchar    *string;
  122. X{
  123. X    out_data(string, strlen(string));
  124. X}
  125. X
  126. X/*
  127. X *    Output character
  128. X */
  129. Xout_char(ch)
  130. Xchar    ch;
  131. X{
  132. X    out_data(&ch, 1);
  133. X}
  134. X
  135. X/*
  136. X *    Output new-line if not at start of line
  137. X */
  138. Xout_to_start()
  139. X{
  140. X    if (last_out_ch != LF)
  141. X        out_char(LF);
  142. X}
  143. X
  144. X/*
  145. X *    Output type
  146. X */
  147. Xout_type(type)
  148. Xint    type;
  149. X{
  150. X    switch (type) {
  151. X
  152. X    case BYTE :
  153. X#ifdef CONVERT_TYPES
  154. X        out_str(TYPE_BYTE);
  155. X#else
  156. X        out_str("BYTE");
  157. X#endif
  158. X        break;
  159. X
  160. X    case WORD :
  161. X#ifdef CONVERT_TYPES
  162. X        out_str(TYPE_WORD);
  163. X#else
  164. X        out_str("WORD");
  165. X#endif
  166. X        break;
  167. X
  168. X    case DWORD :
  169. X#ifdef CONVERT_TYPES
  170. X        out_str(TYPE_DWORD);
  171. X#else
  172. X        out_str("DWORD");
  173. X#endif
  174. X        break;
  175. X
  176. X    case INTEGER :
  177. X#ifdef CONVERT_TYPES
  178. X        out_str(TYPE_INTEGER);
  179. X#else
  180. X        out_str("INTEGER");
  181. X#endif
  182. X        break;
  183. X
  184. X    case REAL :
  185. X#ifdef CONVERT_TYPES
  186. X        out_str(TYPE_REAL);
  187. X#else
  188. X        out_str("REAL");
  189. X#endif
  190. X        break;
  191. X
  192. X    case POINTER :
  193. X        out_str(TYPE_POINTER);
  194. X        break;
  195. X
  196. X    default :
  197. X        parse_error("Unknown type");
  198. X    }
  199. X}
  200. X
  201. X/*
  202. X *    Initialize variables for I/O.
  203. X */
  204. Xout_init()
  205. X{
  206. X    out_string = NULL;
  207. X    last_out_ch = '\0';
  208. X    parsing_literal = FALSE;
  209. X}
  210. X
  211. X/*
  212. X *    Output string constant of form 'WXYZ' in form:
  213. X *        'W' << 24 | 'X' << 16 | 'Y' << 8 | Z
  214. X *    where len specifies the number of bytes in the string to output.
  215. X */
  216. Xout_str_const(str_ptr, len)
  217. Xchar    *str_ptr;
  218. Xint    len;
  219. X{
  220. X    while (len-- && *str_ptr) {
  221. X        out_char('\'');
  222. X        if (*str_ptr == '\'')
  223. X            out_char('\\');
  224. X        out_char(*str_ptr++);
  225. X        out_char('\'');
  226. X
  227. X        if (len) {
  228. X            out_str(" << ");
  229. X            out_str(str_shifts[len]);
  230. X            if (*str_ptr)
  231. X                out_str(" | ");
  232. X        }
  233. X    }
  234. X}
  235. X
  236. X/*
  237. X *    Convert NUMERIC constant to octal constant
  238. X */
  239. Xcvt_octal(token, octal_string)
  240. XTOKEN    *token;
  241. Xchar    octal_string[];
  242. X{
  243. X    int    octal;
  244. X    char    ch, *ptr;
  245. X
  246. X    octal = 0;
  247. X    octal_string[0] = '\\';
  248. X    octal_string[4] = '\0';
  249. X
  250. X    ch = *(token->token_start + token->token_length - 1);
  251. X
  252. X        /* Determine base of numeric */
  253. X    if (ch == 'H') {
  254. X            /* Hex */
  255. X        for (ptr = token->token_name + 2; *ptr; ptr++) {
  256. X            octal *= 16;
  257. X            if ((*ptr >= '0') && (*ptr <= '9'))
  258. X                octal += *ptr - '0';
  259. X            else
  260. X            if ((*ptr >= 'A') && (*ptr <= 'Z'))
  261. X                octal += *ptr - 'A' + 10;
  262. X            else
  263. X            if ((*ptr >= 'a') && (*ptr <= 'z'))
  264. X                octal += *ptr - 'a' + 10;
  265. X            else {
  266. X                parse_error("Illegal hex character");
  267. X                return;
  268. X            }
  269. X        }
  270. X    } else
  271. X
  272. X    if ((ch == 'O') || (ch == 'Q')) {
  273. X            /* Octal constant */
  274. X        for (ptr = token->token_name + 1; *ptr; ptr++) {
  275. X            octal *= 8;
  276. X            if ((*ptr >= '0') && (*ptr <= '7'))
  277. X                octal += *ptr - '0';
  278. X            else {
  279. X                parse_error("Illegal decimal character");
  280. X                return;
  281. X            }
  282. X        }
  283. X    } else {
  284. X
  285. X            /* Decimal constant */
  286. X        for (ptr = token->token_name + 1; *ptr; ptr++) {
  287. X            octal *= 10;
  288. X            if ((*ptr >= '0') && (*ptr <= '9'))
  289. X                octal += *ptr - '0';
  290. X            else {
  291. X                parse_error("Illegal decimal character");
  292. X                return;
  293. X            }
  294. X        }
  295. X    }
  296. X
  297. X
  298. X        /* Generate octal constant */
  299. X    octal_string[1] = ((octal >> 6) & 3) + '0';
  300. X    octal_string[2] = ((octal >> 3) & 7) + '0';
  301. X    octal_string[3] = (octal & 7) + '0';
  302. X}
  303. SHAR_EOF
  304. chmod 0660 io.c || echo "restore of io.c fails"
  305. sed 's/^X//' << 'SHAR_EOF' > lit.c &&
  306. X       /*********************************************************************
  307. X        *********************************************************************
  308. X        **                                                                 **
  309. X        **                                                                 **
  310. X        **                            LITERALS                             **
  311. X        **                                                                 **
  312. X        **                                                                 **
  313. X        **  Revision History:  SCO #23  (12/11/84)                         **
  314. X        **                     SCO #31  (02/12/86)       {SCO31.DOC}       **
  315. X        **                     SCO #33  (06/03/86)       {SCO33.DOC}       **
  316. X        **                     SCO #34  (10/28/86)       {SCO34.DOC}       **
  317. X        **                     SCO #36  (07/16/86)       {SCO36.DOC}       **
  318. X        **                     SCO #48  (03/21/87)       {SCO48.DOC}       **
  319. X        **                                                                 **
  320. X        *********************************************************************
  321. X        *********************************************************************/
  322. X
  323. X
  324. X
  325. X
  326. X
  327. X#define POWER_FAIL_SENSE_LATCH 0x0080
  328. X#define INTERRUPT_CONTROLLER_PORT_1 0x00C0
  329. X#define INTERRUPT_CONTROLLER_PORT_2 0x00C2
  330. X#define INSTRUCTION_WORD_1 0x13
  331. X#define INSTRUCTION_WORD_2 0x20
  332. X#define INSTRUCTION_WORD_3 0x01
  333. X#define END_OF_PARITY_INTERRUPT 0x60
  334. X#define END_OF_EXCEPTION_INTERRUPT 0x61
  335. X#define END_OF_REFRESH_INTERRUPT 0x62
  336. X#define END_OF_CYCLE_INTERRUPT 0x63
  337. X#define END_OF_SHORT_INTERRUPT 0x67
  338. X#define INTERRUPT_CONTROLLER_MASK_0 0x0F0
  339. X#define INTERRUPT_CONTROLLER_MASK_1 0x0FC
  340. X#define INTERRUPT_CONTROLLER_MASK_2 0x0F8
  341. X#define INTERRUPT_CONTROLLER_MASK_3 0x0F4
  342. X#define INTERVAL_TIMER_PORT_1 0x0D2
  343. X#define INTERVAL_TIMER_PORT_2 0x0D6
  344. X#define CONTROL_WORD 0x74
  345. X#define DATA_WORD_1 0x12
  346. X#define DATA_WORD_2 0x7A
  347. X#define CONTROL_WORD_87 0x033C
  348. X#define DPM_CONTROL_WORD_87 0x0F3C
  349. X#define BIT_CONTROL_WORD_87 0x0F3C
  350. X#define INTERFACE_1_START_CODE 0x01
  351. X#define INTERFACE_2_START_CODE 0x01
  352. X#define HCP_NORMAL 0x00
  353. X#define HCP_TEST_MODE 0x01
  354. X#define HCP_ADVANCE 0x02
  355. X#define HCP_RESET 0x03
  356. X#define HCP_ALTITUDE_HOLD_RESET 0x04
  357. X#define HCP_FAIL 0x07
  358. X      
  359. X#define IS =
  360. X#define VALID 0x55
  361. X#define NO_COMPUTED_DATA 0x66
  362. X#define FUNCTIONAL_TEST 0x99
  363. X#define TEST_MODE 0x0AA     /*{SCO36.DOC}*/
  364. X#define FLIGHT_MODE 0x55      /*{SCO36.DOC}*/
  365. X#define POSITIVE_BIAS 0        /*{SCO31.DOC}*/
  366. X#define NEGATIVE_BIAS 1        /*{SCO31.DOC}*/
  367. X#define RESET 0x0AA
  368. X#define PASS 0x55
  369. X#define ON 0x55
  370. X#define TO_VOR 0x55
  371. X#define FROM_VOR 0x99
  372. X#define ILS 0x55   /*{SCO48.DOC}*/
  373. X#define VOR 0x0AA   /*{SCO48.DOC}*/
  374. X#define INVALID 0x0AA
  375. X#define OFF 0x0AA
  376. X#define PUSHED 0x55
  377. X#define SET 0x55
  378. X#define FAIL 0x0AA
  379. X#define FAILED 0x0FF
  380. X#define VMC 4
  381. X#define IMC 5
  382. X#define CRZ 6
  383. X#define TOGA 7
  384. X#define BLANK 10
  385. X#define NEGATIVE_SIGN 11
  386. X            
  387. X#define ERROR_DISPLAY 0x5554
  388. X#define PFM_KEY_COUNTER 0x5555
  389. X#define PFM_TIMER 0x5556
  390. X#define COMPUTER_FAULT 0x5557
  391. X#define KEY1 5
  392. X#define KEY2 4
  393. X#define KEY3 3
  394. X#define KEY4 2
  395. X#define KEY5 1
  396. X#define KEY6 0
  397. X#define DISPLAY_GENERATOR_PORT 0x0C000
  398. X#define DISPLAY_GENERATOR_HALT_CODE 3
  399. X#define DISPLAY_GENERATOR_START_CODE 4
  400. X#define DISPLAY_HALT_ENABLE_CODE 0
  401. X#define DG_HALT 0x0005
  402. X#define LOAD_ROTATION_ANGLE 0x0007
  403. X#define LOAD_PRESENT_POSITION 0x0008
  404. X#define DRAW_VECTOR 0x0009
  405. X#define LOAD_BORDERS 0x000D
  406. X#define ZERO_DEGREE_ANGLE 0
  407. X#define NINETY_DEGREE_ANGLE 0x4000
  408. X#define NEG_NINETY_DEGREE_ANGLE 0x0C000
  409. X#define ONE_EIGHTY_DEGREE_ANGLE 0x8000
  410. X#define FIRST_HALF_OF_BUFFER 0
  411. X#define SECOND_HALF_OF_BUFFER 750
  412. X#define WINDOW_COMPARATOR_FAIL 0
  413. X#define WINDOW_COMPARATOR_PASS 7
  414. X#define TWENTY_CYCLES 20
  415. X#define FORTY_CYCLES 40
  416. X      
  417. X#define IOS1_CODE_CHECKSUM_ERROR 0x11     /*{SCO31.DOC}*/
  418. X#define IOS1_RAM_ERROR 0x12     /*{SCO31.DOC}*/
  419. X#define IOS1_80186_ERROR 0x13     /*{SCO31.DOC}*/
  420. X#define IOS1_8087_ERROR 0x14     /*{SCO31.DOC}*/
  421. X#define IOS1_CONVERTOR_ERROR 0x15     /*{SCO31.DOC}*/
  422. X#define IOS1_HUD_POWER_SUPPLY_ERROR 0x16     /*{SCO31.DOC}*/
  423. X#define IOS2_CODE_CHECKSUM_ERROR 0x21     /*{SCO31.DOC}*/
  424. X#define IOS2_RAM_ERROR 0x22     /*{SCO31.DOC}*/
  425. X#define IOS2_80186_ERROR 0x23     /*{SCO31.DOC}*/
  426. X#define IOS2_8087_ERROR 0x24     /*{SCO31.DOC}*/
  427. X#define IOS2_CONVERTOR_ERROR 0x25     /*{SCO31.DOC}*/
  428. X#define CLP_CODE_CHECKSUM_ERROR 0x31     /*{SCO31.DOC}*/
  429. X#define CLP_RAM_ERROR 0x32     /*{SCO31.DOC}*/
  430. X#define CLP_8086_ERROR 0x33     /*{SCO31.DOC}*/
  431. X#define CLP_8087_ERROR 0x34     /*{SCO31.DOC}*/
  432. X#define SM_CODE_CHECKSUM_ERROR 0x41     /*{SCO31.DOC}*/
  433. X#define SM_RAM_ERROR 0x42     /*{SCO31.DOC}*/
  434. X#define SM_8086_ERROR 0x43     /*{SCO31.DOC}*/
  435. X#define SM_8087_ERROR 0x44     /*{SCO31.DOC}*/
  436. X#define SYSTEM_MONITOR_INACTIVE 0x45     /*{SCO31.DOC}*/
  437. X#define DISPLAY_GENERATOR_ERROR 0x51     /*{SCO31.DOC}*/
  438. X#define SYMBOL_MISPOSITIONED_1 0x52     /*{SCO31.DOC}*/
  439. X#define OHU_VIDEO_FAIL 0x63     /*{SCO31.DOC}*/
  440. X#define OHU_HVPS_FAIL 0x64     /*{SCO31.DOC}*/
  441. X#define OHU_95_OR_30_VOLT_SUPPLY_FAIL 0x65     /*{SCO31.DOC}*/
  442. X#define SYMBOL_MISPOSITIONED_2 0x71     /*{SCO31.DOC}*/
  443. X#define WINDOW_COMPARATOR_ERROR 0x77     /*{SCO31.DOC}*/
  444. X#define DEU_VERTICAL_DEFLECTION_FAIL 0x7A     /*{SCO31.DOC}*/
  445. X#define DEU_HORIZONTAL_DEFLECTION_FAIL 0x7B     /*{SCO31.DOC}*/
  446. X#define DEU_DC_SUPPLY_FAIL 0x7C     /*{SCO31.DOC}*/
  447. X#define DEU_BOOST_SUPPLY_FAIL 0x7D     /*{SCO31.DOC}*/
  448. X#define DEU_DEFLECTION_SUPPLY_FAIL 0x7E     /*{SCO31.DOC}*/
  449. X#define TEST_ERROR_DISPLAY 0x88
  450. X#define DISPLAY_GENERATOR_TEST 0x89
  451. X#define HCP_FAILURE 0x91      /*{SCO31.DOC}*/
  452. X#define RSU_FAILURE 0x0A1     /*{SCO34.DOC}*/
  453. X#define COMBINER_NOT_LOCKED 0x0B1     /*{SCO33.DOC}*/
  454. X#define EIGHTH_SECOND 3
  455. X#define ONE_SIXTH_SECOND 3
  456. X#define QUARTER_SECOND 5
  457. X#define ONE_THIRD_SECOND 6
  458. X#define HALF_SECOND 10
  459. X#define ONE_SECOND 20
  460. X#define ONE_POINT_FIVE_SECONDS 30
  461. X#define TWO_SECONDS 40
  462. X#define FIVE_SECONDS 100
  463. X                  
  464. X#define HALF_PI 1.57079633F
  465. X#define PI 3.14159265F
  466. X#define TWO_PI 6.28318531F
  467. X#define TEN_KNOTS 16.9F
  468. X#define TEN_DEGREES 0.1745F
  469. X#define FIFTEEN_DEGREES 0.2618F
  470. X#define MAXIMUM_NUMBER 99999.9F
  471. X                  
  472. X#define FOREVER while (1)
  473. X
  474. SHAR_EOF
  475. chmod 0660 lit.c || echo "restore of lit.c fails"
  476. sed 's/^X//' << 'SHAR_EOF' > main.c &&
  477. X#include <stdio.h>
  478. X#ifdef IBMPC
  479. X#include <stdlib.h>
  480. X#include <sys\stat.h>
  481. X#else
  482. X#include <sys/types.h>
  483. X#include <sys/stat.h>
  484. X#endif
  485. X#include <fcntl.h>
  486. X#include "misc.h"
  487. X#include "defs.h"
  488. X#include "cvt.h"
  489. X#include "struct.h"
  490. X#include "tokens.h"
  491. X#include "tkn_defs.h"
  492. X
  493. Xchar    *text_buffer, *text_ptr;
  494. Xint    line_count;
  495. Xchar    *line_ptr;
  496. Xchar    current_file_name[128];
  497. Xchar    out_file_name[128];
  498. Xint    at_decl_count;
  499. Xchar    at_decl_list[MAX_AT_DECLS][MAX_TOKEN_LENGTH];
  500. XFILE    *ofd;
  501. X
  502. Xint    file_depth;
  503. X
  504. XFILE    *fopen();
  505. X
  506. X/*
  507. X *    Get list of AT declaration variables for EXTERNAL declaration checks
  508. X */
  509. Xget_at_decl()
  510. X{
  511. X    int    i, fd;
  512. X    char    ch;
  513. X
  514. X    at_decl_count = 0;
  515. X    if ((fd = open("at_decl.cvt", O_RDONLY)) == -1)
  516. X            /* Not found */
  517. X        return;
  518. X
  519. X    while (read(fd, &ch, 1) == 1) {
  520. X        i = 0;
  521. X        if (!is_a_char(ch)) {
  522. X        fprintf(stderr, "Illegal identifier in line %d at_decl.cvt\n",
  523. X            at_decl_count + 1);
  524. X        exit(1);
  525. X        }
  526. X        do {
  527. X#ifdef CONVERT_CASE
  528. X        if (is_a_uc_char(ch))
  529. X                /* Convert to lower case */
  530. X            ch += 32;
  531. X        else
  532. X        if (is_a_lc_char(ch))
  533. X                /* Convert to upper case */
  534. X            ch -= 32;
  535. X#endif
  536. X        at_decl_list[at_decl_count][i++] = ch;
  537. X        if (read(fd, &ch, 1) != 1) {
  538. X            fprintf(stderr, "Unexpected EOF in at_decl.cvt\n");
  539. X            exit(1);
  540. X        }
  541. X        } while ((ch != '\n') && (ch != ' '));
  542. X
  543. X        at_decl_list[at_decl_count++][i] = '\0';
  544. X    }
  545. X}
  546. X
  547. X/*
  548. X *    Open specified file, init options, and parse.
  549. X */
  550. Xcvt_file(file_name)
  551. Xchar    *file_name;
  552. X{
  553. X    int        fd, nr;
  554. X    struct    stat    file_stat;
  555. X    TOKEN        token, fname_token, token_module, token_do;
  556. X    int        token_class;
  557. X    char        *tmp_text_buffer, *tmp_text_ptr, *tmp_line_ptr;
  558. X    char        *tmp_ptr;
  559. X    int        tmp_line_count;
  560. X    char        tmp_file_name[128];
  561. X
  562. X    char        *get_mem();
  563. X
  564. X        /* Is this the first file? */
  565. X    if (file_depth) {
  566. X            /* No - save old text pointers */
  567. X        tmp_text_buffer = text_buffer;
  568. X        tmp_text_ptr = text_ptr;
  569. X        tmp_line_ptr = line_ptr;
  570. X        tmp_line_count = line_count;
  571. X        (void) strcpy(tmp_file_name, current_file_name);
  572. X    }
  573. X
  574. X        /* Save file name */
  575. X    (void) strcpy(current_file_name, file_name);
  576. X
  577. X        /* Open file */
  578. X    if ((fd = open(file_name, O_RDONLY)) == -1) {
  579. X        (void) fprintf(stderr, "Cannot open input file %s", file_name);
  580. X        perror("");
  581. X        exit(1);
  582. X    }
  583. X
  584. X        /* Get length */
  585. X    if (fstat(fd, &file_stat)) {
  586. X        perror("Cannot stat input file");
  587. X        exit(1);
  588. X    }
  589. X
  590. X        /* Allocate that much RAM */
  591. X    text_buffer = get_mem((unsigned int) file_stat.st_size + 1);
  592. X
  593. X        /* Read file */
  594. X    if ((nr = read(fd, text_buffer, (int) file_stat.st_size)) == -1) {
  595. X        perror("Cannot read input file");
  596. X        exit(1);
  597. X    }
  598. X
  599. X        /* Insert End-of-file Mark */
  600. X    text_buffer[nr] = '\0';
  601. X    (void) close(fd);
  602. X
  603. X        /* Init pointers */
  604. X    text_ptr = text_buffer;
  605. X    line_ptr = text_ptr;
  606. X    line_count = 1;
  607. X
  608. X        /* Init I/O */
  609. X    out_init();
  610. X
  611. X        /* Start with initial context using file name */
  612. X    (void) strcpy(fname_token.token_name, file_name);
  613. X    fname_token.token_class = IDENTIFIER;
  614. X    new_context(MODULE, &fname_token);
  615. X
  616. X        /* Is this the first file? */
  617. X    if (file_depth++ == 0) {
  618. X            /* Yes - open output file */
  619. X        if ((ofd = fopen(out_file_name, "w")) == NULL) {
  620. X            (void) fprintf(stderr, "Cannot create output file %s",
  621. X                out_file_name);
  622. X            exit(1);
  623. X        }
  624. X
  625. X            /* Check for module name */
  626. X        token_class = get_token(&token_module);
  627. X        out_pre_white(&token_module);
  628. X        tmp_ptr = token_module.token_start;
  629. X        if ((token_class == IDENTIFIER) &&
  630. X                /* Maybe got module name - Check for : */
  631. X            (get_token(&token) == LABEL) &&
  632. X                /* Check for DO; */
  633. X           ((get_token(&token_do) == RESERVED) &&
  634. X                    (token_do.token_type == DO)) &&
  635. X            (get_token(&token) == END_OF_LINE)) {
  636. X
  637. X                /* Got module header */
  638. X            out_pre_white(&token_do);
  639. X
  640. X                /* Parse to END [<module name>] */
  641. X            parse_till_end(&token);
  642. X            out_white_space(&token);
  643. X
  644. X            token_class = get_token(&token);
  645. X            if (token_class == IDENTIFIER) {
  646. X                out_pre_white(&token);
  647. X                token_class = get_token(&token);
  648. X            }
  649. X
  650. X                /* Should be at end of line */
  651. X            if (token_class != END_OF_LINE) {
  652. X                parse_error("';' expected");
  653. X            }
  654. X
  655. X                /* Should be at end of file */
  656. X            if (get_token(&token) != END_OF_FILE) {
  657. X                parse_error("End of file expected");
  658. X            }
  659. X            out_white_space(&token);
  660. X        } else {
  661. X            out_pre_white(&token_do);
  662. X            parse_warning("Module name expected");
  663. X            text_ptr = tmp_ptr;
  664. X            parse_file();
  665. X        }
  666. X    } else
  667. X        parse_file();
  668. X
  669. X    free(text_buffer);
  670. X
  671. X        /* Was this the first file? */
  672. X    if (--file_depth) {
  673. X            /* No - restore old text pointers */
  674. X        text_buffer = tmp_text_buffer;
  675. X        text_ptr = tmp_text_ptr;
  676. X        line_ptr = tmp_line_ptr;
  677. X        line_count = tmp_line_count;
  678. X        (void) strcpy(current_file_name, tmp_file_name);
  679. X    } else
  680. X        exit(0);
  681. X}
  682. X
  683. X/*
  684. X *    Open file and init options
  685. X */
  686. Xmain(argc, argv)
  687. Xint    argc;
  688. Xchar    *argv[];
  689. X{
  690. X    int    i;
  691. X    char    ch;
  692. X
  693. X    if (argc != 2) {
  694. X        (void) fprintf(stderr, "usage: %s filename\n", argv[0]);
  695. X        exit(1);
  696. X    }
  697. X
  698. X        /* Search for a '.' in filename */
  699. X    for (i = strlen(argv[1]) - 1; i; i--) {
  700. X        ch = argv[1][i];
  701. X        if ((ch == '.') || (ch == '/') || (ch == '\\'))
  702. X            break;
  703. X    }
  704. X
  705. X    if (ch != '.')
  706. X        i = strlen(argv[1]);
  707. X
  708. X        /* Append a '.c' */
  709. X    (void) strncpy(out_file_name, argv[1], i);
  710. X    out_file_name[i] = '\0';
  711. X    (void) strcat(out_file_name, ".c");
  712. X    (void) printf("Output to: %s\n", out_file_name);
  713. X
  714. X        /* Get AT declaration list */
  715. X    get_at_decl();
  716. X
  717. X        /* Init context */
  718. X    init_context();
  719. X
  720. X    file_depth = 0;
  721. X
  722. X        /* Parse main file */
  723. X    cvt_file(argv[1]);
  724. X}
  725. SHAR_EOF
  726. chmod 0660 main.c || echo "restore of main.c fails"
  727. sed 's/^X//' << 'SHAR_EOF' > makefile &&
  728. X# Makefile for Unix
  729. X
  730. XSRCS =    convert.c    \
  731. X    parse.c        \
  732. X    declare.c    \
  733. X    decl_out.c    \
  734. X    control.c    \
  735. X    io.c        \
  736. X    token.c        \
  737. X    context.c    \
  738. X    mem.c        \
  739. X    error.c        \
  740. X    version.c    \
  741. X    main.c
  742. X
  743. XOBJS =    convert.o    \
  744. X    parse.o        \
  745. X    declare.o    \
  746. X    decl_out.o    \
  747. X    control.o    \
  748. X    io.o        \
  749. X    token.o        \
  750. X    context.o    \
  751. X    mem.o        \
  752. X    error.o        \
  753. X    version.o    \
  754. X    main.o
  755. X
  756. XLNKS =    convert parse declare decl_out control io token context mem error version main
  757. X
  758. XTOKEN_HDRS = misc.h defs.h struct.h cvt.h cvt_id.h tokens.h
  759. XHDRS =    $(TOKEN_HDRS) tkn_defs.h tkn_ext.h
  760. X
  761. XOPTS = -c -O
  762. X
  763. Xplm2c:    $(OBJS)
  764. X    $(CC) -o plm2c $(OBJS)
  765. X
  766. Xconvert.o:    convert.c $(TOKEN_HDRS)
  767. X    $(CC) $(OPTS) convert.c
  768. X
  769. Xparse.o:    parse.c $(TOKEN_HDRS) cvt_id.h
  770. X    $(CC) $(OPTS) parse.c
  771. X
  772. Xdeclare.o:    declare.c $(TOKEN_HDRS)
  773. X    $(CC) $(OPTS) declare.c
  774. X
  775. Xcontrol.o:    control.c $(TOKEN_HDRS) tkn_ext.h
  776. X    $(CC) $(OPTS) control.c
  777. X
  778. Xdecl_out.o:    decl_out.c $(TOKEN_HDRS)
  779. X    $(CC) $(OPTS) decl_out.c
  780. X
  781. Xio.o:    io.c $(TOKEN_HDRS) tkn_ext.h
  782. X    $(CC) $(OPTS) io.c
  783. X
  784. Xtoken.o:    token.c $(TOKEN_HDRS) tkn_ext.h
  785. X    $(CC) $(OPTS) token.c
  786. X
  787. Xcontext.o:    context.c $(TOKEN_HDRS)
  788. X    $(CC) $(OPTS) context.c
  789. X
  790. Xmem.o:    mem.c $(TOKEN_HDRS)
  791. X    $(CC) $(OPTS) mem.c
  792. X
  793. Xerror.o:    error.c $(TOKEN_HDRS)
  794. X    $(CC) $(OPTS) error.c
  795. X
  796. Xversion.o:    version.c
  797. X    $(CC) $(OPTS) version.c
  798. X
  799. Xmain.o:    main.c $(TOKEN_HDRS) tkn_defs.h
  800. X    $(CC) $(OPTS) main.c
  801. X
  802. Xbackup:
  803. X    cp $(HDRS) Makefile bak
  804. X    cp $(SRCS) bak
  805. X
  806. Xlint:
  807. X    lint $(SRCS)
  808. X
  809. Xclean:
  810. X    rm -f $(OBJS)
  811. SHAR_EOF
  812. chmod 0660 makefile || echo "restore of makefile fails"
  813. sed 's/^X//' << 'SHAR_EOF' > makefile.ibm &&
  814. X# Makefile for IBM-PC MSDOS
  815. X
  816. XSRCS =    convert.c    \
  817. X    parse.c        \
  818. X    declare.c    \
  819. X    decl_out.c    \
  820. X    control.c    \
  821. X    io.c        \
  822. X    token.c        \
  823. X    context.c    \
  824. X    mem.c        \
  825. X    error.c        \
  826. X    version.c    \
  827. X    main.c
  828. X
  829. XOBJS =    convert.obj    \
  830. X    parse.obj    \
  831. X    declare.obj    \
  832. X    decl_out.obj    \
  833. X    control.obj    \
  834. X    io.obj        \
  835. X    token.obj    \
  836. X    context.obj    \
  837. X    mem.obj        \
  838. X    error.obj    \
  839. X    version.obj    \
  840. X    main.obj
  841. X
  842. XLNKS =    convert parse declare decl_out control io token context mem error version main
  843. X
  844. XTOKEN_HDRS = misc.h defs.h struct.h cvt.h cvt_id.h tokens.h
  845. XHDRS =    $(TOKEN_HDRS) tkn_defs.h tkn_ext.h
  846. X
  847. XMDL =    m
  848. XOPTS = -c -N -v -DIBMPC -m$(MDL)
  849. X
  850. Xplm2c:    $(OBJS)
  851. X    tlink /c /v c:\tc\lib\c0$(MDL) $(LNKS), plm2c, plm2c, c:\tc\lib\c$(MDL)
  852. X
  853. Xconvert.obj:    convert.c $(TOKEN_HDRS)
  854. X    tcc $(OPTS) convert
  855. X
  856. Xparse.obj:    parse.c $(TOKEN_HDRS) cvt_id.h
  857. X    tcc $(OPTS) parse
  858. X
  859. Xdeclare.obj:    declare.c $(TOKEN_HDRS)
  860. X    tcc $(OPTS) declare
  861. X
  862. Xcontrol.obj:    control.c $(TOKEN_HDRS) tkn_ext.h
  863. X    tcc $(OPTS) control
  864. X
  865. Xdecl_out.obj:    decl_out.c $(TOKEN_HDRS)
  866. X    tcc $(OPTS) decl_out
  867. X
  868. Xio.obj:    io.c $(TOKEN_HDRS) tkn_ext.h
  869. X    tcc $(OPTS) io
  870. X
  871. Xtoken.obj:    token.c $(TOKEN_HDRS) tkn_ext.h
  872. X    tcc $(OPTS) token
  873. X
  874. Xcontext.obj:    context.c $(TOKEN_HDRS)
  875. X    tcc $(OPTS) context
  876. X
  877. Xmem.obj:    mem.c $(TOKEN_HDRS)
  878. X    tcc $(OPTS) mem
  879. X
  880. Xerror.obj:    error.c $(TOKEN_HDRS)
  881. X    tcc $(OPTS) error
  882. X
  883. Xversion.obj:    version.c
  884. X    tcc $(OPTS) version
  885. X
  886. Xmain.obj:    main.c $(TOKEN_HDRS) tkn_defs.h
  887. X    tcc $(OPTS) main
  888. X
  889. Xbackup:
  890. X    cp $(HDRS) Makefile bak
  891. X    cp $(SRCS) bak
  892. X
  893. Xfloppy:
  894. X    cp $(HDRS) makefile a:
  895. X    cp $(SRCS) a:
  896. X
  897. Xlint:
  898. X    lint $(SRCS)
  899. X
  900. SHAR_EOF
  901. chmod 0660 makefile.ibm || echo "restore of makefile.ibm fails"
  902. sed 's/^X//' << 'SHAR_EOF' > mem.c &&
  903. X#ifdef IBMPC
  904. X#include <alloc.h>
  905. X#endif
  906. X#include "misc.h"
  907. X#include "defs.h"
  908. X#include "cvt.h"
  909. X#include "struct.h"
  910. X
  911. X/*
  912. X *    Memory allocation and deallocation routines.
  913. X */
  914. X
  915. X/*
  916. X *    Allocate memory
  917. X */
  918. Xchar *get_mem(size)
  919. Xunsigned int    size;
  920. X{
  921. X    char    *malloc_ptr;
  922. X    void    *malloc();
  923. X
  924. X    if ((malloc_ptr = (char *)malloc(size)) == NULL) {
  925. X        parse_error("Out of memory");
  926. X        exit(1);
  927. X    }
  928. X    return malloc_ptr;
  929. X}
  930. X
  931. X/*
  932. X *    Generate a new context.
  933. X */
  934. Xget_context_ptr(context)
  935. XCONTEXT    **context;
  936. X{
  937. X    *context = (CONTEXT *) get_mem(sizeof(CONTEXT));
  938. X    (*context)->decl_head = NULL;
  939. X    (*context)->next_context = NULL;
  940. X}
  941. X
  942. X/*
  943. X *    Malloc memory for a TOKEN.
  944. X */
  945. Xget_token_ptr(token)
  946. XTOKEN    **token;
  947. X{
  948. X    *token = (TOKEN *) get_mem(sizeof(TOKEN));
  949. X}
  950. X
  951. X/*
  952. X *    Malloc memory for a DECL_ID.
  953. X */
  954. Xget_var_ptr(var)
  955. XDECL_ID    **var;
  956. X{
  957. X    *var = (DECL_ID *) get_mem(sizeof(DECL_ID));
  958. X    (*var)->name = NULL;
  959. X    (*var)->based_name = NULL;
  960. X    (*var)->next_var = NULL;
  961. X    (*var)->is_ext_at = FALSE;
  962. X}
  963. X
  964. X/*
  965. X *    Free a linked list of variables.
  966. X */
  967. Xfree_var_list(list_ptr)
  968. XDECL_ID    *list_ptr;
  969. X{
  970. X    DECL_ID    *next_ptr;
  971. X
  972. X    while (list_ptr) {
  973. X        if (list_ptr->name)
  974. X            free( (char *) list_ptr->name);
  975. X        if (list_ptr->based_name)
  976. X            free( (char *) list_ptr->based_name);
  977. X        next_ptr = list_ptr->next_var;
  978. X        free((char *) list_ptr);
  979. X        list_ptr = next_ptr;
  980. X    }
  981. X}
  982. X
  983. X/*
  984. X *    Malloc space for a DECL_MEMBER structure and return pointer.
  985. X */
  986. Xget_element_ptr(element)
  987. XDECL_MEMBER    **element;
  988. X{
  989. X    DECL_MEMBER    *el_ptr;
  990. X
  991. X        /* Malloc space for element */
  992. X    el_ptr = (DECL_MEMBER *) get_mem(sizeof(DECL_MEMBER));
  993. X
  994. X        /* Init pointers */
  995. X    el_ptr->name_list = NULL;
  996. X    el_ptr->literal = NULL;
  997. X#ifdef PARSE_LITERALS
  998. X    el_ptr->literal_token = NULL;
  999. X#endif
  1000. X    el_ptr->array_bound = NULL;
  1001. X    el_ptr->type = NULL;
  1002. X    el_ptr->struct_list = NULL;
  1003. X    el_ptr->at_ptr = NULL;
  1004. X    el_ptr->init_ptr = NULL;
  1005. X    el_ptr->next_member = NULL;
  1006. X
  1007. X    el_ptr->attributes = NONE;
  1008. X    el_ptr->initialization = NONE;
  1009. X
  1010. X    *element = el_ptr;
  1011. X}
  1012. X
  1013. X/*
  1014. X *    Free a DECL_MEMBER list.
  1015. X */
  1016. Xfree_decl_list(element)
  1017. XDECL_MEMBER    *element;
  1018. X{
  1019. X    DECL_MEMBER    *el_ptr;
  1020. X
  1021. X    while (element) {
  1022. X        if (element->name_list)
  1023. X            free_var_list(element->name_list);
  1024. X        if (element->literal)
  1025. X            free((char *) element->literal);
  1026. X        if (element->array_bound)
  1027. X            free((char *) element->array_bound);
  1028. X        if (element->type)
  1029. X            free((char *) element->type);
  1030. X        if (element->struct_list)
  1031. X            free_decl_list(element->struct_list);
  1032. X        if (element->at_ptr)
  1033. X            free(element->at_ptr);
  1034. X
  1035. X        el_ptr = element->next_member;
  1036. X        free((char *) element);
  1037. X        element = el_ptr;
  1038. X    }
  1039. X}
  1040. X
  1041. X/*
  1042. X *    Malloc space for a procedure parameter
  1043. X */
  1044. Xget_param_ptr(param)
  1045. XPARAM_LIST    **param;
  1046. X{
  1047. X    *param = (PARAM_LIST *) get_mem(sizeof(PARAM_LIST));
  1048. X    (*param)->next_param = NULL;
  1049. X}
  1050. X
  1051. X/*
  1052. X *    Free parameter list
  1053. X */
  1054. Xfree_param_list(param_list)
  1055. XPARAM_LIST    *param_list;
  1056. X{
  1057. X    PARAM_LIST    *param_ptr;
  1058. X
  1059. X    while (param_list) {
  1060. X        param_ptr = param_list->next_param;
  1061. X        free((char *) param_list);
  1062. X        param_list = param_ptr;
  1063. X    }
  1064. X}
  1065. X
  1066. X/*
  1067. X *    Malloc space for a DECLARE statement
  1068. X */
  1069. Xget_decl_ptr(decl)
  1070. XDECL    **decl;
  1071. X{
  1072. X    *decl = (DECL *) get_mem(sizeof(DECL));
  1073. X    (*decl)->decl_list = NULL;
  1074. X    (*decl)->next_decl = NULL;
  1075. X}
  1076. X
  1077. X/*
  1078. X *    Free DECL list
  1079. X */
  1080. Xfree_decl(decl_list)
  1081. XDECL    *decl_list;
  1082. X{
  1083. X    DECL    *decl_ptr;
  1084. X
  1085. X    while (decl_list) {
  1086. X        decl_ptr = decl_list->next_decl;
  1087. X#ifdef FREE_DECL_TOKEN
  1088. X        if (decl_list->decl_token)
  1089. X            free((char *) decl_list->decl_token);
  1090. X#endif
  1091. X        if (decl_list->decl_list)
  1092. X            free_decl_list(decl_list->decl_list);
  1093. X        free((char *) decl_list);
  1094. X        decl_list = decl_ptr;
  1095. X    }
  1096. X}
  1097. X
  1098. X
  1099. SHAR_EOF
  1100. chmod 0660 mem.c || echo "restore of mem.c fails"
  1101. sed 's/^X//' << 'SHAR_EOF' > misc.h &&
  1102. X/*
  1103. X *    Miscellaneous defines
  1104. X */
  1105. Xtypedef    unsigned char    BYTE;
  1106. Xtypedef    unsigned char    BOOLEAN;
  1107. X
  1108. X
  1109. X#ifndef TRUE
  1110. X#define TRUE    1
  1111. X#endif
  1112. X
  1113. X#ifndef FALSE
  1114. X#define FALSE    0
  1115. X#endif
  1116. X
  1117. X#ifndef NULL
  1118. X#define NULL    0
  1119. X#endif
  1120. X
  1121. X/*
  1122. X *    White space characters
  1123. X */
  1124. X#define    SPACE    ' '
  1125. X#define TAB    9
  1126. X#define CR    13
  1127. X#define LF    10
  1128. X
  1129. X/*
  1130. X *    Useful defines
  1131. X */
  1132. X#define is_a_uc_char(char) ((char >= 'A') && (char <= 'Z'))
  1133. X#define is_a_lc_char(char) ((char >= 'a') && (char <= 'z'))
  1134. X#define is_a_char(char) (((char & 0x5F) >= 'A') && ((char & 0x5F) <= 'Z'))
  1135. X#define is_a_digit(char) ((char >= '0') && (char <= '9'))
  1136. X
  1137. X#define is_a_type(token) ((token->token_class == RESERVED) && \
  1138. X        (token->token_type >= BYTE) && (token->token_type <= REAL))
  1139. X
  1140. X#define is_white(ch) ((ch == ' ') || (ch == TAB))
  1141. X
  1142. X#define NONE    0
  1143. X
  1144. Xchar    *strcat(), *strncat(), *strcpy(), *strncpy();
  1145. X#ifdef IBMPC
  1146. Xint    sprintf();
  1147. X#endif
  1148. SHAR_EOF
  1149. chmod 0660 misc.h || echo "restore of misc.h fails"
  1150. sed 's/^X//' << 'SHAR_EOF' > parse.c &&
  1151. X#include <stdio.h>
  1152. X#ifdef IBMPC
  1153. X#include <stdlib.h>
  1154. X#endif
  1155. X#include "misc.h"
  1156. X#include "defs.h"
  1157. X#include "cvt.h"
  1158. X#include "struct.h"
  1159. X#include "cvt_id.h"
  1160. X#include "tokens.h"
  1161. X
  1162. Xextern    char    *text_buffer, *text_ptr;
  1163. Xextern    int    line_count;
  1164. Xextern    char    *out_string;
  1165. X
  1166. X/*
  1167. X *    Parse a procedure parameter list.
  1168. X *    Return head of linked list of parameters.
  1169. X */
  1170. Xget_param_list(param_head)
  1171. XPARAM_LIST    **param_head;
  1172. X{
  1173. X    PARAM_LIST    *list_ptr, *param_ptr;
  1174. X    int        token_class;
  1175. X    TOKEN        sep_token;
  1176. X
  1177. X    *param_head = NULL;
  1178. X    list_ptr = NULL;
  1179. X
  1180. X    do {
  1181. X        get_param_ptr(¶m_ptr);
  1182. X        if (*param_head == NULL)
  1183. X            *param_head = param_ptr;
  1184. X        if (list_ptr)
  1185. X            list_ptr->next_param = param_ptr;
  1186. X        list_ptr = param_ptr;
  1187. X        token_class = get_token(¶m_ptr->param);
  1188. X        if (token_class != IDENTIFIER) {
  1189. X            parse_error("Identifier expected");
  1190. X            free_param_list(*param_head);
  1191. X        }
  1192. X            /* Get ',' or ')' */
  1193. X        token_class = get_token(&sep_token);
  1194. X    } while (token_class == COMMA);
  1195. X
  1196. X    if (token_class != RIGHT_PAREN) {
  1197. X        parse_error("')' expected");
  1198. X        free_param_list(*param_head);
  1199. X    }
  1200. X}
  1201. X
  1202. X/*
  1203. X *    Parse parameter list.
  1204. X *    Parse DECLARE statements until all parameters in param_list
  1205. X *    have been found.  Split declare statements into those used in
  1206. X *    param_list and those not.  Return pointers to head of both
  1207. X *    DECL_MEMBER lists.
  1208. X */
  1209. Xparse_param_list(param_list, decl_list, extra_decl_list)
  1210. XPARAM_LIST    *param_list;
  1211. XDECL        **decl_list, **extra_decl_list;
  1212. X{
  1213. X    DECL        *extra_decl, *extra_decl_ptr;
  1214. X    DECL        *list, *list_ptr;
  1215. X    DECL_MEMBER    *extra_list_ptr;
  1216. X    DECL_MEMBER    *el_ptr, *last_el_ptr, *next_el_ptr;
  1217. X    DECL_MEMBER    *extra_el_ptr;
  1218. X    int        token_class;
  1219. X    TOKEN        *decl_token;
  1220. X    DECL_ID        *var_ptr, *last_var_ptr, *next_var_ptr;
  1221. X    DECL_ID        *extra_last_var_ptr;
  1222. X    PARAM_LIST    *param_ptr, *last_param;
  1223. X
  1224. X    *decl_list = NULL;
  1225. X    *extra_decl_list = NULL;
  1226. X        /* Pointer to next DECL_MEMBER in decl_ptr */
  1227. X    list_ptr = NULL;
  1228. X        /* Pointer to next DECL in extra_decl_list */
  1229. X    extra_decl_ptr = NULL;
  1230. X
  1231. X    while (param_list) {
  1232. X            /* Get declaration */
  1233. X        get_token_ptr(&decl_token);
  1234. X        token_class = get_token(decl_token);
  1235. X        if ((token_class != RESERVED) ||
  1236. X            (decl_token->token_type != DECLARE)) {
  1237. X            parse_error("DECLARE expected");
  1238. X            free((char *) decl_token);
  1239. X            return;
  1240. X        }
  1241. X            /* Get declaration list */
  1242. X        get_decl_ptr(&list);
  1243. X        get_decl_list(list);
  1244. X        list->decl_token = decl_token;
  1245. X
  1246. X            /* Points to start of extra declaration list */
  1247. X        extra_list_ptr = NULL;
  1248. X
  1249. X            /* Pointer to previous el_ptr */
  1250. X        last_el_ptr = NULL;
  1251. X
  1252. X            /* Check each element of the DECLARE statement */
  1253. X        el_ptr = list->decl_list;
  1254. X        while (el_ptr) {
  1255. X
  1256. X            /* Point to next member */
  1257. X        next_el_ptr = el_ptr->next_member;
  1258. X
  1259. X            /* Pointer to next DECL_MEMBER in extra_decl_ptr */
  1260. X        extra_el_ptr = NULL;
  1261. X
  1262. X            /* Points to last variable in variable list */
  1263. X        last_var_ptr = NULL;
  1264. X            /* Contains not found variables in name_list */
  1265. X        extra_last_var_ptr = NULL;
  1266. X
  1267. X            /* Check each variable in name list */
  1268. X        for (var_ptr = el_ptr->name_list; var_ptr; ) {
  1269. X            /* Point to following var_ptr */
  1270. X            next_var_ptr = var_ptr->next_var;
  1271. X
  1272. X                /* Is this variable in param list? */
  1273. X            last_param = NULL;
  1274. X            for (param_ptr = param_list; param_ptr;
  1275. X                param_ptr = param_ptr->next_param) {
  1276. X            if (!strcmp(param_ptr->param.token_name,
  1277. X                var_ptr->name->token_name))
  1278. X                break;
  1279. X            else
  1280. X                last_param = param_ptr;
  1281. X            }
  1282. X
  1283. X            if (param_ptr) {
  1284. X
  1285. X                /* Variable found */
  1286. X                /* Remove from parameter list */
  1287. X            if (last_param)
  1288. X                last_param->next_param = param_ptr->next_param;
  1289. X            else
  1290. X                param_list = param_ptr->next_param;
  1291. X
  1292. X            free((char *) param_ptr);
  1293. X                last_var_ptr = var_ptr;
  1294. X            } else {
  1295. X/*
  1296. X *    Variable not found - Add to extra variable list
  1297. X */
  1298. X            if (extra_el_ptr == NULL) {
  1299. X/*
  1300. X *    Create new element and copy DECLARE info
  1301. X */
  1302. X                get_element_ptr(&extra_el_ptr);
  1303. X                element_copy(el_ptr, extra_el_ptr);
  1304. X                extra_last_var_ptr = NULL;
  1305. X/*
  1306. X *    Link new extra element into extra_list_ptr
  1307. X */
  1308. X                if (extra_list_ptr) {
  1309. X                extra_list_ptr->next_member = extra_el_ptr;
  1310. X                } else {
  1311. X/*
  1312. X *    Create new extra declaration
  1313. X */
  1314. X                get_decl_ptr(&extra_decl);
  1315. X
  1316. X                    /* Point to DECLARE token */
  1317. X                extra_decl->decl_token =
  1318. X                    list->decl_token;
  1319. X                extra_decl->decl_list = extra_el_ptr;
  1320. X/*
  1321. X *    Link new extra declaration into extra_decl_list
  1322. X */
  1323. X                if (extra_decl_ptr)
  1324. X                    extra_decl_ptr->next_decl = extra_decl;
  1325. X                else
  1326. X                    *extra_decl_list = extra_decl;
  1327. X
  1328. X                extra_decl_ptr = extra_decl;
  1329. X                }
  1330. X                extra_list_ptr = extra_el_ptr;
  1331. X            }
  1332. X
  1333. X                /* Add var_ptr to extra list */
  1334. X            if (extra_last_var_ptr)
  1335. X                extra_last_var_ptr->next_var = var_ptr;
  1336. X            else
  1337. X                extra_list_ptr->name_list = var_ptr;
  1338. X
  1339. X            extra_last_var_ptr = var_ptr;
  1340. X
  1341. X                /* Remove from DECLARE list */
  1342. X            if (last_var_ptr)
  1343. X                last_var_ptr->next_var = next_var_ptr;
  1344. X            else
  1345. X                el_ptr->name_list = next_var_ptr;
  1346. X
  1347. X            var_ptr->next_var = NULL;
  1348. X            }
  1349. X
  1350. X            var_ptr = next_var_ptr;
  1351. X        }
  1352. X
  1353. X/*
  1354. X *    Check for empty name list
  1355. X */
  1356. X        if (el_ptr->name_list == NULL) {
  1357. X/*
  1358. X *    Empty name list - unlink and discard element from declaration list
  1359. X */
  1360. X            if (last_el_ptr)
  1361. X            last_el_ptr->next_member = next_el_ptr;
  1362. X            else
  1363. X            list->decl_list = next_el_ptr;
  1364. X
  1365. X            el_ptr->next_member = NULL;
  1366. X            free((char *) el_ptr);
  1367. X        } else
  1368. X            last_el_ptr = el_ptr;
  1369. X
  1370. X        el_ptr = next_el_ptr;
  1371. X        }
  1372. X
  1373. X            /* Save found items in decl_list */
  1374. X        if (list->decl_list->name_list) {
  1375. X        if (*decl_list)
  1376. X            list_ptr->next_decl = list;
  1377. X        else
  1378. X            *decl_list = list;
  1379. X        list_ptr = list;
  1380. X        } else
  1381. X        free((char *) list);
  1382. X
  1383. X    }
  1384. X}
  1385. X
  1386. X/*
  1387. X *    Parse until desired token type appears
  1388. X */
  1389. Xparse_till(type, token)
  1390. Xint    type;
  1391. XTOKEN    *token;
  1392. X{
  1393. X    while (get_token(token) != type)
  1394. X        out_token(token);
  1395. X}
  1396. X
  1397. X/*
  1398. X *    Parse until END statement
  1399. X */
  1400. Xparse_till_end(token)
  1401. XTOKEN    *token;
  1402. X{
  1403. X    int    token_class;
  1404. X
  1405. X    while (1) {
  1406. X        token_class = get_token(token);
  1407. X
  1408. X        if (token_class == END_OF_FILE) {
  1409. X            parse_error("Premature end-of-file");
  1410. X            exit(1);
  1411. X        }
  1412. X
  1413. X        if ((token_class == RESERVED) && (token->token_type == END))
  1414. X            return;
  1415. X
  1416. X        parse_statement(token);
  1417. X    }
  1418. X}
  1419. X
  1420. X/*
  1421. X *    Parse through END statement
  1422. X */
  1423. Xparse_to_end()
  1424. X{
  1425. X    TOKEN    token;
  1426. X
  1427. X    parse_till_end(&token);
  1428. X    parse_statement(&token);
  1429. X}
  1430. X
  1431. X/*
  1432. X *    Check for end of line (';')
  1433. X */
  1434. Xcheck_eol()
  1435. X{
  1436. X    TOKEN    token;
  1437. X
  1438. X    if (get_token(&token) != END_OF_LINE)
  1439. X        parse_error("';' expected");
  1440. X    else
  1441. X        out_token(&token);
  1442. X}
  1443. X
  1444. X/*
  1445. X *    Parse simple variable and return variable token and following token.
  1446. X *    Passed with initial identifier in token.
  1447. X *    Returns with next_token terminating variable.
  1448. X *    Handles [ .<identifier> ] ...
  1449. X */
  1450. Xparse_simple_variable(token, next_token)
  1451. XTOKEN    *token, *next_token;
  1452. X{
  1453. X    int    token_class;
  1454. X
  1455. X    while (1) {
  1456. X        token_class = get_token(next_token);
  1457. X        if (token_class != PERIOD)
  1458. X            return token_class;
  1459. X
  1460. X            /* Process .<identifier> */
  1461. X        token_class = get_token(next_token);
  1462. X        if (token_class != IDENTIFIER) {
  1463. X            parse_error("Illegal identifier");
  1464. X            return ERROR;
  1465. X        }
  1466. X            /* Add .<identifier> to original token name */
  1467. X        (void) strcat(token->token_name, ".");
  1468. X        (void) strcat(token->token_name, next_token->token_name);
  1469. X            /* Parse for additional member */
  1470. X        return parse_simple_variable(token, next_token);
  1471. X    }
  1472. X}
  1473. X
  1474. X/*
  1475. X *    Parse variable identifier.  If pointer, output (*ident) else
  1476. X *    If variable has BASED attribute, output (*based_name).
  1477. X *    Otherwise, output ident.
  1478. X */
  1479. Xout_ident(ident, decl, decl_id)
  1480. XTOKEN        *ident;
  1481. XDECL_MEMBER    *decl;
  1482. XDECL_ID        *decl_id;
  1483. X{
  1484. X    if (decl->at_ptr || decl_id->is_ext_at) {
  1485. X        out_white_space(ident);
  1486. X        out_str("(*");
  1487. X        out_token_name(ident);
  1488. X        out_char(')');
  1489. X    } else
  1490. X
  1491. X    if (decl_id->based_name) {
  1492. X        out_white_space(ident);
  1493. X        out_str("(**");
  1494. X        out_token_name(decl_id->name);
  1495. X        out_char(')');
  1496. X    } else
  1497. X        out_token(ident);
  1498. X}
  1499. X
  1500. X/*
  1501. X *    Parse variable name or structure element and output appropriate tokens.
  1502. X *    Passed with identifier in token, and declaration for token in decl.
  1503. X *    Returns with token terminating variable.
  1504. X *    Handles <member> { [ ( <expression> ) ] [ .<identifier> ] }
  1505. X */
  1506. Xparse_member(token, decl, decl_id)
  1507. XTOKEN        *token;
  1508. XDECL_MEMBER    *decl;
  1509. XDECL_ID        *decl_id;
  1510. X{
  1511. X    int        token_class;
  1512. X    TOKEN        member;
  1513. X    DECL_MEMBER    *var_decl;
  1514. X    DECL_ID        *var_decl_id;
  1515. X
  1516. X        /* Check for literal */
  1517. X    if (decl->literal) {
  1518. X            /* Yes - output case converted literal */
  1519. X        out_white_space(token);
  1520. X        out_cvt_name(token);
  1521. X            /* Return next token */
  1522. X        token_class = get_token(token);
  1523. X        return token_class;
  1524. X    }
  1525. X
  1526. X    token_copy(token, &member);
  1527. X
  1528. X    token_class = get_token(token);
  1529. X
  1530. X        /* Check for array subscript */
  1531. X    if (decl->array_bound) {
  1532. X        out_ident(&member, decl, decl_id);
  1533. X
  1534. X        if (token_class == LEFT_PAREN) {
  1535. X            /* Convert to open square bracket */
  1536. X        token->token_name[0] = '[';
  1537. X        out_token(token);
  1538. X
  1539. X            /* Parse expression to right parenthesis */
  1540. X        token_class = parse_expression(token);
  1541. X        if (token_class != RIGHT_PAREN) {
  1542. X            parse_error("')' expected");
  1543. X            return ERROR;
  1544. X        }
  1545. X
  1546. X            /* Convert to close square bracket */
  1547. X        token->token_name[0] = ']';
  1548. X        out_token(token);
  1549. X
  1550. X        token_class = get_token(token);
  1551. X        }
  1552. X    }
  1553. X
  1554. X        /* Check for .<identifier> */
  1555. X    if ((decl->type->token_type == STRUCTURE) && (token_class == PERIOD)) {
  1556. X
  1557. X        if (decl->array_bound)
  1558. X                /* Already printed identifier */
  1559. X            out_token(token);
  1560. X        else {
  1561. X            if (decl->at_ptr || decl_id->based_name) {
  1562. X/*
  1563. X * --- Note: Does not handle BASED AT variables!
  1564. X */
  1565. X                    /* Print 'member->' */
  1566. X                out_token(&member);
  1567. X                out_str("->");
  1568. X            } else {
  1569. X                    /* Print 'member.' */
  1570. X                out_ident(&member, decl, decl_id);
  1571. X                out_token(token);
  1572. X            }
  1573. X        }
  1574. X
  1575. X        token_class = get_token(token);
  1576. X        if (token_class != IDENTIFIER) {
  1577. X            parse_error("Illegal structure member");
  1578. X            return ERROR;
  1579. X        }
  1580. X
  1581. X            /* Find variable in list */
  1582. X        if (!find_list_symbol(token, decl->struct_list,
  1583. X                    &var_decl, &var_decl_id)) {
  1584. X            parse_error("Undefined structure member");
  1585. X            return ERROR;
  1586. X        }
  1587. X
  1588. X            /* Parse this member now */
  1589. X        token_class = parse_member(token, var_decl, var_decl_id);
  1590. X    } else
  1591. X        if (decl->array_bound == NULL)
  1592. X        out_ident(&member, decl, decl_id);
  1593. X
  1594. X    return token_class;
  1595. X}
  1596. X
  1597. X/*
  1598. X *    Parse variable and output appropriate tokens.
  1599. X *    Passed with initial identifier in token.
  1600. X *    Returns with token terminating variable.
  1601. X *    Handles { [ ( <expression> ) ] [ .<identifier> ] } ...
  1602. X */
  1603. Xparse_variable(token, var_decl, var_decl_id)
  1604. XTOKEN        *token;
  1605. XDECL_MEMBER    **var_decl;
  1606. XDECL_ID        **var_decl_id;
  1607. X{
  1608. X    if (!find_symbol(token, var_decl, var_decl_id)) {
  1609. X        parse_error("Undefined variable");
  1610. X        return ERROR;
  1611. X    }
  1612. X
  1613. X    return parse_member(token, *var_decl, *var_decl_id);
  1614. X}
  1615. X
  1616. X/*
  1617. X *    See if token is in cvt_list.
  1618. X *    If found, return pointer to conversion string.
  1619. X */
  1620. Xcheck_cvt_id(token, cvt_id, cvt_string)
  1621. XTOKEN    *token;
  1622. XCVT_ID    *cvt_id;
  1623. Xchar    **cvt_string;
  1624. X{
  1625. X        /* Check each string in cvt_id */
  1626. X    while (*(cvt_id->id_name)) {
  1627. X        if (!strcmp(token->token_name, cvt_id->id_name)) {
  1628. X                /* Found match - return new string */
  1629. X            *cvt_string = cvt_id->new_id;
  1630. X            return TRUE;
  1631. X        }
  1632. X
  1633. X        cvt_id++;
  1634. X    }
  1635. X
  1636. X    return FALSE;
  1637. X}
  1638. X
  1639. X/*
  1640. X *    Parse function call
  1641. X */
  1642. Xparse_function(token)
  1643. XTOKEN    *token;
  1644. X{
  1645. X    int        token_class;
  1646. X    BOOLEAN        left_shift, right_shift;
  1647. X    char        *new_func;
  1648. X    DECL_MEMBER    *decl_ptr;
  1649. X    DECL_ID        *decl_id;
  1650. X
  1651. X        /* Function call - check for SHL or SHR */
  1652. X    out_white_space(token);
  1653. X    left_shift = !strcmp(token->token_name, "shl") ||
  1654. X             !strcmp(token->token_name, "SHL");
  1655. X    right_shift = !strcmp(token->token_name, "shr") ||
  1656. X              !strcmp(token->token_name, "SHR");
  1657. X    if (left_shift || right_shift) {
  1658. X            /* SHL(expr, expr) or SHR(expr, expr) */
  1659. X            /* Check for '(' */
  1660. X        token_class = get_token(token);
  1661. X        if (token_class != LEFT_PAREN) {
  1662. X            parse_error("'(' expected");
  1663. X            return ERROR;
  1664. X        }
  1665. X        out_token(token);
  1666. X
  1667. X            /* Output first expression */
  1668. X        out_char('(');
  1669. X        token_class = parse_expression(token);
  1670. X        if (token_class != COMMA) {
  1671. X            parse_error("',' expected");
  1672. X            return ERROR;
  1673. X        }
  1674. X
  1675. X        out_str(left_shift ? ") << (" : ") >> (");
  1676. X
  1677. X            /* Output second expression */
  1678. X        token_class = parse_expression(token);
  1679. X        if (token_class != RIGHT_PAREN) {
  1680. X            parse_error("Missing ')'");
  1681. X            return ERROR;
  1682. X        }
  1683. X        out_char(')');
  1684. X        out_token(token);
  1685. X    } else {
  1686. X
  1687. X            /* Check for a type cast function */
  1688. X        if (check_cvt_id(token, &cast_functions[0], &new_func)) {
  1689. X                /* Convert to a cast */
  1690. X            out_char('(');
  1691. X            out_str(new_func);
  1692. X            out_str(") ");
  1693. X        } else
  1694. X
  1695. X            /* Check for a function conversion */
  1696. X        if (check_cvt_id(token, &cvt_functions[0], &new_func)) {
  1697. X                /* Convert to desired function */
  1698. X            out_str(new_func);
  1699. X        } else {
  1700. X
  1701. X                /* Output function name */
  1702. X            out_token_name(token);
  1703. X
  1704. X                /* Check for parameter list */
  1705. X            if (find_symbol(token, &decl_ptr, &decl_id)) {
  1706. X                if (decl_ptr->type->token_type != PROCEDURE) {
  1707. X                parse_error("Illegal function call");
  1708. X                return ERROR;
  1709. X                }
  1710. X                if (decl_ptr->initialization != DATA) {
  1711. X                    /* No param list */
  1712. X                token_class = get_token(token);
  1713. X                return token_class;
  1714. X                }
  1715. X            }
  1716. X        }
  1717. X
  1718. X            /* Check for parameter list */
  1719. X        token_class = get_token(token);
  1720. X        if (token_class != LEFT_PAREN) {
  1721. X            parse_warning("Parameter list expected");
  1722. X            return token_class;
  1723. X        }
  1724. X        out_token(token);
  1725. X
  1726. X            /* Parse to closing right paren */
  1727. X        do {
  1728. X            token_class = parse_expression(token);
  1729. X            out_token(token);
  1730. X        } while (token_class == COMMA);
  1731. X
  1732. X        if (token_class != RIGHT_PAREN) {
  1733. X            parse_error("Missing ')'");
  1734. X            return ERROR;
  1735. X        }
  1736. X    }
  1737. X        /* Return token following function */
  1738. X    token_class = get_token(token);
  1739. X    return token_class;
  1740. X}
  1741. X
  1742. X/*
  1743. X *    Parse expression and output appropriate tokens.
  1744. X *    Return token at end of expression.
  1745. X */
  1746. Xparse_expression(token)
  1747. XTOKEN    *token;
  1748. X{
  1749. X    int        token_class;
  1750. X    int        i, last_class, temp_class;
  1751. X    DECL_MEMBER    *id_type;
  1752. X    DECL_ID    *id_id;
  1753. X    char    *new_id;
  1754. X    char    string_const[MAX_TOKEN_LENGTH], octal_const[5];
  1755. X
  1756. X    last_class = OPERATOR;
  1757. X
  1758. X    token_class = get_token(token);
  1759. X
  1760. X    while (1) {
  1761. X
  1762. X    switch (token_class) {
  1763. X
  1764. X    case LEFT_PAREN :
  1765. X        if (last_class != OPERATOR) {
  1766. X            parse_error("Missing operator");
  1767. X            return ERROR;
  1768. X        }
  1769. X
  1770. X            /* Sub-expression */
  1771. X        out_token(token);
  1772. X            /* Parse to closing right paren */
  1773. X        token_class = parse_expression(token);
  1774. X        if (token_class != RIGHT_PAREN) {
  1775. X            parse_error("Missing ')'");
  1776. X            return ERROR;
  1777. X        }
  1778. X
  1779. X        out_token(token);
  1780. X        break;
  1781. X
  1782. X    case RIGHT_PAREN :
  1783. X        return token_class;
  1784. X
  1785. X    case OPERATOR :
  1786. X        out_white_space(token);
  1787. X        if (token->token_type == EQUAL)
  1788. X                /* Make it a '==' */
  1789. X            out_str("==");
  1790. X        else
  1791. X
  1792. X            /* Check for address operator '@' or '.' */
  1793. X        if ((token->token_type == AT_OP) ||
  1794. X                (token->token_type == PERIOD)) {
  1795. X            token_class = get_token(token);
  1796. X            if (token_class == IDENTIFIER) {
  1797. X                /* Make it a '&' */
  1798. X            out_char('&');
  1799. X
  1800. X                /* See if it's a function reference */
  1801. X            if (find_symbol(token, &id_type, &id_id) &&
  1802. X                (id_type->type->token_type != PROCEDURE)) {
  1803. X                    /* Variable - parse it */
  1804. X                temp_class = parse_member(token, id_type, id_id);
  1805. X            } else {
  1806. X
  1807. X                    /* Function call - Check for */
  1808. X                    /* a function conversion */
  1809. X                if (check_cvt_id(token, &cvt_functions[0], &new_id))
  1810. X                        /* Convert to desired function */
  1811. X                    out_str(new_id);
  1812. X                else
  1813. X                            /* Function call - output name */
  1814. X                        out_token_name(token);
  1815. X
  1816. X                temp_class = get_token(token);
  1817. X            }
  1818. X            } else
  1819. X
  1820. X            if (token_class == LEFT_PAREN) {
  1821. X                /* Constant list - convert to string */
  1822. X            out_char('"');
  1823. X            string_const[0] = '\0';
  1824. X
  1825. X            do {
  1826. X                token_class = get_token(token);
  1827. X                if (token_class == STRING)
  1828. X                    (void) strcat(string_const, token->token_name);
  1829. X                else
  1830. X                if (token_class == NUMERIC) {
  1831. X                    cvt_octal(token, octal_const);
  1832. X                    (void) strcat(string_const, octal_const);
  1833. X                } else {
  1834. X                    parse_error("Illegal constant");
  1835. X                    return ERROR;
  1836. X                }
  1837. X
  1838. X                token_class = get_token(token);
  1839. X            } while (token_class == COMMA);
  1840. X
  1841. X            if (token_class != RIGHT_PAREN) {
  1842. X                parse_error("')' expected");
  1843. X                return ERROR;
  1844. X            }
  1845. X
  1846. X            i = strlen(string_const);
  1847. X            if ((i >= 4) &&
  1848. X                (!strcmp(string_const + i - 4, "\\000")))
  1849. X                    /* Discard trailing null */
  1850. X                string_const[i - 4] = '\0';
  1851. X            out_str(string_const);
  1852. X            out_char('"');
  1853. X            } else {
  1854. X            parse_error("Illegal operator");
  1855. X            return ERROR;
  1856. X            }
  1857. X        } else
  1858. X
  1859. X            out_token_name(token);
  1860. X        break;
  1861. X
  1862. X    case IDENTIFIER :
  1863. X            /* Check for identifier conversion */
  1864. X        if (check_cvt_id(token, &cvt_identifiers[0], &new_id)) {
  1865. X            out_white_space(token);
  1866. X            out_str(new_id);
  1867. X            temp_class = get_token(token);
  1868. X        } else
  1869. X
  1870. X            /* See if variable in context */
  1871. X        if (find_symbol(token, &id_type, &id_id) &&
  1872. X            (id_type->type->token_type != PROCEDURE)) {
  1873. X                /* Variable - parse it */
  1874. X            temp_class = parse_member(token, id_type, id_id);
  1875. X        } else
  1876. X
  1877. X                /* Function call - parse it */
  1878. X            temp_class = parse_function(token);
  1879. X        break;
  1880. X
  1881. X    case NUMERIC :
  1882. X        out_token(token);
  1883. X        break;
  1884. X
  1885. X    case STRING :
  1886. X        out_white_space(token);
  1887. X            /* Convert to a numeric constant */
  1888. X        if (token->token_length > 4) {
  1889. X            parse_error("Illegal string constant");
  1890. X            return ERROR;
  1891. X        }
  1892. X
  1893. X        if (token->token_length > 1)
  1894. X            out_char('(');
  1895. X
  1896. X        out_str_const(token->token_name, token->token_length);
  1897. X
  1898. X        if (token->token_length > 1)
  1899. X            out_char(')');
  1900. X        break;
  1901. X
  1902. X    default :
  1903. X        /* Must not be part of an expression! */
  1904. X        return token_class;
  1905. X    }
  1906. X
  1907. X    last_class = token_class;
  1908. X
  1909. X    token_class = (last_class == IDENTIFIER) ?
  1910. X            temp_class : get_token(token);
  1911. X    }
  1912. X}
  1913. X
  1914. X/*
  1915. X *    DO statement
  1916. X *    Handles DO;, DO CASE, DO WHILE, and iterative DO
  1917. X */
  1918. Xparse_do(first_token)
  1919. XTOKEN    *first_token;
  1920. X{
  1921. X    TOKEN        token;
  1922. X    int        token_class;
  1923. X    int        case_line;
  1924. X    char        case_statement[MAX_TOKEN_LENGTH];
  1925. X    char        case_output[MAX_CASE_STATEMENT_SIZE];
  1926. X    char        var_string[MAX_TOKEN_LENGTH];
  1927. X    char        *temp_out_string, *temp_out_string1;
  1928. X    DECL_MEMBER    *var_decl;
  1929. X    DECL_ID        *var_decl_id;
  1930. X
  1931. X        /* Create new context */
  1932. X    new_context(DO, (TOKEN *) NULL);
  1933. X
  1934. X    out_white_space(first_token);
  1935. X
  1936. X        /* Determine what kind of DO statement */
  1937. X    token_class = get_token(&token);
  1938. X
  1939. X    switch (token_class) {
  1940. X
  1941. X    case END_OF_LINE :
  1942. X            /* DO; */
  1943. X        out_white_space(&token);
  1944. X        out_char('{');            /* } for dumb vi */
  1945. X        parse_to_end();
  1946. X        break;
  1947. X
  1948. X    case IDENTIFIER :
  1949. X            /* DO counter = start TO limit BY step */
  1950. X        out_str("for");
  1951. X        out_must_white(&token);
  1952. X        out_char('(');
  1953. X
  1954. X            /* Put full variable in var_string */
  1955. X        var_string[0] = '\0';
  1956. X        temp_out_string = out_string;
  1957. X        out_string = var_string;
  1958. X        token_class = parse_variable(&token, &var_decl, &var_decl_id);
  1959. SHAR_EOF
  1960. echo "End of part 2, continue with part 3"
  1961. echo "3" > s2_seq_.tmp
  1962. exit 0
  1963.