17363955dSSøren Schmidt /*- 27363955dSSøren Schmidt * Copyright (c) 1994 S�ren Schmidt 37363955dSSøren Schmidt * All rights reserved. 47363955dSSøren Schmidt * 57363955dSSøren Schmidt * Redistribution and use in source and binary forms, with or without 67363955dSSøren Schmidt * modification, are permitted provided that the following conditions 77363955dSSøren Schmidt * are met: 87363955dSSøren Schmidt * 1. Redistributions of source code must retain the above copyright 9a926a37bSSøren Schmidt * notice, this list of conditions and the following disclaimer, 10a926a37bSSøren Schmidt * in this position and unchanged. 117363955dSSøren Schmidt * 2. Redistributions in binary form must reproduce the above copyright 127363955dSSøren Schmidt * notice, this list of conditions and the following disclaimer in the 137363955dSSøren Schmidt * documentation and/or other materials provided with the distribution. 147363955dSSøren Schmidt * 3. The name of the author may not be used to endorse or promote products 157363955dSSøren Schmidt * derived from this software withough specific prior written permission 167363955dSSøren Schmidt * 177363955dSSøren Schmidt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 187363955dSSøren Schmidt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 197363955dSSøren Schmidt * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 207363955dSSøren Schmidt * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 217363955dSSøren Schmidt * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 227363955dSSøren Schmidt * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237363955dSSøren Schmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 247363955dSSøren Schmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 257363955dSSøren Schmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 267363955dSSøren Schmidt * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277363955dSSøren Schmidt * 28a926a37bSSøren Schmidt * $Id: decode.c,v 1.1 1994/08/17 09:00:09 sos Exp $ 297363955dSSøren Schmidt */ 307363955dSSøren Schmidt 317363955dSSøren Schmidt #include <stdio.h> 327363955dSSøren Schmidt 337363955dSSøren Schmidt int decode(FILE *fd, char *buffer) 347363955dSSøren Schmidt { 357363955dSSøren Schmidt int n, pos = 0; 367363955dSSøren Schmidt char *p; 377363955dSSøren Schmidt char temp[128]; 387363955dSSøren Schmidt 397363955dSSøren Schmidt #define DEC(c) (((c) - ' ') & 0x3f) 407363955dSSøren Schmidt 417363955dSSøren Schmidt do { 427363955dSSøren Schmidt if (!fgets(temp, sizeof(temp), fd)) 437363955dSSøren Schmidt return(0); 447363955dSSøren Schmidt } while (strncmp(temp, "begin ", 6)); 457363955dSSøren Schmidt sscanf(temp, "begin %o %s", &n, temp); 467363955dSSøren Schmidt for (;;) { 477363955dSSøren Schmidt if (!fgets(p = temp, sizeof(temp), fd)) 487363955dSSøren Schmidt return(0); 497363955dSSøren Schmidt if ((n = DEC(*p)) <= 0) 507363955dSSøren Schmidt break; 517363955dSSøren Schmidt for (++p; n > 0; p += 4, n -= 3) 527363955dSSøren Schmidt if (n >= 3) { 537363955dSSøren Schmidt buffer[pos++] = DEC(p[0])<<2 | DEC(p[1])>>4; 547363955dSSøren Schmidt buffer[pos++] = DEC(p[1])<<4 | DEC(p[2])>>2; 557363955dSSøren Schmidt buffer[pos++] = DEC(p[2])<<6 | DEC(p[3]); 567363955dSSøren Schmidt } 577363955dSSøren Schmidt else { 587363955dSSøren Schmidt if (n >= 1) { 597363955dSSøren Schmidt buffer[pos++] = 607363955dSSøren Schmidt DEC(p[0])<<2 | DEC(p[1])>>4; 617363955dSSøren Schmidt } 627363955dSSøren Schmidt if (n >= 2) { 637363955dSSøren Schmidt buffer[pos++] = 647363955dSSøren Schmidt DEC(p[1])<<4 | DEC(p[2])>>2; 657363955dSSøren Schmidt } 667363955dSSøren Schmidt if (n >= 3) { 677363955dSSøren Schmidt buffer[pos++] = 687363955dSSøren Schmidt DEC(p[2])<<6 | DEC(p[3]); 697363955dSSøren Schmidt } 707363955dSSøren Schmidt } 717363955dSSøren Schmidt } 727363955dSSøren Schmidt if (!fgets(temp, sizeof(temp), fd) || strcmp(temp, "end\n")) 737363955dSSøren Schmidt return(0); 747363955dSSøren Schmidt return(pos); 757363955dSSøren Schmidt } 76