📄 uucodec.c
字号:
/*------------------------------------------------------------------------- * Filename: uucodec.c * Version: $Id: uucodec.c,v 1.3 2002/01/03 16:07:18 erikm Exp $ * Copyright: Copyright (C) 1999, Jan-Derk Bakker * Author: Jan-Derk Bakker <J.D.Bakker@its.tudelft.nl> * Description: uu{en|de}code functiuonality for uploading of kernels * and the like * Created at: Wed Aug 25 20:00:00 1999 * Modified by: Erik Mouw <J.A.K.Mouw@its.tudelft.nl> * Modified at: Tue Sep 28 23:25:15 1999 *-----------------------------------------------------------------------*//* * uucodec.c: uu{en|de}code functiuonality for uploading of kernels and * the like * * Copyright (C) 1999 Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */#ident "$Id: uucodec.c,v 1.3 2002/01/03 16:07:18 erikm Exp $"#ifdef HAVE_CONFIG_H# include <blob/config.h>#endif#include <blob/errno.h>#include <blob/serial.h>#include <blob/util.h>#define INT_BUF_SIZE 1024#define MAX_RETRIES 10#define TEST_MAX_RETRIES do { \ if(retries++ > MAX_RETRIES) { \ return -ETIMEOUT; \ } \} while(0)#define DEC(c) (((c) - ' ') & 077) /* single character decode */#define IS_DEC(c) ( (((c) - ' ') >= 0) && (((c) - ' ') <= 077 + 1) )/* #define IS_DEC(c) (1) */#define OUT_OF_RANGE do { \ serial_write('\n'); \ SerialOutputString(buf); \ serial_write('\n'); \ return -ERANGE; \} while(0)#define PUT_CHAR(x) do { \ if(bytesWritten < bufLen) \ bufBase[bytesWritten++] = x; \} while(0)int UUDecode(char *bufBase, int bufLen) {/* Receives and decodes an incoming uuencoded stream. Returns the number of bytes put in the buffer on success, or -1 otherwise. */ int n, linesReceived = 0; char ch, *p; int bytesWritten = 0, retries = 0; char buf[INT_BUF_SIZE]; /* Search for header line. We don't care about the mode or filename */ retries = 0; do { SerialInputString(buf, sizeof(buf), 6); TEST_MAX_RETRIES; } while (strncmp(buf, "begin ", 6) != 0);/* SerialOutputString("Bytes received : 0x00000000");*/ /* for each input line */ for (;;) { if (SerialInputString(p = buf, sizeof(buf), 2) == 0) { return -ETOOSHORT; } /* Status print to show where we are at right now */ if((linesReceived++ & 0x007F) == 0) { serial_write('.'); } /* * `n' is used to avoid writing out all the characters * at the end of the file. */ if ((n = DEC(*p)) <= 0) break; for (++p; n > 0; p += 4, n -= 3) if (n >= 3) { if (!(IS_DEC(*p) && IS_DEC(*(p + 1)) && IS_DEC(*(p + 2)) && IS_DEC(*(p + 3)))) OUT_OF_RANGE; ch = DEC(p[0]) << 2 | DEC(p[1]) >> 4; PUT_CHAR(ch); ch = DEC(p[1]) << 4 | DEC(p[2]) >> 2; PUT_CHAR(ch); ch = DEC(p[2]) << 6 | DEC(p[3]); PUT_CHAR(ch); } else { if (n >= 1) { if (!(IS_DEC(*p) && IS_DEC(*(p + 1)))) OUT_OF_RANGE; ch = DEC(p[0]) << 2 | DEC(p[1]) >> 4; PUT_CHAR(ch); } if (n >= 2) { if (!(IS_DEC(*(p + 1)) && IS_DEC(*(p + 2)))) OUT_OF_RANGE; ch = DEC(p[1]) << 4 | DEC(p[2]) >> 2; PUT_CHAR(ch); } if (n >= 3) { if (!(IS_DEC(*(p + 2)) && IS_DEC(*(p + 3)))) OUT_OF_RANGE; ch = DEC(p[2]) << 6 | DEC(p[3]); PUT_CHAR(ch); } } } serial_write('\n'); if (SerialInputString(p = buf, sizeof(buf), 2) == 0 || (strncmp(buf, "end", 3))) { /* no "end" line */ return -ETOOSHORT; } return(bytesWritten);} /* UUDecode *//* we currently don't need to upload files, so disable UUEncode() */#if 0/* ENC is the basic 1 character encoding function to make a char printing */#define ENC(c) ((c) ? ((c) & 077) + ' ': '`')void UUEncode(char *bufBase, int bufLen) { register int ch, n; register char *p; char buf[80]; SerialOutputString("begin 644 testme.jdb\n"); while (bufLen > 0) { n = (bufLen > 45) ? 45 : bufLen; MyMemCpyChar(buf, bufBase, n); bufBase += n; bufLen -= n; ch = ENC(n); serial_write(ch); for (p = buf; n > 0; n -= 3, p += 3) { ch = *p >> 2; ch = ENC(ch); serial_write(ch); ch = ((*p << 4) & 060) | ((p[1] >> 4) & 017); ch = ENC(ch); serial_write(ch); ch = ((p[1] << 2) & 074) | ((p[2] >> 6) & 03); ch = ENC(ch); serial_write(ch); ch = p[2] & 077; ch = ENC(ch); serial_write(ch); } serial_write('\n'); } ch = ENC('\0'); serial_write(ch); serial_write('\n'); SerialOutputString("end\n"); } /* UUEncode */#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -