Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/codexlib/sum/sum.c
1810 views
1
#pragma prototyped
2
3
/*
4
* checksum filter
5
*/
6
7
#include <codex.h>
8
#include <sum.h>
9
10
typedef struct State_s
11
{
12
Codex_t codex;
13
14
Sum_t* sum;
15
} State_t;
16
17
static int
18
sum_options(Codexmeth_t* meth, Sfio_t* sp)
19
{
20
return sumusage(sp) >= 0 ? 0 : -1;
21
}
22
23
static int
24
sum_open(Codex_t* p, char* const args[], Codexnum_t flags)
25
{
26
register State_t* state;
27
register Sum_t* sum;
28
register const char* s;
29
30
s = args[0];
31
if (args[2])
32
while (*s && *s++ != '-');
33
if (!(sum = sumopen(s)))
34
{
35
if (p->disc->errorf)
36
(*p->disc->errorf)(NiL, p->disc, 2, "%s: unknown method", args[0]);
37
return -1;
38
}
39
if (!(state = newof(0, State_t, 1, 0)))
40
{
41
if (p->disc->errorf)
42
(*p->disc->errorf)(NiL, p->disc, 2, "out of space");
43
return -1;
44
}
45
state->sum = sum;
46
p->data = state;
47
return 0;
48
}
49
50
static int
51
sum_init(Codex_t* p)
52
{
53
return suminit(((State_t*)p->data)->sum);
54
}
55
56
static int
57
sum_close(Codex_t* p)
58
{
59
return sumclose(((State_t*)p->data)->sum);
60
}
61
62
static ssize_t
63
sum_read(Sfio_t* sp, void* buf, size_t n, Sfdisc_t* disc)
64
{
65
ssize_t r;
66
67
if ((r = sfrd(sp, buf, n, disc)) > 0)
68
sumblock(((State_t*)CODEX(disc)->data)->sum, buf, r);
69
return r;
70
}
71
72
static ssize_t
73
sum_write(Sfio_t* sp, const void* buf, size_t n, Sfdisc_t* disc)
74
{
75
ssize_t r;
76
77
if ((r = sfwr(sp, buf, n, disc)) > 0)
78
sumblock(((State_t*)CODEX(disc)->data)->sum, buf, r);
79
return r;
80
}
81
82
static int
83
sum_data(Codex_t* p, Codexdata_t* data)
84
{
85
sumdone(((State_t*)p->data)->sum);
86
return sumdata(((State_t*)p->data)->sum, (Sumdata_t*)data);
87
}
88
89
Codexmeth_t codex_sum =
90
{
91
"sum",
92
"checksum filter. The checksum value returned by \bcodexdata\b(3) is"
93
" written to the standard error.",
94
"[+(version)?codex-sum (AT&T Research) 2003-12-16]"
95
"[+(author)?Glenn Fowler <[email protected]>]",
96
CODEX_DECODE|CODEX_ENCODE|CODEX_SUM,
97
sum_options,
98
0,
99
sum_open,
100
0,
101
sum_init,
102
0,
103
sum_read,
104
sum_write,
105
sum_init,
106
0,
107
sum_data,
108
0,
109
0,
110
CODEXNEXT(sum)
111
};
112
113
CODEXLIB(sum)
114
115