1_debug_info = 1; () = evalfile ("inc.sl");
2
3
4print ("Testing stdio routines...");
5
6define fopen_tmp_file (fileptr, mode)
7{
8   variable n;
9   variable file, fp;
10   variable fmt;
11
12   @fileptr = NULL;
13
14   fmt = "tmp-xxx.%03d";    % I need something that works on an 8+3 filesystem
15
16   n = -1;
17   while (n < 999)
18     {
19	n++;
20	file = sprintf (fmt, n);
21	if (NULL != stat_file (file))
22	  continue;
23
24	fp = fopen (file, mode);
25	if (fp != NULL)
26	  {
27	     @fileptr = file;
28	     return fp;
29	  }
30     }
31   failed ("Unable to open a tmp file");
32}
33
34define run_tests (some_text, read_fun, write_fun, length_fun)
35{
36   variable file, fp;
37   variable new_text, nbytes, len;
38   variable pos;
39
40   fp = fopen_tmp_file (&file, "wb");
41
42   if (-1 == @write_fun (some_text, fp))
43     failed (string (write_fun));
44
45   if (-1 == fclose (fp))
46     failed ("fclose");
47
48   fp = fopen (file, "rb");
49   if (fp == NULL) failed ("fopen existing");
50
51   len = @length_fun (some_text);
52   nbytes = @read_fun (&new_text, len, fp);
53
54   if ((nbytes != len)
55       or (some_text != new_text))
56     failed (string (read_fun));
57
58   if (-1 != @read_fun (&new_text, 1, fp))
59     failed (string (read_fun) + " at EOF");
60
61   if (0 == feof (fp)) failed ("feof");
62
63   clearerr (fp);
64   if (feof (fp)) failed ("clearerr");
65
66   if (0 != fseek (fp, 0, SEEK_SET)) failed ("fseek");
67
68   nbytes = @read_fun (&new_text, len, fp);
69
70   if ((nbytes != len)
71       or (some_text != new_text))
72     failed (string (read_fun) + " after fseek");
73
74
75   pos = ftell (fp);
76   if (pos == -1) failed ("ftell at EOF");
77
78   if (0 != fseek (fp, 0, SEEK_SET)) failed ("fseek");
79   if (0 != ftell (fp)) failed ("ftell at BOF");
80   if (0 != fseek (fp, pos, SEEK_CUR)) failed ("fseek to pos");
81
82   if (pos != ftell (fp)) failed ("ftell after fseek to pos");
83
84   if (feof (fp) != 0) failed ("feof after fseek to EOF");
85
86   () = fseek (fp, 0, SEEK_SET);
87   nbytes = fread (&new_text, Char_Type, 0, fp);
88   if (nbytes != 0)
89     failed ("fread for 0 bytes");
90
91   nbytes = fread (&new_text, Char_Type, len + 100, fp);
92   if (nbytes != len)
93     failed ("fread for 100 extra bytes");
94
95   if (-1 == fclose (fp)) failed ("fclose after tests");
96   () = remove (file);
97   if (stat_file (file) != NULL) failed ("remove");
98}
99
100static define do_fgets (addr, nbytes, fp)
101{
102   return fgets (addr, fp);
103}
104
105static define do_fread (addr, nbytes, fp)
106{
107   return fread (addr, UChar_Type, nbytes, fp);
108}
109
110run_tests ("ABCDEFG", &do_fgets, &fputs, &strlen);
111run_tests ("A\000BC\000\n\n\n", &do_fread, &fwrite, &bstrlen);
112
113define test_fread_fwrite (x)
114{
115   variable fp, file, str, n, m, y, type, ch;
116
117   fp = fopen_tmp_file (&file, "w+b");
118
119   type = _typeof(x);
120   n = length (x);
121   if ((type == String_Type) or (type == BString_Type))
122     {
123	type = UChar_Type;
124	n = bstrlen (x);
125     }
126
127   if (n != fwrite (x, fp))
128     failed ("test_fread_fwrite: fwrite");
129
130   if (-1 == fseek (fp, 0, SEEK_SET))
131     failed ("test_fread_fwrite: fseek");
132
133   if (n != fread (&y, type, n, fp))
134     failed ("test_fread_fwrite: fread");
135
136   if (length (where (y != x)))
137     failed ("test_fread_fwrite: fread failed to return: " + string(x));
138
139   if (-1 == fseek (fp, 0, SEEK_SET))
140     failed ("test_fread_fwrite: fseek");
141
142   if (type == UChar_Type)
143     {
144	y = 0;
145	foreach (fp) using ("char")
146	  {
147	     ch = ();
148	     if (ch != x[y])
149	       failed ("foreach using char: %S != %S", ch, x[y]);
150	     y++;
151	  }
152	if (y != n)
153	  failed ("foreach using char 2");
154     }
155
156   () = fclose (fp);
157
158   if (-1 == remove (file))
159     failed ("remove:" + errno_string(errno));
160   if (stat_file (file) != NULL) failed ("remove");
161}
162
163test_fread_fwrite ("");
164test_fread_fwrite ("hello");
165test_fread_fwrite ("hel\0\0lo");
166test_fread_fwrite (3.17);
167test_fread_fwrite (Integer_Type[0]);
168test_fread_fwrite ([1:10]);
169test_fread_fwrite ([1:10:0.01]);
170#ifexists Complex_Type
171test_fread_fwrite (Complex_Type[50] + 3 + 2i);
172test_fread_fwrite (2i+3);
173test_fread_fwrite ([2i+3, 7i+1]);
174#endif
175
176print ("Ok\n");
177
178exit (0);
179