home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum7.lzh / C / CHARDEF / chardef.lex < prev    next >
Text File  |  1988-10-04  |  3KB  |  211 lines

  1. %{
  2. /*  chardef    ein Program um den freidefinierbaren Zeichensatz eine VT220-kompatiblen Terminals zu definieren */
  3. /*  Uwe Simon            25.9.88                                                                                   */
  4. /*                                                                                                               */
  5. #include <ctype.h>
  6.  
  7. int aktline = -1;  
  8. int aktchar = -1;  /* noch kein Zeichen aktiviert */
  9. int erase = 1;     /* kein loeschen der alten Zeichen */
  10. int line_nr=1;     /* aktuelle Zeilennummer */
  11. int    charset=0;     /* Zeichensatz fuer die definition */
  12.  
  13. int    character[94][14];
  14. int is_def[95];
  15. char    c_set = '<';     /* default: der Supplemental-charset wird ueberschrieben */
  16.  
  17. set_charset(s)
  18. char    *s;
  19. {
  20.     c_set = s[7];
  21. }
  22.  
  23. clear_charset()
  24. {
  25.     erase=0;
  26. }
  27.  
  28.  
  29. char_number(s)
  30. char *s;
  31. {
  32.     int h;
  33.     
  34.     h=atoi(s);
  35.     if((h<33) || (h>126))  /* falsche Nummer */
  36.     {
  37.         aktchar = -1;
  38.         aktline = -1;
  39.         in_line();
  40.         fprintf(stderr,"Illegal Characternumber\n");
  41.         return;        
  42.     }
  43.     aktchar = h-33;
  44.     is_def[aktchar] = 1;
  45.     aktline = 0;
  46. }
  47.  
  48. build_char(n)
  49. int    n;
  50. {
  51.     int i, j, k, mask;
  52.     char s[20];
  53.     
  54.     for(i=0;i<15;i++) s[i]='\0';
  55.  
  56.     for(i=0; i<6; i++) character[n][i] = character[n][i+6] | (character[n][i]<<7);
  57.  
  58.     mask = 0x01;
  59.     for(i=0;i<6;i++)
  60.     {
  61.         k=0;
  62.         for(j=0x2000; j; j=j>>1)
  63.         {
  64.             if(character[n][i] & j)
  65.                 s[k] |= mask;
  66.                 
  67.             k++;
  68.         }
  69.         
  70.         mask = mask <<1;
  71.     }    
  72.     
  73.     for(i=0;i<14;i++)
  74.     {
  75.         s[i]+= 0x3f;
  76.         if(i==7)
  77.             printf("/");
  78.             
  79.         printf("%c",s[i]);
  80.     }
  81.     
  82.     if(is_def[n+1])
  83.     {
  84.         printf(";");
  85.         return(0);
  86.     }
  87.     else
  88.         return(1);
  89. }
  90.  
  91. send_charset()
  92. {
  93.     int i,j;
  94.     int first;
  95.     
  96.     first=1;
  97.     
  98.     for(i=0;i<94;i++)
  99.         if(is_def[i])
  100.         {
  101.             if(first)
  102.             {
  103.                 printf("%cP1;%d;%d{%c",0x1b,i+1,erase,c_set);
  104.                 erase=1;
  105.             }
  106.                 
  107.             first = build_char(i);
  108.             
  109.             if(first)        
  110.                 printf("%c\\",0x1b);
  111.         }
  112.  
  113. }
  114.  
  115.  
  116. build_line(s)
  117. char    *s;
  118. {
  119.     int h;
  120.     
  121.     if((aktchar < 0) || (aktline < 0))   /* keine Zeichennummer gewesen */
  122.     {
  123.         in_line();
  124.         fprintf(stderr, "no Characternumber spezified\n");
  125.     }
  126.     else
  127.         if(aktline >10)   /* keine Zeichennummer gewesen */
  128.         {
  129.             in_line();
  130.             fprintf(stderr, "Only 10 lines per character\n");
  131.         }
  132.         else
  133.         {    
  134.             h=0;            
  135.             for(; *s; s++)
  136.             {
  137.                 h = h<<1;
  138.                 if(*s == '*')
  139.                     h++;
  140.             }
  141.  
  142.             character[aktchar][aktline++] = h & 0xff;
  143.         }
  144. }
  145.  
  146.  
  147. in_line()
  148. {
  149.     fprintf(stderr,"Line %d:",line_nr);
  150. }
  151.  
  152.  
  153. usage()
  154. {
  155.     fprintf(stderr,"Syntax: defchar [<path>]\n");
  156.     fprintf(stderr,"Function:defines a new Charset for VT220 Terminals\n");
  157.     fprintf(stderr,"Options: none\n");
  158.     exit(0);
  159. }
  160.  
  161.  
  162. yywrap()
  163. {
  164.     return(feof(stdin));
  165. }
  166.  
  167. main(argc, argv)
  168. int argc;
  169. char *argv[];
  170. {
  171.     int h;
  172.     int line=1;
  173.     
  174.     if(argc > 1)
  175.     {
  176.         if(strcmp(argv[1], "-?") == 0)
  177.             usage();
  178.             
  179.         if(freopen(argv[1],"r", stdin) == NULL) 
  180.         {
  181.             fprintf(stderr,"can't open %s\n", argv[1]);
  182.             exit(1);
  183.         }
  184.     }
  185.     cleareof(stdin);
  186.     
  187.     while(h=yylex())
  188.     {
  189.         switch(h)
  190.         {
  191.             default:
  192.                 in_line(line);
  193.                 printf("Syntax-Error\n");
  194.                 break;
  195.         }
  196.         line++;
  197.     }
  198. }
  199. %}
  200.  
  201. %%
  202. #[ -~]*$     ;
  203. "charset"[0-~]  set_charset(yytext);
  204. "clear"        clear_charset();
  205. [ ]+        ;
  206. [0-9]+:        char_number(yytext);
  207. [
  208. ]             line_nr++;
  209. [.*]+        build_line(yytext);
  210. "end"        send_charset();
  211.