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