Annotation of researchv10no/cmd/bcp/CCITT.h, revision 1.1

1.1     ! root        1: /* Copyright (c) 1989, 1990 AT&T --- All Rights Reserved.              */
        !             2: /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T.                */
        !             3: /* The copyright notice does not imply actual or intended publication. */
        !             4: /* AUTHORS:                                            */
        !             5: /*     H. S. Baird - ATT-BL MH - first versions        */
        !             6: /* CCITT Group 3 FAX compression codes */
        !             7: #define EOLSTRING      "000000000001"
        !             8: #define EOLLENGTH      12              /* length of EOLSTRING */
        !             9: #define MAXCODELEN     24
        !            10: 
        !            11: #define DST_EOL -3
        !            12: 
        !            13: /* translate a runlength value <=2560 to an index into the Huffman code table;
        !            14:    if the index is >=64, then must repeat for (r%64) */
        !            15: #define rtoi(r) (((r)<64)? (r): 64+((r)/64))
        !            16: /* translate an index into the Huffman code table to a runlength value */
        !            17: #define itor(i) (((i)<64)? (i): (((i)>64)? (((i)-64)*64): DST_EOL))
        !            18: 
        !            19: /* Black run code table */
        !            20:   static char *codeblk[] = {
        !            21:        /* code                 run-length value */
        !            22:        "0000110111",           /* 0, */
        !            23:        "010",                  /* 1, */
        !            24:        "11",                   /* 2, */
        !            25:        "10",                   /* 3, */
        !            26:        "011",                  /* 4, */
        !            27:        "0011",                 /* 5, */
        !            28:        "0010",                 /* 6, */
        !            29:        "00011",                /* 7, */
        !            30:        "000101",               /* 8, */
        !            31:        "000100",               /* 9, */
        !            32:        "0000100",              /* 10, */
        !            33:        "0000101",              /* 11, */
        !            34:        "0000111",              /* 12, */
        !            35:        "00000100",             /* 13, */
        !            36:        "00000111",             /* 14, */
        !            37:        "000011000",            /* 15, */
        !            38:        "0000010111",           /* 16, */
        !            39:        "0000011000",           /* 17, */
        !            40:        "0000001000",           /* 18, */
        !            41:        "00001100111",          /* 19, */
        !            42:        "00001101000",          /* 20, */
        !            43:        "00001101100",          /* 21, */
        !            44:        "00000110111",          /* 22, */
        !            45:        "00000101000",          /* 23, */
        !            46:        "00000010111",          /* 24, */
        !            47:        "00000011000",          /* 25, */
        !            48:        "000011001010",         /* 26, */
        !            49:        "000011001011",         /* 27, */
        !            50:        "000011001100",         /* 28, */
        !            51:        "000011001101",         /* 29, */
        !            52:        "000001101000",         /* 30, */
        !            53:        "000001101001",         /* 31, */
        !            54:        "000001101010",         /* 32, */
        !            55:        "000001101011",         /* 33, */
        !            56:        "000011010010",         /* 34, */
        !            57:        "000011010011",         /* 35, */
        !            58:        "000011010100",         /* 36, */
        !            59:        "000011010101",         /* 37, */
        !            60:        "000011010110",         /* 38, */
        !            61:        "000011010111",         /* 39, */
        !            62:        "000001101100",         /* 40, */
        !            63:        "000001101101",         /* 41, */
        !            64:        "000011011010",         /* 42, */
        !            65:        "000011011011",         /* 43, */
        !            66:        "000001010100",         /* 44, */
        !            67:        "000001010101",         /* 45, */
        !            68:        "000001010110",         /* 46, */
        !            69:        "000001010111",         /* 47, */
        !            70:        "000001100100",         /* 48, */
        !            71:        "000001100101",         /* 49, */
        !            72:        "000001010010",         /* 50, */
        !            73:        "000001010011",         /* 51, */
        !            74:        "000000100100",         /* 52, */
        !            75:        "000000110111",         /* 53, */
        !            76:        "000000111000",         /* 54, */
        !            77:        "000000100111",         /* 55, */
        !            78:        "000000101000",         /* 56, */
        !            79:        "000001011000",         /* 57, */
        !            80:        "000001011001",         /* 58, */
        !            81:        "000000101011",         /* 59, */
        !            82:        "000000101100",         /* 60, */
        !            83:        "000001011010",         /* 61, */
        !            84:        "000001100110",         /* 62, */
        !            85:        "000001100111",         /* 63  */
        !            86:        EOLSTRING,              /* EOL */
        !            87:        "0000001111",           /* 64, */
        !            88:        "000011001000",         /* 128, */
        !            89:        "000011001001",         /* 192, */
        !            90:        "000001011011",         /* 256, */
        !            91:        "000000110011",         /* 320, */
        !            92:        "000000110100",         /* 384, */
        !            93:        "000000110101",         /* 448, */
        !            94:        "0000001101100",        /* 512, */
        !            95:        "0000001101101",        /* 576, */
        !            96:        "0000001001010",        /* 640, */
        !            97:        "0000001001011",        /* 704, */
        !            98:        "0000001001100",        /* 768, */
        !            99:        "0000001001101",        /* 832, */
        !           100:        "0000001110010",        /* 896, */
        !           101:        "0000001110011",        /* 960, */
        !           102:        "0000001110100",        /* 1024, */
        !           103:        "0000001110101",        /* 1088, */
        !           104:        "0000001110110",        /* 1152, */
        !           105:        "0000001110111",        /* 1216, */
        !           106:        "0000001010010",        /* 1280, */
        !           107:        "0000001010011",        /* 1344, */
        !           108:        "0000001010100",        /* 1408, */
        !           109:        "0000001010101",        /* 1472, */
        !           110:        "0000001011010",        /* 1536, */
        !           111:        "0000001011011",        /* 1600, */
        !           112:        "0000001100100",        /* 1664, */
        !           113:        "0000001100101",        /* 1728  */
        !           114:                                /* extended length: */
        !           115:        "00000001000",          /* 1792, */
        !           116:        "00000001100",          /* 1856, */
        !           117:        "00000001101",          /* 1920, */
        !           118:        "000000010010",         /* 1984, */
        !           119:        "000000010011",         /* 2048, */
        !           120:        "000000010100",         /* 2112, */
        !           121:        "000000010101",         /* 2176, */
        !           122:        "000000010110",         /* 2240, */
        !           123:        "000000010111",         /* 2304, */
        !           124:        "000000011100",         /* 2368, */
        !           125:        "000000011101",         /* 2432, */
        !           126:        "000000011110",         /* 2496, */
        !           127:        "000000011111",         /* 2560  */
        !           128:        NULL                    /* are there codes beyond 2560? */
        !           129:        };
        !           130: /* No. bits in the codes in the above table */
        !           131:   static short bitcblk[] = {
        !           132:        10,3,2,2,3,4,4,5,6,6,           /*  0 -  9 */
        !           133:        7,7,7,8,8,9,10,10,10,11,        /* 10 - 19 */
        !           134:        11,11,11,11,11,11,12,12,12,12,  /* 20 - 29 */
        !           135:        12,12,12,12,12,12,12,12,12,12,  /* 30 - 39 */
        !           136:        12,12,12,12,12,12,12,12,12,12,  /* 40 - 49 */
        !           137:        12,12,12,12,12,12,12,12,12,12,  /* 50 - 59 */
        !           138:        12,12,12,12,                    /* 60 - 63 */
        !           139:        12,                             /* EOL */
        !           140:        10,                             /* 64 */
        !           141:        12,12,12,12,12,12,              /* 128 - 448 */
        !           142:        13,13,13,13,13,13,13,13,13,     /* 512 - */
        !           143:        13,13,13,13,13,13,13,13,13,
        !           144:        13,13,                          /* - 1728 */
        !           145:        11,11,11,                       /* 1792 - 1920 */
        !           146:        12,12,12,12,12,12,12,12,12,12,  /* 1984 - 2560 */
        !           147:        /* for codes over 2560 */
        !           148:        14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
        !           149:        -1
        !           150:        };
        !           151: 
        !           152: /* White run code table */
        !           153:   static char *codewht[] = {
        !           154:        /* code                 run-length value */
        !           155:        "00110101",             /* 0, */
        !           156:        "000111",               /* 1, */
        !           157:        "0111",                 /* 2, */
        !           158:        "1000",                 /* 3, */
        !           159:        "1011",                 /* 4, */
        !           160:        "1100",                 /* 5, */
        !           161:        "1110",                 /* 6, */
        !           162:        "1111",                 /* 7, */
        !           163:        "10011",                /* 8, */
        !           164:        "10100",                /* 9, */
        !           165:        "00111",                /* 10, */
        !           166:        "01000",                /* 11, */
        !           167:        "001000",               /* 12, */
        !           168:        "000011",               /* 13, */
        !           169:        "110100",               /* 14, */
        !           170:        "110101",               /* 15, */
        !           171:        "101010",               /* 16, */
        !           172:        "101011",               /* 17, */
        !           173:        "0100111",              /* 18, */
        !           174:        "0001100",              /* 19, */
        !           175:        "0001000",              /* 20, */
        !           176:        "0010111",              /* 21, */
        !           177:        "0000011",              /* 22, */
        !           178:        "0000100",              /* 23, */
        !           179:        "0101000",              /* 24, */
        !           180:        "0101011",              /* 25, */
        !           181:        "0010011",              /* 26, */
        !           182:        "0100100",              /* 27, */
        !           183:        "0011000",              /* 28, */
        !           184:        "00000010",             /* 29, */
        !           185:        "00000011",             /* 30, */
        !           186:        "00011010",             /* 31, */
        !           187:        "00011011",             /* 32, */
        !           188:        "00010010",             /* 33, */
        !           189:        "00010011",             /* 34, */
        !           190:        "00010100",             /* 35, */
        !           191:        "00010101",             /* 36, */
        !           192:        "00010110",             /* 37, */
        !           193:        "00010111",             /* 38, */
        !           194:        "00101000",             /* 39, */
        !           195:        "00101001",             /* 40, */
        !           196:        "00101010",             /* 41, */
        !           197:        "00101011",             /* 42, */
        !           198:        "00101100",             /* 43, */
        !           199:        "00101101",             /* 44, */
        !           200:        "00000100",             /* 45, */
        !           201:        "00000101",             /* 46, */
        !           202:        "00001010",             /* 47, */
        !           203:        "00001011",             /* 48, */
        !           204:        "01010010",             /* 49, */
        !           205:        "01010011",             /* 50, */
        !           206:        "01010100",             /* 51, */
        !           207:        "01010101",             /* 52, */
        !           208:        "00100100",             /* 53, */
        !           209:        "00100101",             /* 54, */
        !           210:        "01011000",             /* 55, */
        !           211:        "01011001",             /* 56, */
        !           212:        "01011010",             /* 57, */
        !           213:        "01011011",             /* 58, */
        !           214:        "01001010",             /* 59, */
        !           215:        "01001011",             /* 60, */
        !           216:        "00110010",             /* 61, */
        !           217:        "00110011",             /* 62, */
        !           218:        "00110100",             /* 63  */
        !           219:        EOLSTRING,              /* EOL */
        !           220:        "11011",                /* 64, */
        !           221:        "10010",                /* 128, */
        !           222:        "010111",               /* 192, */
        !           223:        "0110111",              /* 256, */
        !           224:        "00110110",             /* 320, */
        !           225:        "00110111",             /* 384, */
        !           226:        "01100100",             /* 448, */
        !           227:        "01100101",             /* 512, */
        !           228:        "01101000",             /* 576, */
        !           229:        "01100111",             /* 640, */
        !           230:        "011001100",            /* 704, */
        !           231:        "011001101",            /* 768, */
        !           232:        "011010010",            /* 832, */
        !           233:        "011010011",            /* 896, */
        !           234:        "011010100",            /* 960, */
        !           235:        "011010101",            /* 1024, */
        !           236:        "011010110",            /* 1088, */
        !           237:        "011010111",            /* 1152, */
        !           238:        "011011000",            /* 1216, */
        !           239:        "011011001",            /* 1280, */
        !           240:        "011011010",            /* 1344, */
        !           241:        "011011011",            /* 1408, */
        !           242:        "010011000",            /* 1472, */
        !           243:        "010011001",            /* 1536, */
        !           244:        "010011010",            /* 1600, */
        !           245:        "011000",               /* 1664, */
        !           246:        "010011011",            /* 1728  */
        !           247:                                /* extended length: */
        !           248:        "00000001000",          /* 1792, */
        !           249:        "00000001100",          /* 1856, */
        !           250:        "00000001101",          /* 1920, */
        !           251:        "000000010010",         /* 1984, */
        !           252:        "000000010011",         /* 2048, */
        !           253:        "000000010100",         /* 2112, */
        !           254:        "000000010101",         /* 2176, */
        !           255:        "000000010110",         /* 2240, */
        !           256:        "000000010111",         /* 2304, */
        !           257:        "000000011100",         /* 2368, */
        !           258:        "000000011101",         /* 2432, */
        !           259:        "000000011110",         /* 2496, */
        !           260:        "000000011111",         /* 2560  */
        !           261:        NULL                    /* are there codes beyond 2560? */
        !           262:        };
        !           263: /* no. bits in the codes in the above table */
        !           264:   static short bitcwht[] = {
        !           265:        8,6,4,4,4,4,4,4,5,5,            /*  0 -  9 */
        !           266:        5,5,6,6,6,6,6,6,7,7,            /* 10 - 19 */
        !           267:        7,7,7,7,7,7,7,7,7,8,            /* 20 - 29 */
        !           268:        8,8,8,8,8,8,8,8,8,8,            /* 30 - 39 */
        !           269:        8,8,8,8,8,8,8,8,8,8,            /* 40 - 49 */
        !           270:        8,8,8,8,8,8,8,8,8,8,            /* 50 - 59 */
        !           271:        8,8,8,8,                        /* 60 - 63 */
        !           272:        12,                             /* EOL */
        !           273:        5,5,                            /* 64,128 */
        !           274:        6,                              /* 192 */
        !           275:        7,                              /* 256 */
        !           276:        8,8,8,8,8,8,                    /* 320 - 640 */
        !           277:        9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,  /* 704 - 1600 */
        !           278:        6,                              /* 1664 */
        !           279:        9,                              /* 1728 */
        !           280:        11,11,11,                       /* 1792,1856,1920 */
        !           281:        12,12,12,12,12,12,12,12,12,12,  /* 1984 - 2560 */
        !           282:        /* for codes over 2560 */
        !           283:        14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
        !           284:        -1
        !           285:        };
        !           286: 
        !           287: /* 2-D codes (indices into code2d[] table) */
        !           288: #define i2D_V0 0
        !           289: #define i2D_VR1 1
        !           290: #define i2D_VR2 2
        !           291: #define i2D_VR3 3
        !           292: #define i2D_VL1 4
        !           293: #define i2D_VL2 5
        !           294: #define i2D_VL3 6
        !           295: #define i2D_PASS 7
        !           296: #define i2D_HORIZ 8
        !           297: #define i2D_EOL 9
        !           298: 
        !           299:   static char *code2d[] = {
        !           300:        "1",                    /* V0 */
        !           301:        "011",                  /* VR1 */
        !           302:        "000011",               /* VR2 */
        !           303:        "0000011",              /* VR3 */
        !           304:        "010",                  /* VL1 */
        !           305:        "000010",               /* VL2 */
        !           306:        "0000010",              /* VL3 */
        !           307:        "0001",                 /* PASS */
        !           308:        "001",                  /* HORIZ */
        !           309:        EOLSTRING,              /* EOL */
        !           310:        NULL };
        !           311:   static short bitc2d[] = { 1,3,6,7,3,6,7,4,3,12 };
        !           312: 
        !           313: #define EOL0STRING     "0000000000010"
        !           314: #define EOL1STRING     "0000000000011"
        !           315: #define EOFB           "000000000001000000000001"
        !           316: 
        !           317:   static char *spare1d[] = {
        !           318:        "000000001",            /* 0, */
        !           319:        "0000000001",           /* 0, */
        !           320:        "00000000001",          /* 0  */
        !           321:        NULL };
        !           322:   static char *spare2d[] = {
        !           323:        "0000001",              /* 0, */
        !           324:        "00000001",             /* 0, */
        !           325:        "000000001",            /* 0, */
        !           326:        "0000000001",           /* 0, */
        !           327:        "00000000001",          /* 0  */
        !           328:        NULL };
        !           329: 
        !           330: /* State-transition table for decoding CCITT G3-1 */
        !           331: 
        !           332: /* bit colors; also, starting index in table of 1-D codes*/
        !           333: #define DST_color short
        !           334: #define DST_white 0
        !           335: #define DST_black 1
        !           336: 
        !           337: #define flip_color(c) ((c)? 0: 1)
        !           338: 
        !           339: #define DST_2d 2       /* starting index in table of 2-D codes */
        !           340: 
        !           341: #define DST_state short        /* state-id: index into DST_tbl.e[] */
        !           342: #define DST_state_NULL (-1)
        !           343: #define DST_state_ERROR (-2)
        !           344: 
        !           345: #define DST_action int
        !           346: #define DST_action_NULL (-1)
        !           347: #define DST_action_ERROR (-2)
        !           348: 
        !           349: /* transition in finite-state machine */
        !           350: typedef struct DST_transit {
        !           351:        DST_action a;   /* action to perform */
        !           352:        DST_state s;    /* next state */
        !           353:        } DST_transit;
        !           354: typedef struct DST_entry {
        !           355:        char p[MAXCODELEN+1];   /* code prefix so far (in ASCII) */
        !           356:        short l;                /* strlen(.p) */
        !           357:        short z;                /* no. of trailing "0"'s in .p */
        !           358:        DST_transit t[2];       /* two transitions: on 0 & 1 */
        !           359:        } DST_entry;
        !           360: typedef struct DST_table {
        !           361:        int mny;        /* no. entries so far */
        !           362:        DST_entry *e;   /* array in malloc space:
        !           363:                                e[DST_white] starts white 1-D codes;
        !           364:                                e[DST_black] starts black 1-D codes;
        !           365:                                e[DST_2d] starts 2-D codes */
        !           366:        } DST_table;
        !           367: typedef struct DST_context {
        !           368:        DST_color c;    /* current run-color */
        !           369:        int l;          /* length of current code in bits: 0..(len-1) */
        !           370:        DST_table *t;   /* table */
        !           371:        DST_state s;    /* current state */
        !           372:        DST_transit tr; /* current state/action */
        !           373:        } DST_context;
        !           374: 
        !           375: 
        !           376: DST_table *ccitt_table();
        !           377: RLE_Line *g31_to_rlel();
        !           378: int rlel_to_g31();
        !           379: RLE_Line *g32_to_rlel();
        !           380: int rlel_to_g32();
        !           381: RLE_Line *g4_to_rlel();
        !           382: int rlel_to_g4();

unix.superglobalmegacorp.com

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