Annotation of coherent/g/usr/bin/tic/read_entry.c, revision 1.1.1.1

1.1       root        1: /*********************************************************************
                      2: *                         COPYRIGHT NOTICE                           *
                      3: **********************************************************************
                      4: *        This software is copyright (C) 1982 by Pavel Curtis         *
                      5: *                                                                    *
                      6: *        Permission is granted to reproduce and distribute           *
                      7: *        this file by any means so long as no fee is charged         *
                      8: *        above a nominal handling fee and so long as this            *
                      9: *        notice is always included in the copies.                    *
                     10: *                                                                    *
                     11: *        Other rights are reserved except as explicitly granted      *
                     12: *        by written permission of the author.                        *
                     13: *                Pavel Curtis                                        *
                     14: *                Computer Science Dept.                              *
                     15: *                405 Upson Hall                                      *
                     16: *                Cornell University                                  *
                     17: *                Ithaca, NY 14853                                    *
                     18: *                                                                    *
                     19: *                Ph- (607) 256-4934                                  *
                     20: *                                                                    *
                     21: *                Pavel.Cornell@Udel-Relay   (ARPAnet)                *
                     22: *                decvax!cornell!pavel       (UUCPnet)                *
                     23: *********************************************************************/
                     24: 
                     25: /*
                     26:  *     read_entry.c -- Routine for reading in a compiled terminfo file
                     27:  *
                     28:  *  $Log:      read_entry.c,v $
                     29:  * Revision 1.1  92/03/13  10:45:52  bin
                     30:  * Initial revision
                     31:  * 
                     32:  * Revision 3.2  91/07/28  14:12:20  munk
                     33:  * Made the large arrays static
                     34:  *
                     35:  * Revision 3.1  84/12/13  11:21:14  john
                     36:  * Revisions by Mark Horton
                     37:  * 
                     38:  * Revision 2.1  82/10/25  14:49:55  pavel
                     39:  * Added Copyright Notice
                     40:  * 
                     41:  * Revision 2.0  82/10/24  15:18:22  pavel
                     42:  * Beta-one Test Release
                     43:  * 
                     44:  * Revision 1.3  82/08/23  22:31:15  pavel
                     45:  * The REAL Alpha-one Release Version
                     46:  * 
                     47:  * Revision 1.2  82/08/19  19:11:49  pavel
                     48:  * Alpha Test Release One
                     49:  * 
                     50:  * Revision 1.1  82/08/12  22:25:13  pavel
                     51:  * Initial revision
                     52:  * 
                     53:  *
                     54:  */
                     55: 
                     56: #ifndef COHERENT
                     57: static char RCSid[] =
                     58:        "$Header: /src386/usr/bin/tic/RCS/read_entry.c,v 1.1 92/03/13 10:45:52 bin Exp $";
                     59: #endif
                     60: 
                     61: #include <sys/types.h>
                     62: #include <sys/stat.h>
                     63: #include "term.h"
                     64: #include "object.h"
                     65: 
                     66: #define OFFSET_BUFSIZE 100
                     67: 
                     68: #define min(a, b)      ((a) > (b)  ?  (b)  :  (a))
                     69: 
                     70: /*
                     71:  *     int
                     72:  *     read_entry(filename, ptr)
                     73:  *
                     74:  *     Read the compiled terminfo entry in the given file into the
                     75:  *     structure pointed to by ptr, allocating space for the string
                     76:  *     table and placing its address in ptr->str_table.
                     77:  *
                     78:  */
                     79: 
                     80: #define swap(x)                (((x >> 8) & 0377) + 256 * (x & 0377))
                     81: 
                     82: static char    TermNames[128]; /* Buffer for terminal names for first term */
                     83: static char    StringTable[1024];      /* String table for first terminal  */
                     84: 
                     85: int
                     86: read_entry(filename, ptr)
                     87: char           *filename;
                     88: struct term    *ptr;
                     89: {
                     90:        int             fd;
                     91:        int             numread;
                     92:        int             num_strings;
                     93:        int             cur_string;
                     94:        char            *malloc();
                     95:        int             i;
                     96:        struct header   header;
                     97:        unsigned char   bytebuf[2];
                     98:        char            ch;
                     99:        static union
                    100:        {
                    101:            unsigned char    byte[2];
                    102:            short            number;
                    103:        }               offset_buf[OFFSET_BUFSIZE];
                    104: 
                    105:        fd = open(filename, 0);
                    106: 
                    107:        if (fd < 0)
                    108:            return(-1);
                    109: 
                    110:        read(fd, &header, sizeof(header));
                    111: 
                    112:        if (must_swap())
                    113:        {
                    114:            header.magic = swap(header.magic);
                    115:            header.name_size = swap(header.name_size);
                    116:            header.bool_count = swap(header.bool_count);
                    117:            header.num_count = swap(header.num_count);
                    118:            header.str_count = swap(header.str_count);
                    119:            header.str_size = swap(header.str_size);
                    120:        }
                    121: 
                    122:        if (header.magic != MAGIC)
                    123:        {
                    124:            close(fd);
                    125:            return(-1);
                    126:        }
                    127: 
                    128:        read(fd, TermNames, min(127, header.name_size));
                    129:        TermNames[127] = '\0';
                    130:        ptr->term_names = TermNames;
                    131:        if (header.name_size > 127)
                    132:            lseek(fd, (long) (header.name_size - 127), 1);
                    133: 
                    134:        read(fd, ptr->Booleans, min(BOOLCOUNT, header.bool_count));
                    135:        if (header.bool_count > BOOLCOUNT)
                    136:            lseek(fd, (long) (header.bool_count - BOOLCOUNT), 1);
                    137:        else
                    138:            for (i=header.bool_count; i < BOOLCOUNT; i++)
                    139:                ptr->Booleans[i] = 0;
                    140: 
                    141:        if ((header.name_size + header.bool_count) % 2 != 0)
                    142:            read(fd, &ch, 1);
                    143: 
                    144:        if (must_swap())
                    145:            read(fd, ptr->Numbers, min(NUMCOUNT, header.num_count * 2));
                    146:        else
                    147:        {
                    148:            for (i=0; i < min(header.num_count, NUMCOUNT); i++)
                    149:            {
                    150:                read(fd, bytebuf, 2);
                    151:                if (bytebuf[0] == 0377  &&  bytebuf[1] == 0377)
                    152:                    ptr->Numbers[i] = -1;
                    153:                else
                    154:                    ptr->Numbers[i] = bytebuf[0] + 256 * bytebuf[1];
                    155:            }
                    156:        }
                    157: 
                    158:        if (header.num_count > NUMCOUNT)
                    159:            lseek(fd, (long) (2 * (header.num_count - NUMCOUNT)), 1);
                    160:        else
                    161:            for (i=header.num_count; i < NUMCOUNT; i++)
                    162:                ptr->Numbers[i] = -1;
                    163: 
                    164:        if (cur_term)   /* cur_term is non-zero only if we've been called */
                    165:        {
                    166:            ptr->str_table = malloc(header.str_size);
                    167:            if (ptr->str_table == NULL)
                    168:            {
                    169:                close(fd);
                    170:                return (-1);
                    171:            }
                    172:        }
                    173:        else
                    174:            ptr->str_table = StringTable;
                    175: 
                    176:        num_strings = min(STRCOUNT, header.str_count);
                    177:        cur_string = 0;
                    178: 
                    179:        while (num_strings > 0)
                    180:        {
                    181:            numread = read(fd, offset_buf, 2*min(num_strings, OFFSET_BUFSIZE));
                    182:            if (numread <= 0)
                    183:            {
                    184:                close(fd);
                    185:                return(-1);
                    186:            }
                    187: 
                    188:            if (must_swap())
                    189:            {
                    190:                for (i = 0; i < numread / 2; i++)
                    191:                {
                    192:                    ptr->Strings[i + cur_string] =
                    193:                        (offset_buf[i].byte[0] == 0377
                    194:                                            &&  offset_buf[i].byte[1] == 0377)
                    195:                        ? 0
                    196:                        : ((offset_buf[i].byte[0] + 256*offset_buf[i].byte[1])
                    197:                                                              + ptr->str_table);
                    198:                }
                    199:            }
                    200:            else
                    201:            {
                    202:                for (i = 0; i < numread / 2; i++)
                    203:                {
                    204:                    ptr->Strings[i + cur_string] =
                    205:                        (offset_buf[i].number == -1)
                    206:                        ?
                    207:                            0
                    208:                        :
                    209:                            offset_buf[i].number + ptr->str_table;
                    210:                }
                    211:            }
                    212: 
                    213:            cur_string += numread / 2;
                    214:            num_strings -= numread / 2;
                    215:        }
                    216: 
                    217:        if (header.str_count > STRCOUNT)
                    218:            lseek(fd, (long) (2 * (header.str_count - STRCOUNT)), 1);
                    219:        else
                    220:            for (i=header.str_count; i < STRCOUNT; i++)
                    221:                ptr->Strings[i] = 0;
                    222: 
                    223:        numread = read(fd, ptr->str_table, header.str_size);
                    224:        close(fd);
                    225:        if (numread != header.str_size)
                    226:            return(-1);
                    227: 
                    228:        return(0);
                    229: }
                    230: 
                    231: 
                    232: 
                    233: /*
                    234:  *     int
                    235:  *     must_swap()
                    236:  *
                    237:  *     Test whether this machine will need byte-swapping
                    238:  *
                    239:  */
                    240: 
                    241: int
                    242: must_swap()
                    243: {
                    244:        union
                    245:        {
                    246:            short num;
                    247:            char  byte[2];
                    248:        }               test;
                    249: 
                    250:        test.num = 1;
                    251:        return(test.byte[1]);
                    252: }

unix.superglobalmegacorp.com

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