/
test_physfs.c
1449 lines (1181 loc) · 36.2 KB
1
2
3
/**
* Test program for PhysicsFS. May only work on Unix.
*
4
* Please see the file LICENSE.txt in the source's root directory.
5
6
7
8
*
* This file written by Ryan C. Gordon.
*/
9
#include <stdio.h>
10
#include <stdlib.h>
11
#include <errno.h>
12
13
#include <string.h>
14
15
16
17
#if (defined __MWERKS__)
#include <SIOUX.h>
#endif
18
#if (defined PHYSFS_HAVE_READLINE)
19
#include <unistd.h>
20
21
#include <readline/readline.h>
#include <readline/history.h>
22
23
#endif
24
25
#include <time.h>
26
27
28
/* Define this, so the compiler doesn't complain about using old APIs. */
#define PHYSFS_DEPRECATED
29
30
#include "physfs.h"
31
#define TEST_VERSION_MAJOR 2
32
#define TEST_VERSION_MINOR 1
33
#define TEST_VERSION_PATCH 0
34
35
static FILE *history_file = NULL;
36
static PHYSFS_uint32 do_buffer_size = 0;
37
38
static void output_versions(void)
39
40
41
42
43
44
45
46
47
48
49
{
PHYSFS_Version compiled;
PHYSFS_Version linked;
PHYSFS_VERSION(&compiled);
PHYSFS_getLinkedVersion(&linked);
printf("test_physfs version %d.%d.%d.\n"
" Compiled against PhysicsFS version %d.%d.%d,\n"
" and linked against %d.%d.%d.\n\n",
TEST_VERSION_MAJOR, TEST_VERSION_MINOR, TEST_VERSION_PATCH,
50
51
(int) compiled.major, (int) compiled.minor, (int) compiled.patch,
(int) linked.major, (int) linked.minor, (int) linked.patch);
52
53
54
} /* output_versions */
55
static void output_archivers(void)
56
57
58
59
60
61
62
63
64
65
66
67
68
69
{
const PHYSFS_ArchiveInfo **rc = PHYSFS_supportedArchiveTypes();
const PHYSFS_ArchiveInfo **i;
printf("Supported archive types:\n");
if (*rc == NULL)
printf(" * Apparently, NONE!\n");
else
{
for (i = rc; *i != NULL; i++)
{
printf(" * %s: %s\n Written by %s.\n %s\n",
(*i)->extension, (*i)->description,
(*i)->author, (*i)->url);
70
71
printf(" %s symbolic links.\n",
(*i)->supportsSymlinks ? "Supports" : "Does not support");
72
73
} /* for */
} /* else */
74
75
printf("\n");
76
77
78
} /* output_archivers */
79
80
static int cmd_quit(char *args)
{
81
return 0;
82
83
84
85
} /* cmd_quit */
static int cmd_init(char *args)
86
{
87
88
89
90
91
92
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
93
94
95
96
97
if (PHYSFS_init(args))
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
98
return 1;
99
} /* cmd_init */
100
101
102
static int cmd_deinit(char *args)
103
{
104
105
106
107
108
if (PHYSFS_deinit())
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
109
return 1;
110
111
112
113
114
} /* cmd_deinit */
static int cmd_addarchive(char *args)
{
115
char *ptr = strrchr(args, ' ');
116
117
118
int appending = atoi(ptr + 1);
*ptr = '\0';
119
120
121
122
if (*args == '\"')
{
args++;
*(ptr - 1) = '\0';
123
} /* if */
124
125
126
/*printf("[%s], [%d]\n", args, appending);*/
127
if (PHYSFS_mount(args, NULL, appending))
128
129
130
131
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
132
return 1;
133
134
135
} /* cmd_addarchive */
136
137
138
139
140
141
/* wrap free() to avoid calling convention wankery. */
static void freeBuf(void *buf)
{
free(buf);
} /* freeBuf */
142
143
144
145
146
147
typedef enum
{
MNTTYPE_PATH,
MNTTYPE_MEMORY,
MNTTYPE_HANDLE
} MountType;
148
149
static int cmd_mount_internal(char *args, const MountType mnttype)
150
151
152
153
{
char *ptr;
char *mntpoint = NULL;
int appending = 0;
154
int rc = 0;
155
156
157
158
159
160
161
162
if (*args == '\"')
{
args++;
ptr = strchr(args, '\"');
if (ptr == NULL)
{
printf("missing string terminator in argument.\n");
163
return 1;
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
} /* if */
*(ptr) = '\0';
} /* if */
else
{
ptr = strchr(args, ' ');
*ptr = '\0';
} /* else */
mntpoint = ptr + 1;
if (*mntpoint == '\"')
{
mntpoint++;
ptr = strchr(mntpoint, '\"');
if (ptr == NULL)
{
printf("missing string terminator in argument.\n");
181
return 1;
182
183
184
185
186
187
188
189
190
191
} /* if */
*(ptr) = '\0';
} /* if */
else
{
ptr = strchr(mntpoint, ' ');
*(ptr) = '\0';
} /* else */
appending = atoi(ptr + 1);
192
/*printf("[%s], [%s], [%d]\n", args, mntpoint, appending);*/
193
194
if (mnttype == MNTTYPE_PATH)
195
rc = PHYSFS_mount(args, mntpoint, appending);
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
else if (mnttype == MNTTYPE_HANDLE)
{
PHYSFS_File *f = PHYSFS_openRead(args);
if (f == NULL)
{
printf("PHYSFS_openRead('%s') failed. reason: %s.\n", args, PHYSFS_getLastError());
return 1;
} /* if */
rc = PHYSFS_mountHandle(f, args, mntpoint, appending);
if (!rc)
PHYSFS_close(f);
} /* else if */
else if (mnttype == MNTTYPE_MEMORY)
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
{
FILE *in = fopen(args, "rb");
void *buf = NULL;
long len = 0;
if (in == NULL)
{
printf("Failed to open %s to read into memory: %s.\n", args, strerror(errno));
return 1;
} /* if */
if ( (fseek(in, 0, SEEK_END) != 0) || ((len = ftell(in)) < 0) )
{
printf("Failed to find size of %s to read into memory: %s.\n", args, strerror(errno));
fclose(in);
return 1;
} /* if */
buf = malloc(len);
if (buf == NULL)
{
printf("Failed to allocate space to read %s into memory: %s.\n", args, strerror(errno));
fclose(in);
return 1;
} /* if */
if ((fseek(in, 0, SEEK_SET) != 0) || (fread(buf, len, 1, in) != 1))
{
printf("Failed to read %s into memory: %s.\n", args, strerror(errno));
fclose(in);
free(buf);
return 1;
} /* if */
fclose(in);
rc = PHYSFS_mountMemory(buf, len, freeBuf, args, mntpoint, appending);
} /* else */
if (rc)
252
253
254
255
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
256
return 1;
257
258
259
260
261
} /* cmd_mount_internal */
static int cmd_mount(char *args)
{
262
return cmd_mount_internal(args, MNTTYPE_PATH);
263
264
265
} /* cmd_mount */
266
267
static int cmd_mount_mem(char *args)
{
268
return cmd_mount_internal(args, MNTTYPE_MEMORY);
269
270
271
} /* cmd_mount_mem */
272
273
274
275
276
static int cmd_mount_handle(char *args)
{
return cmd_mount_internal(args, MNTTYPE_HANDLE);
} /* cmd_mount_handle */
277
278
279
280
281
282
283
284
285
286
287
static int cmd_getmountpoint(char *args)
{
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
printf("Dir [%s] is mounted at [%s].\n", args, PHYSFS_getMountPoint(args));
return 1;
} /* cmd_getmountpoint */
288
289
290
static int cmd_removearchive(char *args)
{
291
292
293
294
295
296
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
297
if (PHYSFS_unmount(args))
298
299
300
301
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
302
return 1;
303
304
305
306
307
} /* cmd_removearchive */
static int cmd_enumerate(char *args)
{
308
309
310
311
312
313
314
315
316
char **rc;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
rc = PHYSFS_enumerateFiles(args);
317
318
319
320
321
322
323
324
325
326
327
328
329
330
if (rc == NULL)
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
else
{
int file_count;
char **i;
for (i = rc, file_count = 0; *i != NULL; i++, file_count++)
printf("%s\n", *i);
printf("\n total (%d) files.\n", file_count);
PHYSFS_freeList(rc);
} /* else */
331
return 1;
332
333
334
335
336
337
} /* cmd_enumerate */
static int cmd_getdirsep(char *args)
{
printf("Directory separator is [%s].\n", PHYSFS_getDirSeparator());
338
return 1;
339
340
341
342
343
344
} /* cmd_getdirsep */
static int cmd_getlasterror(char *args)
{
printf("last error is [%s].\n", PHYSFS_getLastError());
345
return 1;
346
347
348
349
350
351
352
353
} /* cmd_getlasterror */
static int cmd_getcdromdirs(char *args)
{
char **rc = PHYSFS_getCdRomDirs();
if (rc == NULL)
354
printf("Failure. Reason: [%s].\n", PHYSFS_getLastError());
355
356
357
358
359
360
361
362
363
364
365
else
{
int dir_count;
char **i;
for (i = rc, dir_count = 0; *i != NULL; i++, dir_count++)
printf("%s\n", *i);
printf("\n total (%d) drives.\n", dir_count);
PHYSFS_freeList(rc);
} /* else */
366
return 1;
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
} /* cmd_getcdromdirs */
static int cmd_getsearchpath(char *args)
{
char **rc = PHYSFS_getSearchPath();
if (rc == NULL)
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
else
{
int dir_count;
char **i;
for (i = rc, dir_count = 0; *i != NULL; i++, dir_count++)
printf("%s\n", *i);
printf("\n total (%d) directories.\n", dir_count);
PHYSFS_freeList(rc);
} /* else */
387
return 1;
388
389
390
391
392
393
} /* cmd_getcdromdirs */
static int cmd_getbasedir(char *args)
{
printf("Base dir is [%s].\n", PHYSFS_getBaseDir());
394
return 1;
395
396
397
398
399
400
} /* cmd_getbasedir */
static int cmd_getuserdir(char *args)
{
printf("User dir is [%s].\n", PHYSFS_getUserDir());
401
return 1;
402
403
404
} /* cmd_getuserdir */
405
406
407
408
409
410
411
412
413
414
415
416
417
static int cmd_getprefdir(char *args)
{
char *org;
char *appName;
char *ptr = args;
org = ptr;
ptr = strchr(ptr, ' '); *ptr = '\0'; ptr++; appName = ptr;
printf("Pref dir is [%s].\n", PHYSFS_getPrefDir(org, appName));
return 1;
} /* cmd_getprefdir */
418
419
420
static int cmd_getwritedir(char *args)
{
printf("Write dir is [%s].\n", PHYSFS_getWriteDir());
421
return 1;
422
423
424
425
426
} /* cmd_getwritedir */
static int cmd_setwritedir(char *args)
{
427
428
429
430
431
432
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
433
434
435
436
437
if (PHYSFS_setWriteDir(args))
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
438
return 1;
439
440
441
442
443
} /* cmd_setwritedir */
static int cmd_permitsyms(char *args)
{
444
445
446
447
448
449
450
451
452
int num;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
num = atoi(args);
453
454
PHYSFS_permitSymbolicLinks(num);
printf("Symlinks are now %s.\n", num ? "permitted" : "forbidden");
455
return 1;
456
457
458
} /* cmd_permitsyms */
459
460
461
462
463
464
465
466
static int cmd_setbuffer(char *args)
{
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
467
do_buffer_size = (unsigned int) atoi(args);
468
469
470
471
472
473
474
475
476
477
478
if (do_buffer_size)
{
printf("Further tests will set a (%lu) size buffer.\n",
(unsigned long) do_buffer_size);
} /* if */
else
{
printf("Further tests will NOT use a buffer.\n");
} /* else */
479
return 1;
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
} /* cmd_setbuffer */
static int cmd_stressbuffer(char *args)
{
int num;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
num = atoi(args);
if (num < 0)
printf("buffer must be greater than or equal to zero.\n");
else
{
498
PHYSFS_File *f;
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
int rndnum;
printf("Stress testing with (%d) byte buffer...\n", num);
f = PHYSFS_openWrite("test.txt");
if (f == NULL)
printf("Couldn't open test.txt for writing: %s.\n", PHYSFS_getLastError());
else
{
int i, j;
char buf[37];
char buf2[37];
if (!PHYSFS_setBuffer(f, num))
{
printf("PHYSFS_setBuffer() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
PHYSFS_delete("test.txt");
516
return 1;
517
518
519
} /* if */
strcpy(buf, "abcdefghijklmnopqrstuvwxyz0123456789");
520
srand((unsigned int) time(NULL));
521
522
523
524
525
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10000; j++)
{
526
527
PHYSFS_uint32 right = 1 + (PHYSFS_uint32) (35.0 * rand() / (RAND_MAX + 1.0));
PHYSFS_uint32 left = 36 - right;
528
if (PHYSFS_writeBytes(f, buf, left) != left)
529
{
530
printf("PHYSFS_writeBytes() failed: %s.\n", PHYSFS_getLastError());
531
PHYSFS_close(f);
532
return 1;
533
534
535
536
537
538
539
540
541
} /* if */
rndnum = 1 + (int) (1000.0 * rand() / (RAND_MAX + 1.0));
if (rndnum == 42)
{
if (!PHYSFS_flush(f))
{
printf("PHYSFS_flush() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
542
return 1;
543
544
545
} /* if */
} /* if */
546
if (PHYSFS_writeBytes(f, buf + left, right) != right)
547
{
548
printf("PHYSFS_writeBytes() failed: %s.\n", PHYSFS_getLastError());
549
PHYSFS_close(f);
550
return 1;
551
552
553
554
555
556
557
558
559
} /* if */
rndnum = 1 + (int) (1000.0 * rand() / (RAND_MAX + 1.0));
if (rndnum == 42)
{
if (!PHYSFS_flush(f))
{
printf("PHYSFS_flush() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
560
return 1;
561
562
563
564
565
566
567
568
} /* if */
} /* if */
} /* for */
if (!PHYSFS_flush(f))
{
printf("PHYSFS_flush() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
569
return 1;
570
571
572
573
574
575
576
} /* if */
} /* for */
if (!PHYSFS_close(f))
{
printf("PHYSFS_close() failed: %s.\n", PHYSFS_getLastError());
577
return 1; /* oh well. */
578
579
580
581
582
583
584
} /* if */
printf(" ... test file written ...\n");
f = PHYSFS_openRead("test.txt");
if (f == NULL)
{
printf("Failed to reopen stress file for reading: %s.\n", PHYSFS_getLastError());
585
return 1;
586
587
588
589
590
591
} /* if */
if (!PHYSFS_setBuffer(f, num))
{
printf("PHYSFS_setBuffer() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
592
return 1;
593
594
595
596
597
598
} /* if */
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10000; j++)
{
599
600
PHYSFS_uint32 right = 1 + (PHYSFS_uint32) (35.0 * rand() / (RAND_MAX + 1.0));
PHYSFS_uint32 left = 36 - right;
601
if (PHYSFS_readBytes(f, buf2, left) != left)
602
{
603
printf("PHYSFS_readBytes() failed: %s.\n", PHYSFS_getLastError());
604
PHYSFS_close(f);
605
return 1;
606
607
608
609
610
611
612
613
614
} /* if */
rndnum = 1 + (int) (1000.0 * rand() / (RAND_MAX + 1.0));
if (rndnum == 42)
{
if (!PHYSFS_flush(f))
{
printf("PHYSFS_flush() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
615
return 1;
616
617
618
} /* if */
} /* if */
619
if (PHYSFS_readBytes(f, buf2 + left, right) != right)
620
{
621
printf("PHYSFS_readBytes() failed: %s.\n", PHYSFS_getLastError());
622
PHYSFS_close(f);
623
return 1;
624
625
626
627
628
629
630
631
632
} /* if */
rndnum = 1 + (int) (1000.0 * rand() / (RAND_MAX + 1.0));
if (rndnum == 42)
{
if (!PHYSFS_flush(f))
{
printf("PHYSFS_flush() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
633
return 1;
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
} /* if */
} /* if */
if (memcmp(buf, buf2, 36) != 0)
{
printf("readback is mismatched on iterations (%d, %d).\n", i, j);
printf("wanted: [");
for (i = 0; i < 36; i++)
printf("%c", buf[i]);
printf("]\n");
printf(" got: [");
for (i = 0; i < 36; i++)
printf("%c", buf2[i]);
printf("]\n");
PHYSFS_close(f);
650
return 1;
651
652
653
654
655
656
657
} /* if */
} /* for */
if (!PHYSFS_flush(f))
{
printf("PHYSFS_flush() failed: %s.\n", PHYSFS_getLastError());
PHYSFS_close(f);
658
return 1;
659
660
661
662
663
664
665
666
667
668
669
670
} /* if */
} /* for */
printf(" ... test file read ...\n");
if (!PHYSFS_eof(f))
printf("PHYSFS_eof() returned true! That's wrong.\n");
if (!PHYSFS_close(f))
{
printf("PHYSFS_close() failed: %s.\n", PHYSFS_getLastError());
671
return 1; /* oh well. */
672
673
674
675
676
677
678
} /* if */
PHYSFS_delete("test.txt");
printf("stress test completed successfully.\n");
} /* else */
} /* else */
679
return 1;
680
681
682
} /* cmd_stressbuffer */
683
684
static int cmd_setsaneconfig(char *args)
{
685
char *org;
686
687
688
689
690
691
692
char *appName;
char *arcExt;
int inclCD;
int arcsFirst;
char *ptr = args;
/* ugly. */
693
694
org = ptr;
ptr = strchr(ptr, ' '); *ptr = '\0'; ptr++; appName = ptr;
695
696
697
698
699
700
701
ptr = strchr(ptr, ' '); *ptr = '\0'; ptr++; arcExt = ptr;
ptr = strchr(ptr, ' '); *ptr = '\0'; ptr++; inclCD = atoi(arcExt);
arcsFirst = atoi(ptr);
if (strcmp(arcExt, "!") == 0)
arcExt = NULL;
702
if (PHYSFS_setSaneConfig(org, appName, arcExt, inclCD, arcsFirst))
703
704
705
706
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
707
return 1;
708
709
710
} /* cmd_setsaneconfig */
711
712
static int cmd_mkdir(char *args)
{
713
714
715
716
717
718
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
719
720
721
722
723
if (PHYSFS_mkdir(args))
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
724
return 1;
725
726
727
728
729
} /* cmd_mkdir */
static int cmd_delete(char *args)
{
730
731
732
733
734
735
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
736
737
738
739
740
if (PHYSFS_delete(args))
printf("Successful.\n");
else
printf("Failure. reason: %s.\n", PHYSFS_getLastError());
741
return 1;
742
743
744
745
746
} /* cmd_delete */
static int cmd_getrealdir(char *args)
{
747
748
749
750
751
752
753
754
755
const char *rc;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
rc = PHYSFS_getRealDir(args);
756
757
758
759
760
if (rc)
printf("Found at [%s].\n", rc);
else
printf("Not found.\n");
761
return 1;
762
763
764
765
766
} /* cmd_getrealdir */
static int cmd_exists(char *args)
{
767
768
769
770
771
772
773
774
775
int rc;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
rc = PHYSFS_exists(args);
776
printf("File %sexists.\n", rc ? "" : "does not ");
777
return 1;
778
779
780
781
782
} /* cmd_exists */
static int cmd_isdir(char *args)
{
783
PHYSFS_Stat statbuf;
784
785
786
787
788
789
790
791
int rc;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
792
793
794
rc = PHYSFS_stat(args, &statbuf);
if (rc)
rc = (statbuf.filetype == PHYSFS_FILETYPE_DIRECTORY);
795
printf("File %s a directory.\n", rc ? "is" : "is NOT");
796
return 1;
797
798
799
800
801
} /* cmd_isdir */
static int cmd_issymlink(char *args)
{
802
PHYSFS_Stat statbuf;
803
804
805
806
807
808
809
810
int rc;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
811
812
813
rc = PHYSFS_stat(args, &statbuf);
if (rc)
rc = (statbuf.filetype == PHYSFS_FILETYPE_SYMLINK);
814
printf("File %s a symlink.\n", rc ? "is" : "is NOT");
815
return 1;
816
817
818
} /* cmd_issymlink */
819
820
static int cmd_cat(char *args)
{
821
PHYSFS_File *f;
822
823
824
825
826
827
828
829
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
f = PHYSFS_openRead(args);
830
831
832
833
if (f == NULL)
printf("failed to open. Reason: [%s].\n", PHYSFS_getLastError());
else
{
834
835
836
837
838
839
840
if (do_buffer_size)
{
if (!PHYSFS_setBuffer(f, do_buffer_size))
{
printf("failed to set file buffer. Reason: [%s].\n",
PHYSFS_getLastError());
PHYSFS_close(f);
841
return 1;
842
843
844
} /* if */
} /* if */
845
846
847
while (1)
{
char buffer[128];
848
849
PHYSFS_sint64 rc;
PHYSFS_sint64 i;
850
rc = PHYSFS_readBytes(f, buffer, sizeof (buffer));
851
852
853
854
855
856
857
858
for (i = 0; i < rc; i++)
fputc((int) buffer[i], stdout);
if (rc < sizeof (buffer))
{
printf("\n\n");
if (!PHYSFS_eof(f))
859
860
861
862
{
printf("\n (Error condition in reading. Reason: [%s])\n\n",
PHYSFS_getLastError());
} /* if */
863
PHYSFS_close(f);
864
return 1;
865
866
867
868
} /* if */
} /* while */
} /* else */
869
return 1;
870
871
872
} /* cmd_cat */
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
#define CRC32_BUFFERSIZE 512
static int cmd_crc32(char *args)
{
PHYSFS_File *f;
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
f = PHYSFS_openRead(args);
if (f == NULL)
printf("failed to open. Reason: [%s].\n", PHYSFS_getLastError());
else
{
PHYSFS_uint8 buffer[CRC32_BUFFERSIZE];
PHYSFS_uint32 crc = -1;
PHYSFS_sint64 bytesread;
893
while ((bytesread = PHYSFS_readBytes(f, buffer, CRC32_BUFFERSIZE)) > 0)
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
{
PHYSFS_uint32 i, bit;
for (i = 0; i < bytesread; i++)
{
for (bit = 0; bit < 8; bit++, buffer[i] >>= 1)
crc = (crc >> 1) ^ (((crc ^ buffer[i]) & 1) ? 0xEDB88320 : 0);
} /* for */
} /* while */
if (bytesread < 0)
{
printf("error while reading. Reason: [%s].\n",
PHYSFS_getLastError());
return 1;
} /* if */
PHYSFS_close(f);
crc ^= -1;
printf("CRC32 for %s: 0x%08X\n", args, crc);
} /* else */
return 1;
} /* cmd_crc32 */
920
921
static int cmd_filelength(char *args)
{
922
PHYSFS_File *f;
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
f = PHYSFS_openRead(args);
if (f == NULL)
printf("failed to open. Reason: [%s].\n", PHYSFS_getLastError());
else
{
PHYSFS_sint64 len = PHYSFS_fileLength(f);
if (len == -1)
printf("failed to determine length. Reason: [%s].\n", PHYSFS_getLastError());
else
printf(" (cast to int) %d bytes.\n", (int) len);
PHYSFS_close(f);
} /* else */
944
return 1;
945
946
947
948
949
950
} /* cmd_filelength */
#define WRITESTR "The cat sat on the mat.\n\n"
static int cmd_append(char *args)
{
951
PHYSFS_File *f;
952
953
954
955
956
957
958
959
960
961
962
963
if (*args == '\"')
{
args++;
args[strlen(args) - 1] = '\0';
} /* if */
f = PHYSFS_openAppend(args);
if (f == NULL)
printf("failed to open. Reason: [%s].\n", PHYSFS_getLastError());
else
{
964
965
966
967
968
969
970
971
972
973
size_t bw;
PHYSFS_sint64 rc;
if (do_buffer_size)
{
if (!PHYSFS_setBuffer(f, do_buffer_size))
{
printf("failed to set file buffer. Reason: [%s].\n",
PHYSFS_getLastError());
PHYSFS_close(f);
974
return 1;
975
976
977
978
} /* if */
} /* if */
bw = strlen(WRITESTR);
979
rc = PHYSFS_writeBytes(f, WRITESTR, bw);
980
981
if (rc != bw)
{
982
983
printf("Wrote (%d) of (%d) bytes. Reason: [%s].\n",
(int) rc, (int) bw, PHYSFS_getLastError());
984
985
986
987
988
989
990
991
992
} /* if */
else
{
printf("Successful.\n");
} /* else */
PHYSFS_close(f);
} /* else */
993
return 1;
994
995
996
997
998
} /* cmd_append */
static int cmd_write(char *args)
{
999
PHYSFS_File *f;
1000