Annotation of 43BSD/contrib/dipress/src/bin/texttoip/texttoip.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *  Interpress utility
                      3:  *
                      4:  *  Written for Xerox Corporation by William LeFebvre
                      5:  *
                      6:  *  6-June-1984
                      7:  *
                      8:  * Copyright (c) 1984, 1985 Xerox Corp.
                      9:  *
                     10:  * HISTORY
                     11:  * 13-Jan-86  lee at Xerox, WRC
                     12:  *     Changed on strcmpn to strncmp.
                     13:  *
                     14:  * 01-Dec-85  lee at Xerox, WRC
                     15:  *     Linted.
                     16:  *
                     17:  *
                     18:  * 8-apr-85  ed flint  add conditional compilation for vax11-c (vms)
                     19:  *                             add error condition for sbrk failure
                     20:  *
                     21:  * 30-aug-85  ed flint eliminate compiler warning on check of sbreak return
                     22:  */
                     23: 
                     24: /*
                     25:  *  texttoip - convert a textual representation of an interpress file (such as
                     26:  *            produced by iptotext) to an encoded interpress format.
                     27:  */
                     28: 
                     29: #ifdef vax11c
                     30: # include stdio
                     31: # include "iptokens.h"
                     32: # include "texttoken.h"
                     33: # include "literal.h"
                     34: #else
                     35: # include <stdio.h>
                     36: # include <sys/file.h>
                     37: # include <sys/types.h>
                     38: # include "iptokens.h"
                     39: # include "texttoken.h"
                     40: # include "literal.h"
                     41: #endif
                     42: 
                     43: long yylval_long;
                     44: char *yylval_charP;
                     45: 
                     46: int line_number;
                     47: int ipress_file;
                     48: int radix = 10;
                     49: char *filename;
                     50: char *outputname;
                     51: extern FILE *yyin;
                     52: 
                     53: main(argc, argv)
                     54: 
                     55: int argc;
                     56: char *argv[];
                     57: 
                     58: {
                     59:     int token;
                     60:     long longVal0;
                     61:     int arg;
                     62:     int pushed_token = 0;
                     63:     char first_file = 1;
                     64: 
                     65:     /* look for an output option */
                     66:     if (argc > 1 && strncmp(argv[1], "-o", 2) == 0)
                     67:     {
                     68:        /* it's there -- get the file name */
                     69:        if (strlen(argv[1]) > 2)
                     70:        {
                     71:            outputname = &(argv[1][2]);
                     72:            argc--;
                     73:            argv++;
                     74:        }
                     75:        else if (argc > 2)
                     76:        {
                     77:            outputname = argv[2];
                     78:            argc -= 2;
                     79:            argv += 2;
                     80:        }
                     81:        else
                     82:        {
                     83:            /* "-o" with no file name -- strangeness, so give up */
                     84:            exit(1);
                     85:        }
                     86:     }
                     87:     else
                     88:     {
                     89:        /* default output -- use stdout if it is NOT a terminal */
                     90:        if (isatty(1))
                     91:        {
                     92:            /* use default filename */
                     93:            outputname = "intertext.ip";
                     94:        }
                     95:        else
                     96:        {
                     97:            /* use standard output */
                     98:            outputname = NULL;
                     99:            ipress_file = 1;
                    100:        }
                    101:     }
                    102: 
                    103:     /* open the output file */
                    104: #ifdef vax11c
                    105:     if (outputname != NULL &&
                    106:        (ipress_file = creat(outputname,0,"rfm=udf")) == -1)
                    107: #else
                    108:     if (outputname != NULL &&
                    109:        (ipress_file = open(outputname, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1)
                    110: #endif
                    111:     {
                    112:        perror(outputname);
                    113:        exit(1);
                    114:     }
                    115: 
                    116:     /* main loop */
                    117:     for (arg = 1; arg < argc; arg++)
                    118:     {
                    119:        /* open next file for reading */
                    120:        if ((yyin = fopen(argv[arg], "r")) == NULL)
                    121:        {
                    122:            perror(argv[arg]);
                    123:            continue;
                    124:        }
                    125: 
                    126:        /* set file dependent stuff */
                    127:        filename = argv[arg];
                    128:        line_number = 1;
                    129: 
                    130:        /* get header */
                    131:        if (first_file)
                    132:        {
                    133:            if ((token = yylex()) == T_header)
                    134:            {
                    135:                if (yylex() != T_string)
                    136:                {
                    137:                    terror("Header was not a string, using standard header");
                    138:                    ip_select(ipress_file);
                    139:                }
                    140:                else
                    141:                {
                    142:                    ip_raw_select(ipress_file);
                    143:                    append_bytes(strlen(yylval_charP),
                    144:                                (unsigned char *) yylval_charP);
                    145:                }
                    146:            }
                    147:            else
                    148:            {
                    149:                terror("No header for file, using standard header");
                    150:                ip_select(ipress_file);
                    151:                pushed_token = token;
                    152:            }
                    153:            first_file = 0;
                    154: 
                    155:            /* gobble the newline */
                    156:            if (yylex() != T_newline)
                    157:            {
                    158:                terror("newline expected");
                    159:            }
                    160:        }
                    161:        else
                    162:        {
                    163:            if ((token = yylex()) == T_header)
                    164:            {
                    165:                /* gobble stuff */
                    166:                (void) yylex();  (void) yylex();
                    167:            }
                    168:            else
                    169:            {
                    170:                pushed_token = token;
                    171:            }
                    172:        }
                    173: 
                    174:        while (pushed_token == 0 ?
                    175:                (token = yylex()) != 0 :
                    176:                (token = pushed_token, pushed_token = 0, 1))
                    177:        {
                    178:            switch(token)
                    179:            {
                    180:                case T_header:
                    181:                    terror("Stray header");
                    182:                    break;
                    183:     
                    184:                case T_seq_comment:
                    185:                    if (yylex() != T_string)
                    186:                    {
                    187:                        terror("Comment was not a string");
                    188:                    }
                    189:                    else
                    190:                    {
                    191:                        AppendComment(yylval_charP);
                    192:                    }
                    193:                    break;
                    194:     
                    195:                case T_seq_identifier:
                    196:                    if (yylex() != T_identifier)
                    197:                    {
                    198:                        terror("Identifier is invalid");
                    199:                    }
                    200:                    else
                    201:                    {
                    202:                        AppendIdentifier(yylval_charP);
                    203:                    }
                    204:                    break;
                    205:     
                    206:                case T_seq_insert_file:
                    207:                    if (yylex() != T_string)
                    208:                    {
                    209:                        terror("Insert file is not a string");
                    210:                    }
                    211:                    else
                    212:                    {
                    213:                        AppendInsertFile(yylval_charP);
                    214:                    }
                    215:                    break;
                    216:     
                    217:                case T_seq_integer:
                    218:                    if (yylex() != T_number)
                    219:                    {
                    220:                        terror("Integer is invalid");
                    221:                    }
                    222:                    else
                    223:                    {
                    224:                        append_integer_sequence(yylval_long);
                    225:                    }
                    226:                    break;
                    227:     
                    228:                case T_seq_rational:
                    229:                    if (yylex() != T_number)
                    230:                    {
                    231:                        terror("Rational numerator is invalid");
                    232:                        break;
                    233:                    }
                    234:                    longVal0 = yylval_long;
                    235:                    if (yylex() != T_character || yylval_long != '/')
                    236:                    {
                    237:                        terror("Rational separator invalid");
                    238:                        break;
                    239:                    }
                    240:                    if (yylex() != T_number)
                    241:                    {
                    242:                        terror("Rational denominator is invalid");
                    243:                        break;
                    244:                    }
                    245: 
                    246:                    AppendRational(longVal0, (long) yylval_long);
                    247:                    break;
                    248:     
                    249:                case T_seq_string:
                    250:                    if (yylex() != T_string)
                    251:                    {
                    252:                        terror("String is invalid");
                    253:                    }
                    254:                    else
                    255:                    {
                    256:                        AppendString(yylval_charP);
                    257:                    }
                    258:                    break;
                    259: 
                    260:                /* Pixel vector sequences */
                    261:                case T_seq_apv:
                    262:                    get_pixel_vector(sequenceAdaptivePixelVector);
                    263:                    break;
                    264: 
                    265:                case T_seq_cpv:
                    266:                    get_pixel_vector(sequenceCompressedPixelVector);
                    267:                    break;
                    268: 
                    269:                case T_seq_ppv:
                    270:                    get_pixel_vector(sequencePackedPixelVector);
                    271:                    break;
                    272: 
                    273:                case T_number:
                    274:                    AppendInteger(yylval_long);
                    275:                    break;
                    276:     
                    277:                case T_operator:
                    278:                    AppendOp((int) yylval_long);
                    279:                    break;
                    280:     
                    281:                case T_newline:
                    282:                    line_number++;
                    283:                    break;
                    284:     
                    285:                case T_string:
                    286:                    terror("Stray string");
                    287:                    break;
                    288:     
                    289:                case T_identifier:
                    290:                    terror("Stray string");
                    291:                    break;
                    292:     
                    293:                case T_character:
                    294:                    terror("Stray character");
                    295:                    break;
                    296:            }
                    297:        }
                    298:     }
                    299:     ip_close();
                    300: }
                    301: 
                    302: char *sbrk();
                    303: 
                    304: get_pixel_vector(type)
                    305: 
                    306: int type;
                    307: 
                    308: {
                    309:     register int len = 0;
                    310:     int token;
                    311:     unsigned char *buffer = NULL;
                    312:     register unsigned char *ptr;
                    313: 
                    314:     if (yylex() != T_character || yylval_long != '[')
                    315:     {
                    316:        terror("Bad pixel vector, expected '['");
                    317:        return;
                    318:     }
                    319:     radix = 16;
                    320: 
                    321:     /* allocate space to hold the data */
                    322:     if (buffer == NULL)
                    323:     {
                    324:        
                    325:        buffer = (unsigned char *) sbrk(300000); /*  too large for PDP-11's */
                    326: 
                    327:        if ( buffer == (unsigned char *)-1 )
                    328:        {
                    329:            fprintf(stderr,"\ncannot allocate room for pixel array\n");
                    330:            exit(1);
                    331:        }
                    332:     }
                    333: 
                    334:     ptr = buffer;
                    335:     while ((token = yylex()) != T_character)
                    336:     {
                    337:        if (token != T_newline)
                    338:        {
                    339:            *ptr++ = (unsigned char) (yylval_long >> 8);
                    340:            *ptr++ = (unsigned char) yylval_long;
                    341:            len += 2;
                    342:        }
                    343:     }
                    344:     (void) yylex();    /* gobble trailing newline */
                    345: 
                    346:     append_Sequence(type, len, buffer);
                    347:     radix = 10;
                    348: }
                    349: 
                    350: terror(string)
                    351: 
                    352: char *string;
                    353: 
                    354: {
                    355:     fprintf(stderr, "\"%s\", line %d: %s\n", filename, line_number, string);
                    356: }
                    357: #ifdef vax11c
                    358: /*
                    359:  *  this is needed for the parsing software produced by lex
                    360:  */
                    361: 
                    362: yywrap()
                    363: {
                    364:     return(1);
                    365: }
                    366: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.