home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Tex / Tex29 / StTeXsrc.zoo / src / texext.c < prev    next >
C/C++ Source or Header  |  1988-03-13  |  7KB  |  352 lines

  1.  
  2. /*
  3.  * @(#)texext.c 2.5 EPA
  4.  *
  5.  * Copyright 1987,1988 Pat J Monardo
  6.  *
  7.  * Redistribution of this file is permitted through
  8.  * the specifications in the file COPYING.
  9.  *
  10.  * 
  11.  */
  12.  
  13. #include "tex.h"
  14. #include "token.h"
  15. #include "box.h"
  16. #include "scan.h"
  17. #include "def.h"
  18. #include "tokenstack.h"
  19. #include "tokenlists.h"
  20. #include "evalstack.h"
  21. #include "file.h"
  22. #include "dvi.h"
  23. #include "texext.h"
  24.  
  25. alpha_file  write_file[16];
  26.  
  27. bool    write_open[18];
  28. ptr     write_loc;
  29.  
  30. do_extension ()
  31. {
  32.     int     i;
  33.     int     j;
  34.     int     k;
  35.     ptr     p;
  36.     ptr     q;
  37.     ptr     r;
  38.  
  39.     switch (cur_chr)
  40.     {
  41.     case OPEN_NODE:
  42.         new_write(OPEN_NODE_SIZE);
  43.         scan_optional_equals();
  44.         scan_file_name();
  45.         open_name(tail) = cur_name;
  46.         open_area(tail) = cur_area;
  47.         open_ext(tail) = cur_ext;
  48.         break;
  49.     
  50.     case WRITE_NODE:
  51.         k = cur_cs;
  52.         new_write(WRITE_NODE_SIZE);
  53.         cur_cs = k;
  54.         scan_toks(FALSE, FALSE);
  55.         write_tokens(tail) = def_ref;
  56.         break;
  57.     
  58.     case CLOSE_NODE:
  59.         new_write(WRITE_NODE_SIZE);
  60.         write_tokens(tail) = NULL;
  61.         break;
  62.     
  63.     case SPECIAL_NODE:
  64.         new_whatsit(SPECIAL_NODE, WRITE_NODE_SIZE);
  65.         cur_cs = k;
  66.         scan_toks(FALSE, TRUE);
  67.         write_tokens(tail) = def_ref;
  68.         break;
  69.  
  70.     case IMMEDIATE_CODE:
  71.         get_x_token();
  72.         if (cur_cmd == EXTENSION && cur_chr <= CLOSE_NODE) {
  73.             p = tail;
  74.             do_extension();
  75.             out_whatsit(tail);
  76.             flush_node_list(tail);
  77.             tail = p;
  78.             link(p) = NULL;
  79.         } else back_input();
  80.         break;
  81.  
  82.     default:
  83.         confusion("ext1");
  84.         break;
  85.     }
  86. }
  87.  
  88. new_whatsit (s, w)
  89.     int     s;
  90.     int     w;
  91. {
  92.     ptr     p;
  93.  
  94.     p = get_node(w);
  95.     type(p) = WHATSIT_NODE;
  96.     subtype(p) = s;
  97.     link(tail) = p;
  98.     tail = p;
  99. }
  100.  
  101. show_whatsit (p)
  102.     ptr     p;
  103.     switch (subtype(p)) 
  104.     { 
  105.     case OPEN_NODE: 
  106.         print_write("openout", p);
  107.         print_char('='); 
  108.         print_file_name(open_name(p), open_area(p), open_ext(p)); 
  109.         break; 
  110.      
  111.     case WRITE_NODE: 
  112.         print_write("write", p); 
  113.         print_mark(write_tokens(p)); 
  114.         break; 
  115.      
  116.     case CLOSE_NODE: 
  117.         print_write("closeout", p); 
  118.         break; 
  119.     
  120.     case SPECIAL_NODE: 
  121.         print_esc("special"); 
  122.         print_mark(write_tokens(p)); 
  123.         break; 
  124.      
  125.     default: 
  126.         print("whatsit?"); 
  127.         break;
  128.     } 
  129.  
  130. ptr
  131. copy_whatsit (p)
  132.     ptr     p;
  133.     ptr     q;
  134.  
  135.     switch (subtype(p)) 
  136.     { 
  137.     case OPEN_NODE: 
  138.         q = get_node(OPEN_NODE_SIZE); 
  139.         mem[q + 2] = mem[p + 2];
  140.         mem[q + 1] = mem[p + 1];
  141.         break; 
  142.      
  143.     case WRITE_NODE: 
  144.     case SPECIAL_NODE:
  145.         q = get_node(WRITE_NODE_SIZE); 
  146.         add_token_ref(write_tokens(p)); 
  147.         mem[q + 1] = mem[p + 1];
  148.         break; 
  149.      
  150.     case CLOSE_NODE: 
  151.         q = get_node(WRITE_NODE_SIZE); 
  152.         mem[q + 1] = mem[p + 1];
  153.         break; 
  154.  
  155.     default:
  156.         confusion("ext2");
  157.         break;
  158.     }
  159.     return q;
  160. }
  161.             
  162. free_whatsit (p)
  163.     ptr     p;
  164.     switch (subtype(p)) 
  165.     { 
  166.     case OPEN_NODE: 
  167.         free_node(p, OPEN_NODE_SIZE); 
  168.         break; 
  169.      
  170.     case WRITE_NODE: 
  171.     case SPECIAL_NODE:
  172.         delete_token_ref(write_tokens(p)); 
  173.         free_node(p, WRITE_NODE_SIZE); 
  174.         break; 
  175.      
  176.     case CLOSE_NODE: 
  177.         free_node(p, WRITE_NODE_SIZE); 
  178.         break; 
  179.     
  180.     default:
  181.         confusion("ext3");
  182.         break;
  183.     } 
  184. }
  185.  
  186. out_whatsit (p)
  187.     ptr     p;
  188. {
  189.     short   j;
  190.  
  191.     switch (subtype(p))
  192.     {
  193.     case OPEN_NODE:
  194.     case WRITE_NODE:
  195.     case CLOSE_NODE:
  196.         if (!doing_leaders) {
  197.             j = write_stream(p);
  198.             if (subtype(p) == WRITE_NODE)
  199.                 out_write(p);
  200.             else {
  201.                 if (write_open[j])
  202.                     a_close(write_file[j]);
  203.                 if (subtype(p) == CLOSE_NODE)
  204.                     write_open[j] = FALSE;
  205.                 else {
  206.                     cur_name = open_name(p);
  207.                     cur_area = open_area(p);
  208.                     cur_ext = open_ext(p);
  209.                     if (cur_ext == null_str)
  210.                         cur_ext = str_tex;
  211.                     if (cur_area == null_str)
  212.                         cur_area = job_area;
  213.                     pack_cur_name();
  214.                     if ((write_file[j] = a_open_out()) == NULL) {
  215.                         cur_area = null_str;
  216.                         pack_cur_name();
  217.                         while ((write_file[j] = a_open_out()) == NULL)
  218.                             prompt_file_name("output file name", str_tex);
  219.                     }
  220.                     write_open[j] = TRUE;
  221.                 }
  222.             }
  223.         }
  224.         break;
  225.  
  226.     case SPECIAL_NODE:
  227.         out_special(p);
  228.         break;
  229.     
  230.     default:
  231.         confusion("ext4");
  232.         break;
  233.     }
  234. }
  235.  
  236. new_write (w)
  237.     int     w;
  238. {
  239.     ptr     p;
  240.  
  241.     new_whatsit(cur_chr, w);
  242.     if (w != WRITE_NODE_SIZE)
  243.         scan_four_bit_int();
  244.     else {
  245.         scan_int(); 
  246.         if (cur_val < 0)
  247.             cur_val = 17;
  248.         else if (cur_val > 15)
  249.             cur_val = 16;
  250.     }
  251.     write_stream(tail) = cur_val;
  252. }
  253.  
  254. print_write (s, p)
  255.     chrs    s;
  256.     ptr     p;
  257. {
  258.     print_esc(s);
  259.     if (write_stream(p) < 16)
  260.         print_int(write_stream(p));
  261.     else if (write_stream(p) == 16)
  262.         print_char('*');
  263.     else print_char('-');
  264. }
  265.  
  266. out_write (p)
  267.     ptr     p;
  268. {
  269.     int     j;
  270.     ptr     q;
  271.     ptr     r;
  272.     int     old_mode;
  273.     int     old_setting;
  274.  
  275.     q = new_token();
  276.     token(q) = RIGHT_BRACE_TOKEN + '}';
  277.     r = new_token();
  278.     token_link(q) = r;
  279.     token(r) = END_WRITE_TOKEN;
  280.     ins_list(q);
  281.     begin_token_list(write_tokens(p), WRITE_TEXT);
  282.     q = new_token();
  283.     token(q) = LEFT_BRACE_TOKEN + '{';
  284.     ins_list(q);
  285.     old_mode = mode;
  286.     mode = 0;
  287.     cur_cs = write_loc;
  288.     scan_toks(FALSE, TRUE);
  289.     get_token();
  290.     if (cur_tok != END_WRITE_TOKEN) {
  291.         print_err("Unbalanced write command");
  292.         help_unbal_write();
  293.         error();
  294.         do get_token();
  295.         while (cur_tok != END_WRITE_TOKEN);
  296.     }
  297.     mode = old_mode;
  298.     end_token_list();
  299.     old_setting = selector;
  300.     j = write_stream(p);
  301.     if (write_open[j])
  302.         selector = j;
  303.     else {
  304.         if (j == 17 && selector == TERM_AND_LOG)
  305.             selector = LOG_ONLY;
  306.         print_nl("");
  307.     }
  308.     show_token_list(token_link(def_ref), NULL, 10000000);
  309.     print_ln();
  310.     flush_list(def_ref);
  311.     selector = old_setting;
  312. }
  313.  
  314. out_special (p)
  315.     ptr     p;
  316. {
  317.     int     old_setting;
  318.     int     k;
  319.  
  320.     synch_h();
  321.     synch_v();
  322.     old_setting = selector;
  323.     selector = NEW_STRING;
  324.     show_token_list(token_link(write_tokens(p)),NULL,(val)POOL_SIZE-pool_ptr);
  325.     selector = old_setting;
  326.     str_room(1);
  327.     if (cur_length() < 256) {
  328.         dvi_out(XXX1);
  329.         dvi_out(cur_length());
  330.     } else {
  331.         dvi_out(XXX4);
  332.         dvi_four(cur_length());
  333.     }
  334.     for (k = str_start[str_ptr]; k < pool_ptr; incr(k))
  335.         dvi_out(str_pool[k]);
  336.     pool_ptr = str_start[str_ptr];
  337. }
  338.  
  339. /*
  340.  *  Help text
  341.  */
  342.  
  343. help_unbal_write ()
  344. {
  345.     help2("On this page there's a \\write with fewer real {'s than }'s.",
  346.     "I can't handle that very well; good luck.");
  347. }
  348.