summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/uudecode.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/uudecode.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/uudecode.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/uudecode.c b/reference/C/CONTRIB/SNIP/uudecode.c
new file mode 100755
index 0000000..01a8518
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/uudecode.c
@@ -0,0 +1,41 @@
+/*
+** by: John Lots
+** patched up for BC++ 3.1 by Alan Eldridge 10/12/92
+** (UUCP: alane@wozzle.linet.org, FIDO: 1:272/38.473)
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#define DEC(c) (char)(((c)-' ')&077)
+
+int main()
+{
+ int n;
+ char buf[128],a,b,c,d;
+
+ scanf("begin %o ", &n);
+ gets(buf); /* filename */
+ if (!freopen(buf, "wb", stdout)) /* oops.. */
+ {
+ perror(buf);
+ exit(1);
+ }
+ while ((n=getchar())!=EOF&&((n=DEC(n))!=0))
+ {
+ while (n>0)
+ {
+ a=DEC(getchar());
+ b=DEC(getchar());
+ c=DEC(getchar());
+ d=DEC(getchar());
+ if (n-->0)
+ putchar((a<<2)|(b>>4));
+ if (n-->0)
+ putchar((b<<4)|(c>>2));
+ if (n-->0)
+ putchar((c<<6)|d);
+ }
+ n=getchar(); /* skip \n */
+ }
+ return 0;
+}