File: ex_memfile.c

package info (click to toggle)
allegro5 2%3A5.2.10.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 10,820 kB
  • sloc: ansic: 109,795; cpp: 12,976; objc: 4,592; java: 2,845; python: 2,595; javascript: 1,238; sh: 1,008; makefile: 40; xml: 27; pascal: 24
file content (119 lines) | stat: -rw-r--r-- 2,790 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
 *      Example program for the Allegro library.
 *
 *      Test memfile addon.
 */

#include <stdio.h>
#ifdef _MSC_VER
   #pragma comment ( linker, "/SUBSYSTEM:CONSOLE")
#endif
#define ALLEGRO_USE_CONSOLE
#include <allegro5/allegro.h>
#include <allegro5/allegro_memfile.h>

#include "common.c"

int main(void)
{
   ALLEGRO_FILE *memfile;
   char *data;
   int i;
   const int data_size = 1024;
   char buffer[50];

   if (!al_init()) {
      abort_example("Could not init Allegro.\n");
   }

   open_log();

   data = calloc(1, data_size);
   if (!data)
      abort_example("Out of memory.\n");
   
   log_printf("Creating memfile\n");
   memfile = al_open_memfile(data, data_size, "rw");
   if (!memfile) {
      log_printf("Error opening memfile :(\n");
      goto Error;
   }

   log_printf("Writing data to memfile\n");
   for (i = 0; i < data_size/4; i++) {
      if (al_fwrite32le(memfile, i) < 4) {
         log_printf("Failed to write %i to memfile\n", i);
         goto Error;
      }
   }

   al_fseek(memfile, 0, ALLEGRO_SEEK_SET);

   log_printf("Reading and testing data from memfile\n");
   for (i = 0; i < data_size/4; i++) {
      int32_t ret = al_fread32le(memfile);
      if (ret != i || al_feof(memfile)) {
         log_printf("Item %i failed to verify, got %i\n", i, ret);
         goto Error;
      }
   }

   if (al_feof(memfile)) {
      log_printf("EOF indicator prematurely set!\n");
      goto Error;
   }
   
   /* testing the ungetc buffer */
   al_fseek(memfile, 0, ALLEGRO_SEEK_SET);
   
   for (i = 0; al_fungetc(memfile, i) != EOF; ++i) { }
   log_printf("Length of ungetc buffer: %d\n", i);
   
   if (al_ftell(memfile) != -i) {
      log_printf("Current position is not correct. Expected -%d, but got %d\n",
         i, (int) al_ftell(memfile));
      goto Error;
   }
   
   while (i--) {
      if (i != al_fgetc(memfile)) {
         log_printf("Failed to verify ungetc data.\n");
         goto Error;
      }
   }
   
   if (al_ftell(memfile) != 0) {
      log_printf("Current position is not correct after reading back the ungetc buffer\n");
      log_printf("Expected 0, but got %d\n", (int) al_ftell(memfile));
      goto Error;
   }
   
   al_fputs(memfile, "legro rocks!");
   al_fseek(memfile, 0, ALLEGRO_SEEK_SET);
   al_fungetc(memfile, 'l');
   al_fungetc(memfile, 'A');
   al_fgets(memfile, buffer, 15);
   if (strcmp(buffer, "Allegro rocks!")) {
      log_printf("Expected to see 'Allegro rocks!' but got '%s' instead.\n", buffer);
      log_printf("(Maybe the ungetc buffer isn't big enough.)\n");
      goto Error;
   }   

   log_printf("Done.\n");

   al_fclose(memfile);
   free(data);

   close_log(true);

   return 0;

Error:

   al_fclose(memfile);
   free(data);

   close_log(true);
   return 1;
}
/* vim: set sts=3 sw=3 et: */