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

unix.superglobalmegacorp.com

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