decode.c revision 22997
150565Sphk/*- 250565Sphk * Copyright (c) 1994 S�ren Schmidt 350565Sphk * All rights reserved. 450565Sphk * 550565Sphk * Redistribution and use in source and binary forms, with or without 650565Sphk * modification, are permitted provided that the following conditions 750565Sphk * are met: 850565Sphk * 1. Redistributions of source code must retain the above copyright 950565Sphk * notice, this list of conditions and the following disclaimer, 1050565Sphk * in this position and unchanged. 1150565Sphk * 2. Redistributions in binary form must reproduce the above copyright 1250565Sphk * notice, this list of conditions and the following disclaimer in the 1350565Sphk * documentation and/or other materials provided with the distribution. 1450565Sphk * 3. The name of the author may not be used to endorse or promote products 1550565Sphk * derived from this software withough specific prior written permission 1651111Sjulian * 1750565Sphk * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1850565Sphk * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1950565Sphk * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2050565Sphk * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2150728Sphk * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2250565Sphk * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2350565Sphk * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2450565Sphk * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2550565Sphk * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2650565Sphk * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2750565Sphk * 2850565Sphk * $Id$ 2950565Sphk */ 3050565Sphk 3150565Sphk#include <stdio.h> 3251215Sphk 3350565Sphkint decode(FILE *fd, char *buffer) 3450565Sphk{ 3550565Sphk int n, pos = 0; 3651198Sphk char *p; 3751198Sphk char temp[128]; 3850565Sphk 3951198Sphk#define DEC(c) (((c) - ' ') & 0x3f) 4051215Sphk 4151215Sphk do { 4251215Sphk if (!fgets(temp, sizeof(temp), fd)) 4351215Sphk return(0); 4451215Sphk } while (strncmp(temp, "begin ", 6)); 4551215Sphk sscanf(temp, "begin %o %s", &n, temp); 4651215Sphk for (;;) { 4750565Sphk if (!fgets(p = temp, sizeof(temp), fd)) 4850565Sphk return(0); 4953437Sjkh if ((n = DEC(*p)) <= 0) 5053437Sjkh break; 5151243Sphk for (++p; n > 0; p += 4, n -= 3) 5251198Sphk if (n >= 3) { 5350565Sphk buffer[pos++] = DEC(p[0])<<2 | DEC(p[1])>>4; 5450565Sphk buffer[pos++] = DEC(p[1])<<4 | DEC(p[2])>>2; 5550565Sphk buffer[pos++] = DEC(p[2])<<6 | DEC(p[3]); 5652917Sphk } 5751215Sphk else { 5850565Sphk if (n >= 1) { 5950565Sphk buffer[pos++] = 6050565Sphk DEC(p[0])<<2 | DEC(p[1])>>4; 6150728Sphk } 6250728Sphk if (n >= 2) { 6350728Sphk buffer[pos++] = 6450728Sphk DEC(p[1])<<4 | DEC(p[2])>>2; 6550728Sphk } 6650728Sphk if (n >= 3) { 6750728Sphk buffer[pos++] = 6850728Sphk DEC(p[2])<<6 | DEC(p[3]); 6950728Sphk } 7050728Sphk } 7150728Sphk } 7250728Sphk if (!fgets(temp, sizeof(temp), fd) || strcmp(temp, "end\n")) 7350728Sphk return(0); 7450728Sphk return(pos); 7550728Sphk} 7650728Sphk