Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/tests/sfio/tseek.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
static int Bufcount = 0;
23
24
#if __STD_C
25
ssize_t readbuf(Sfio_t* f, Void_t* buf, size_t n, Sfdisc_t* disc)
26
#else
27
ssize_t readbuf(f,buf,n,disc)
28
Sfio_t* f;
29
Void_t* buf;
30
size_t n;
31
Sfdisc_t* disc;
32
#endif
33
{
34
Bufcount += 1;
35
return sfrd(f,buf,n,disc);
36
}
37
38
Sfdisc_t Disc = {readbuf, (Sfwrite_f)0, (Sfseek_f)0, (Sfexcept_f)0, (Sfdisc_t*)0};
39
40
tmain()
41
{
42
Sfio_t *f, *sf;
43
char *ss, *s, *tmp;
44
int n, i;
45
char zero[SF_BUFSIZE*2];
46
char buf[SF_BUFSIZE], little[512];
47
Sfoff_t one, two;
48
49
s = "123456789\n";
50
n = strlen(s);
51
if(!(f = sfopen((Sfio_t*)0, tstfile("sf", 0),"w")))
52
terror("Opening file to write");
53
for(i = 0; i < 1000; ++i)
54
if(sfwrite(f,s,n) != n)
55
terror("Writing data");
56
57
if(!(f = sfopen(f, tstfile("sf", 0),"r")))
58
terror("Opening file to read");
59
60
if(sfseek(f,(Sfoff_t)128,0) != (Sfoff_t)128)
61
terror("Bad seek to 128");
62
if(sfseek(f,(Sfoff_t)0,1) != (Sfoff_t)128)
63
terror("Bad seek(0,1) to 128");
64
65
if(sfseek(f,(Sfoff_t)0,2) != (i*n))
66
terror("Bad file length");
67
if(sftell(f) != (i*n))
68
terror("sftell");
69
for(; i > 0; --i)
70
{ sfseek(f,(Sfoff_t)(-i*n),2);
71
if(!(ss = sfgetr(f,'\n',1)))
72
terror("sfgetr");
73
if(strncmp(ss,s,sfvalue(f)-1) != 0)
74
terror("Expect=%s",s);
75
}
76
77
if(!(f = sfopen(f,tstfile("sf", 0),"w")) )
78
terror("Open to write");
79
for(n = sizeof(zero)-1; n >= 0; --n)
80
zero[n] = 0;
81
if(sfwrite(f,zero,sizeof(zero)) != sizeof(zero))
82
terror("Writing data");
83
one = sfseek(f,(Sfoff_t)0,2);
84
two = (Sfoff_t)lseek(sffileno(f), (off_t)0, 2);
85
if(one != two)
86
terror("seeking1");
87
if(sfseek(f,(Sfoff_t)(-1),2) != (Sfoff_t)lseek(sffileno(f), (off_t)(-1), 2))
88
terror("seeking2");
89
90
if(!(f = sfopen(f,tstfile("sf", 0),"w")))
91
terror("Open to write2");
92
for(n = 0; n < sizeof(buf); n++)
93
buf[n] = n;
94
for(n = 0; n < 256; n++)
95
if(sfwrite(f,buf,sizeof(buf)) != sizeof(buf))
96
terror("Writing data 2");
97
if(!(f = sfopen(f,tstfile("sf", 0),"r")))
98
terror("Open to read2");
99
if(sfgetc(f) != 0 && sfgetc(f) != 1)
100
terror("Get first 2 bytes");
101
102
if(sfseek(f,(Sfoff_t)(128*sizeof(buf)),0) != (Sfoff_t)128*sizeof(buf) )
103
terror("Seeking ");
104
for(n = 0; n < 128; ++n)
105
if(sfread(f,buf,sizeof(buf)) != sizeof(buf))
106
terror("Reading data");
107
108
if(!(f = sfopen(f,tstfile("sf", 0),"r")))
109
terror("Open to read3");
110
sfsetbuf(f,little,sizeof(little));
111
if(sfread(f, buf, 10) != 10)
112
terror("sfread failed");
113
if(sftell(f) != (Sfoff_t)10)
114
terror("sftell failed");
115
if(sfseek(f, (Sfoff_t)10, SEEK_CUR|SF_PUBLIC) != (Sfoff_t)20)
116
terror("sfseek failed");
117
sfseek(f, (Sfoff_t)0, SEEK_SET);
118
119
if(!(sf = sfnew((Sfio_t*)0, little, sizeof(little), sffileno(f), SF_READ)) )
120
terror("sfnew failed");
121
if(sfread(f, buf, 10) != 10)
122
terror("sfread failed2");
123
if(sftell(f) != 10)
124
terror("sftell failed2");
125
126
if(sfseek(sf, (Sfoff_t)4000, SEEK_SET) != (Sfoff_t)4000)
127
terror("sfseek failed on sf");
128
sfsync(sf);
129
130
if(sfseek(f, (Sfoff_t)10, SEEK_CUR|SF_PUBLIC) != (Sfoff_t)4010)
131
terror("sfseek public failed");
132
133
/* test to see if the buffering algorithm does the right thing */
134
if(!(f = sfopen(NIL(Sfio_t*),tstfile("sf", 0),"w")) )
135
terror("Opening test file to write");
136
for(i = 0; i < 8192; ++i)
137
if(sfputr(f,"123456789",'\n') != 10)
138
terror("writing test data");
139
if(!(f = sfopen(f,tstfile("sf", 0),"r")) )
140
terror("Opening test file to read");
141
sfdisc(f,&Disc);
142
sfsetbuf(f,NIL(Void_t*),8192);
143
for(i = 0; i < 8192; ++i)
144
{ sfseek(f, (Sfoff_t)(i*10), 0);
145
if(!(s = sfgetr(f, '\n', SF_STRING)) )
146
terror("Reading data");
147
if(strcmp(s,"123456789") != 0)
148
terror("Bad data");
149
}
150
if(Bufcount != 10)
151
terror("Bad buffer filling count");
152
sfclose(f);
153
154
/* test buffer alignment for read streams - from a Daytona case */
155
tmp = tstfile("sf", 0); /* create a small file of data */
156
if(!(f = sfopen(NIL(Sfio_t*), tmp, "w")) )
157
terror("Opening to write");
158
for(i = 0; i < 500; ++i)
159
if(sfputr(f,"123456789",'\n') != 10)
160
terror("writing test data");
161
sfclose(f);
162
163
if(!(f = sfopen(NIL(Sfio_t*), tmp, "r")) )
164
terror("Opening to read");
165
sfsetbuf(f, buf, 512);
166
if(sfseek(f, (Sfoff_t)2741, SEEK_SET) != (Sfoff_t)2741)
167
terror("Bad seek");
168
if(!(s = sfreserve(f, 100, -1)) )
169
terror("Bad sfreserve");
170
if(sfseek(f, (Sfoff_t)0, SEEK_CUR) != (Sfoff_t)2841)
171
terror("Bad file position");
172
if(sfseek(f, (Sfoff_t)3224, SEEK_SET) != (Sfoff_t)3224)
173
terror("Bad seek");
174
if(!(s = sfreserve(f, 6, -1)) )
175
terror("Bad sfreserve");
176
if(strncmp(s, "56789\n", 6) != 0)
177
terror("Bad reserved data");
178
179
texit(0);
180
}
181
182