Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/codexlib/zip/zip.c
1810 views
1
#pragma prototyped
2
3
/*
4
* zip decoder
5
* this is a wrapper method for the PKZIP { shrink reduce implode deflate }
6
*/
7
8
#include "zip.h"
9
10
#define ID(a,b) (((a)<<8)|(b))
11
12
static int
13
zip_open(Codex_t* p, char* const args[], Codexnum_t flags)
14
{
15
const char* name;
16
const char* method;
17
18
name = args[0];
19
if (!(method = args[2]))
20
{
21
if (p->disc->errorf)
22
(*p->disc->errorf)(NiL, p->disc, 2, "%s: method parameter expected", name);
23
return -1;
24
}
25
switch (ID(method[0], method[1]))
26
{
27
case ID('0',0):
28
case ID('c','o'):
29
p->meth = 0;
30
return 0;
31
case ID('1',0):
32
case ID('s','h'):
33
p->meth = &codex_zip_shrink;
34
break;
35
case ID('2',0):
36
case ID('3',0):
37
case ID('4',0):
38
case ID('5',0):
39
case ID('r','e'):
40
p->meth = &codex_zip_reduce;
41
break;
42
case ID('6',0):
43
case ID('e','x'):
44
case ID('i','m'):
45
p->meth = &codex_zip_implode;
46
break;
47
case ID('8',0):
48
case ID('d','e'):
49
case ID('i','n'):
50
case ID('m','s'):
51
case ID('C','K'):
52
case ID('M','S'):
53
p->meth = &codex_zip_deflate;
54
break;
55
default:
56
if (p->disc->errorf)
57
(*p->disc->errorf)(NiL, p->disc, 2, "%s: %s: unknown method", name, method);
58
return 0;
59
}
60
return (*p->meth->openf)(p, args, flags);
61
}
62
63
Codexmeth_t codex_zip =
64
{
65
"zip",
66
"zip compression. The first parameter is the PKZIP compression"
67
" method.",
68
"[+copy|0?No compression.]"
69
"[+shrink|1?Shrink compression.]"
70
"[+reduce|2|3|4|5?Reduce compression.]"
71
"[+implode|6?Implode compression.]"
72
"[+deflate|8?Deflate compression.]",
73
CODEX_DECODE|CODEX_ENCODE|CODEX_COMPRESS,
74
0,
75
0,
76
zip_open,
77
0,
78
0,
79
0,
80
0,
81
0,
82
0,
83
0,
84
0,
85
0,
86
0,
87
CODEXNEXT(zip)
88
};
89
90
CODEXLIB(zip)
91
92