Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/tests/sfio/tdisc.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1999-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
#include "sftest.h"
21
22
#if __STD_C
23
ssize_t upper(Sfio_t* f, Void_t* buf, size_t n, Sfdisc_t* disc)
24
#else
25
ssize_t upper(f,buf,n,disc)
26
Sfio_t* f;
27
Void_t* buf;
28
size_t n;
29
Sfdisc_t* disc;
30
#endif
31
{
32
size_t i;
33
char* s = (char*)buf;
34
35
if(sfgetc(f) >= 0)
36
terror("Stream should be locked");
37
38
if((n = sfrd(f,buf,n,disc)) <= 0)
39
return n;
40
for(i = 0; i < n; ++i)
41
if(s[i] >= 'a' && s[i] <= 'z')
42
s[i] = (s[i]-'a') + 'A';
43
return n;
44
}
45
46
#if __STD_C
47
ssize_t wupper(Sfio_t* f, const Void_t* buf, size_t n, Sfdisc_t* disc)
48
#else
49
ssize_t wupper(f,buf,n,disc)
50
Sfio_t* f;
51
Void_t* buf;
52
size_t n;
53
Sfdisc_t* disc;
54
#endif
55
{
56
size_t i;
57
char* s = (char*)buf;
58
59
if(sfputc(f,0) >= 0)
60
terror("Stream should be locked2");
61
62
for(i = 0; i < n; ++i)
63
if(s[i] >= 'a' && s[i] <= 'z')
64
s[i] = (s[i]-'a') + 'A';
65
return sfwr(f,buf,n,disc);
66
}
67
68
#if __STD_C
69
ssize_t lower(Sfio_t* f, Void_t* buf, size_t n, Sfdisc_t* disc)
70
#else
71
ssize_t lower(f,buf,n,disc)
72
Sfio_t* f;
73
Void_t* buf;
74
size_t n;
75
Sfdisc_t* disc;
76
#endif
77
{
78
size_t i;
79
char* s = (char*)buf;
80
81
if(sfgetc(f) >= 0)
82
terror("Stream should be locked");
83
84
if((n = sfrd(f,buf,n,disc)) <= 0)
85
return n;
86
for(i = 0; i < n; ++i)
87
if(s[i] >= 'A' && s[i] <= 'Z')
88
s[i] = (s[i]-'A') + 'a';
89
return n;
90
}
91
92
#if __STD_C
93
ssize_t once(Sfio_t* f, Void_t* buf, size_t n, Sfdisc_t* disc)
94
#else
95
ssize_t once(f,buf,n,disc)
96
Sfio_t* f;
97
Void_t* buf;
98
size_t n;
99
Sfdisc_t* disc;
100
#endif
101
{
102
static int called = 0;
103
104
if(!called)
105
{ called = 1;
106
strcpy(buf,"123456");
107
return 6;
108
}
109
else
110
{ terror("Discipline is called twice");
111
return -1;
112
}
113
}
114
115
static char External[128], *Enext = External;
116
#if __STD_C
117
ssize_t external(Sfio_t* f, const Void_t* buf, size_t n, Sfdisc_t* disc)
118
#else
119
ssize_t external(f,buf,n,disc)
120
Sfio_t* f;
121
Void_t* buf;
122
size_t n;
123
Sfdisc_t* disc;
124
#endif
125
{
126
memcpy(Enext,buf,n);
127
Enext += n;
128
return n;
129
}
130
131
132
Sfdisc_t Wdisc = {(Sfread_f)0, wupper, (Sfseek_f)0, (Sfexcept_f)0, (Sfdisc_t*)0};
133
Sfdisc_t Udisc = {upper, wupper, (Sfseek_f)0, (Sfexcept_f)0, (Sfdisc_t*)0};
134
Sfdisc_t Ldisc = {lower, (Sfwrite_f)0, (Sfseek_f)0, (Sfexcept_f)0, (Sfdisc_t*)0};
135
Sfdisc_t Odisc = {once, (Sfwrite_f)0, (Sfseek_f)0, (Sfexcept_f)0, (Sfdisc_t*)0};
136
Sfdisc_t Edisc = {(Sfread_f)0, external, (Sfseek_f)0, (Sfexcept_f)0, (Sfdisc_t*)0};
137
138
tmain()
139
{
140
Sfio_t *f, *fs;
141
char *l, *u, *s;
142
int n, r, fd[2];
143
int flags;
144
char buf[1024], low[64], up[64];
145
146
sfsetbuf(sfstdin,buf,sizeof(buf));
147
flags = sfset(sfstdin,0,0);
148
sfdisc(sfstdin,&Ldisc);
149
if(sfset(sfstdin,0,0) != flags)
150
terror("Flags changed after discipline setting");
151
152
l = low;
153
strcpy(l, "abcdefghijklmnopqrstuvwxyz");
154
u = up;
155
strcpy(u, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
156
n = strlen(l);
157
158
if(!(f = sfopen(NIL(Sfio_t*), tstfile("sf", 0),"w+")))
159
terror("Creating temp file");
160
if((r = sfwrite(f,l,n)) != n)
161
terror("Writing data %d",r);
162
sfsync(f);
163
164
sfseek(f,(Sfoff_t)0,0);
165
sfdisc(f,&Udisc);
166
if(!(s = sfreserve(f,n,0)) )
167
terror("Reading string1");
168
if(strncmp(s,u,n) != 0)
169
{ s[n-1] = 0;
170
terror("Input1=%s, Expect=%s",s,u);
171
}
172
173
sfseek(f,(Sfoff_t)0,0);
174
sfdisc(f,&Ldisc);
175
if(!(s = sfreserve(f,n,0)) )
176
terror("Reading string2");
177
if(strncmp(s,l,n) != 0)
178
{ s[n-1] = 0;
179
terror("Input2=%s, Expect=%s",s,l);
180
}
181
sfclose(f);
182
183
if(!(f = sfopen(NIL(Sfio_t*), tstfile("sf", 0), "w+")) )
184
terror("Opening file");
185
sfdisc(f,&Wdisc);
186
if(sfputr(f,low,'\n') < 0)
187
terror("Writing data");
188
if(sfseek(f,(Sfoff_t)0,0) != 0)
189
terror("Seeking");
190
if(!(s = sfgetr(f,'\n',1)))
191
terror("sfgetr");
192
if(strcmp(s,up) != 0)
193
terror("Bad data");
194
sfclose(f);
195
196
/* read-once discipline */
197
if(!(f = sfopen(NIL(Sfio_t*), tstfile("sf", 0),"r")) )
198
terror("Opening file");
199
sfdisc(f,&Odisc);
200
if(!(s = sfreserve(f,SF_UNBOUND,SF_LOCKR)) )
201
terror("Sfreserve failed1");
202
if(sfvalue(f) != 6)
203
terror("Wrong reserved length1");
204
sfread(f,s,3);
205
206
if(!(fs = sfopen(NIL(Sfio_t*),"abcdef","s")) )
207
terror("String open failed");
208
sfstack(f,fs);
209
if(!(s = sfreserve(f,SF_UNBOUND,SF_LOCKR)) )
210
terror("Sfreserve failed2");
211
if(sfvalue(f) != 6)
212
terror("Wrong reserved length2");
213
sfread(f,s,6);
214
215
if(!(s = sfreserve(f,SF_UNBOUND,SF_LOCKR)) )
216
terror("sfreserve failed 3");
217
if(sfvalue(f) != 3)
218
terror("Wrong reserved length3");
219
sfclose(f);
220
sfclose(fs);
221
222
if(!(f = sfopen(NIL(Sfio_t*), tstfile("sf", 0),"w")) )
223
terror("Opening file to write");
224
sfdisc(f,&Edisc);
225
if(sfwrite(f, "one", 3) != 3)
226
terror("Bad sfwrite");
227
if(sfwr(f, "two", 4, NIL(Sfdisc_t*)) != 4)
228
terror("Bad sfwr");
229
if(strcmp(External,"onetwo") != 0)
230
terror("Bad call of sfwr");
231
sfclose(f);
232
233
/* test for setting discipline on an unseekable device */
234
if(pipe(fd) < 0)
235
terror("Bad pipe call");
236
if(!(f = sfnew(0, 0, -1, fd[0], SF_READ)) )
237
terror("Can't create stream to read");
238
if(write(fd[1], "1234ABCD", 8) != 8)
239
terror("Can't write to pipe");
240
close(fd[1]);
241
if(!(s = sfreserve(f, -1, SF_LOCKR)) )
242
terror("Can't reserve for data");
243
if(s[0] != '1' || s[1] != '2' || s[2] != '3' || s[3] != '4')
244
terror("Bad reserved data");
245
if(sfread(f, s, 4) != 4)
246
terror("Bad reopening of stream");
247
if(!sfdisc(f, &Ldisc) )
248
terror("Can't insert new discipline");
249
if(sfread(f, buf, sizeof(buf)) != 4)
250
terror("Read wrong data size");
251
if(buf[0] != 'a' || buf[1] != 'b' || buf[2] != 'c' || buf[3] != 'd')
252
terror("Bad read data");
253
254
texit(0);
255
}
256
257