1 /*- 2 * Copyright (c) 1994 S�ren Schmidt 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software withough specific prior written permission 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 * 27 * $Id: decode.c,v 1.1 1994/05/20 12:20:37 sos Exp $ 28 */ 29 30 #include <stdio.h> 31 32 int decode(FILE *fd, char *buffer) 33 { 34 int n, pos = 0; 35 char *p; 36 char temp[128]; 37 38 #define DEC(c) (((c) - ' ') & 0x3f) 39 40 do { 41 if (!fgets(temp, sizeof(temp), fd)) 42 return(0); 43 } while (strncmp(temp, "begin ", 6)); 44 sscanf(temp, "begin %o %s", &n, temp); 45 for (;;) { 46 if (!fgets(p = temp, sizeof(temp), fd)) 47 return(0); 48 if ((n = DEC(*p)) <= 0) 49 break; 50 for (++p; n > 0; p += 4, n -= 3) 51 if (n >= 3) { 52 buffer[pos++] = DEC(p[0])<<2 | DEC(p[1])>>4; 53 buffer[pos++] = DEC(p[1])<<4 | DEC(p[2])>>2; 54 buffer[pos++] = DEC(p[2])<<6 | DEC(p[3]); 55 } 56 else { 57 if (n >= 1) { 58 buffer[pos++] = 59 DEC(p[0])<<2 | DEC(p[1])>>4; 60 } 61 if (n >= 2) { 62 buffer[pos++] = 63 DEC(p[1])<<4 | DEC(p[2])>>2; 64 } 65 if (n >= 3) { 66 buffer[pos++] = 67 DEC(p[2])<<6 | DEC(p[3]); 68 } 69 } 70 } 71 if (!fgets(temp, sizeof(temp), fd) || strcmp(temp, "end\n")) 72 return(0); 73 return(pos); 74 } 75