]> AND Private Git Repository - Cipher_code.git/blob - Hash/pixmap_io.c
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
yes
[Cipher_code.git] / Hash / pixmap_io.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <time.h>
4 #include <errno.h>
5 #include <fcntl.h>
6 #include <string.h>
7
8 #ifdef unix
9 #include <unistd.h>
10 #include <sys/stat.h>
11 #define O_BINARY 0
12 #define IO_LEN  (1<<30) 
13 #endif
14
15 #if defined(THINK_C) || defined(__MWERKS__)
16 #include <unix.h>
17 #define IO_LEN  (1<<14) 
18 #endif
19
20 #ifndef FALSE
21 #define FALSE (0)
22 #define TRUE (1)
23 #endif
24
25 #ifdef sun
26 extern char *sys_errlist[];
27 char *strerror(int err)
28 {
29 return sys_errlist[err];
30 }
31 #endif
32
33 #include "pixmap_io.h"
34
35 #define MAGIC_PGM       "P5\n"
36 #define MAGIC_PPM       "P6\n"
37
38 static int match_key(int fd, char *key)
39 {
40   char buf[80];
41
42   read(fd, buf, strlen(key));
43   if( strncmp(buf, key, strlen(key)) != 0 )
44     return FALSE;
45   else
46     return TRUE;
47 }
48
49 static void skip_comment(int fd, char code, char *c)
50 {
51   while( *c == code )
52     {
53       while( (read(fd, c, 1) == 1 ) && (*c != '\n') ) ;
54       read(fd, c, 1);
55     }
56 }
57
58 static void read_header_line(int fd, char *buf)
59 {
60   int i;
61
62   i = 1;
63   while( (read(fd, &buf[i], 1) == 1 ) && (buf[i] != '\n') && (buf[i] != '\r') && (i<79) )
64     i++;
65   buf[i] = 0;
66 }
67
68 static int get_pgm_header(int fd, char *magic, int *width, int *height)
69 {
70   char buf[80];
71
72   if( !match_key(fd, magic) )
73     return FALSE;
74   read(fd, buf, 1);
75   skip_comment(fd, '#', buf);
76   read_header_line(fd, buf);
77   sscanf(buf, "%d %d", width, height);
78   read(fd, buf, 1);
79   skip_comment(fd, '#', buf);
80   read_header_line(fd, buf);
81   return TRUE;
82 }
83
84 static int open_read(char *filename)
85 {
86   int fd;
87
88   if( (fd = open(filename, O_BINARY|O_RDONLY)) < 0 )
89     fprintf(stderr, "can't reset file `%s': %s\n", filename, strerror(errno));
90   return fd;
91 }
92
93 static int open_read_pixmap(char *filename, char *magic, int *width, int *height)
94 {
95   int fd;
96
97   if( (fd = open_read(filename)) < 0)
98     return fd;
99   if( !get_pgm_header(fd, magic, width, height) )
100     {
101       fprintf(stderr, "can't read header of %s\n", filename);
102       return -1;
103     }
104   return fd;
105 }
106
107 static unsigned char *alloc_pixmap(long size)
108 {
109   unsigned char *data;
110
111   if( (data = (unsigned char *)malloc(size)) == NULL )
112     {
113     fprintf(stderr, "malloc error\n");
114     return NULL;
115     }
116   return data;
117 }
118
119 static void load_data(int fd, unsigned char *data, long size)
120 {
121   char *buffer;
122   int count;
123
124   buffer = (char *)data;
125   while( size > 0 )
126     {
127     count = IO_LEN;
128     if( count > size )
129       count = size;
130     read(fd, buffer, count);
131     buffer += count;
132     size -= count;
133     }
134 }
135
136 static void load_chunky(int fd, unsigned char *R_data, unsigned char *G_data, unsigned char *B_data, int width, int height)
137 {
138   unsigned char *buffer, *buf, *buf_R, *buf_G, *buf_B;
139   int count;
140
141   buffer = alloc_pixmap(3L*width);
142   buf_R = R_data;
143   buf_G = G_data;
144   buf_B = B_data;
145   for( ; height > 0; height-- )
146     {
147     load_data(fd, buffer, 3L*width);
148     count = width;
149     buf = buffer;
150     while( count-- > 0 )
151       {
152       *buf_R++ = *buf++;
153       *buf_G++ = *buf++;
154       *buf_B++ = *buf++;
155       }
156     }
157   free(buffer);
158 }
159
160 unsigned char *load_pixmap(char *filename, int *width, int *height)
161 {
162   int fd;
163   long size;
164   unsigned char *data;
165
166   if( (fd = open_read_pixmap(filename, MAGIC_PGM, width, height)) < 0)
167     return NULL;
168   size = (long)*width * *height;
169   data = alloc_pixmap(size);
170   if( data != NULL )
171     load_data(fd, data, size);
172   close(fd);
173   return data;
174 }
175
176 int load_RGB_pixmap(char *filename, int *width, int *height, unsigned char**R_data, unsigned char**G_data, unsigned char**B_data)
177 {
178   int fd;
179   long size;
180
181   if( (fd = open_read_pixmap(filename, MAGIC_PPM, width, height)) < 0)
182     return FALSE;
183   size = (long)*width * *height;
184   *R_data = alloc_pixmap(size);
185   *G_data = alloc_pixmap(size);
186   *B_data = alloc_pixmap(size);
187   
188   if( (*R_data != NULL) && (*G_data != NULL ) && (*B_data != NULL ))
189     {
190     load_chunky(fd, *R_data, *G_data, *B_data, *width, *height);
191     close(fd);
192     return TRUE;
193     }
194
195   close(fd);
196   if( *R_data == NULL )
197     return FALSE;
198   free(*R_data);
199   if( *G_data == NULL )
200     return FALSE;
201   free(*G_data);
202   return FALSE;
203 }
204
205
206
207
208 static void put_header_line(int fd, char *buf)
209 {
210   write(fd, buf, strlen(buf));
211 }
212
213 static void put_header_info(int fd, char *mark, char *filename)
214 {
215   char buf[80];
216   time_t now;
217
218   sprintf(buf, "%sTitle: %s\n", mark, filename);
219   put_header_line(fd, buf);
220   now = time(NULL);
221   sprintf(buf, "%sCreationDate: %s", mark, ctime(&now));
222   put_header_line(fd, buf);
223   sprintf(buf, "%sCreator: pixmap_io, P. Chassignet\n", mark);
224   put_header_line(fd, buf);
225 }
226
227 static void put_pgm_header(int fd, char *magic, int width, int height, char *filename)
228 {
229   char buf[80];
230
231   put_header_line(fd, magic);
232   put_header_info(fd, "# ", filename);
233   sprintf(buf, "%d %d\n255\n", width, height);
234   put_header_line(fd, buf);
235 }
236
237 static int open_write(char *filename)
238 {
239   int fd;
240
241 #if defined(THINK_C) || defined(__MWERKS__)
242   if( (fd = open(filename, O_BINARY|O_CREAT|O_TRUNC|O_RDWR)) < 0 )
243 #else
244   if( (fd = open(filename, O_BINARY|O_CREAT|O_TRUNC|O_RDWR, S_IREAD|S_IWRITE)) < 0 )
245 #endif
246     fprintf(stderr, "can't rewrite file `%s': %s\n", filename, strerror(errno));
247   return fd;
248 }
249
250 static void store_data(int fd, unsigned char *data, long size)
251 {
252   char *buffer;
253   int count;
254   
255   buffer = (char *)data;
256   while( size > 0 )
257     {
258     count = IO_LEN;
259     if( count > size )
260       count = size;
261     write(fd, buffer, count);
262     buffer += count;
263     size -= count;
264     }
265 }
266
267 static void store_chunky(int fd, unsigned char *R_data, unsigned char *G_data, unsigned char *B_data, int width, int height)
268 {
269   unsigned char *buffer, *buf, *buf_R, *buf_G, *buf_B;
270   int count;
271
272   buffer = alloc_pixmap(3L*width);
273   buf_R = R_data;
274   buf_G = G_data;
275   buf_B = B_data;
276   for( ; height > 0; height-- )
277     {
278     count = width;
279     buf = buffer;
280     while( count-- > 0 )
281       {
282        *buf++ = *buf_R++;
283        *buf++ = *buf_G++;
284        *buf++ = *buf_B++;
285       }
286     store_data(fd, buffer, 3L*width);
287     }
288   free(buffer);
289 }
290
291 void store_pixmap(char *filename, unsigned char *data, int width, int height)
292 {
293   int fd;
294   
295   if( (fd = open_write(filename)) < 0 )
296     return;
297   put_pgm_header(fd, MAGIC_PGM, width, height, filename);
298   store_data(fd, data, (long)width*height);
299   close(fd);
300 }
301
302 void store_RGB_pixmap(char *filename, unsigned char *R_data, unsigned char *G_data, unsigned char *B_data, int width, int height)
303 {
304   int fd;
305   
306   if( (fd = open_write(filename)) < 0 )
307     return;
308   put_pgm_header(fd, MAGIC_PPM, width, height, filename);
309   store_chunky(fd, R_data, G_data, B_data, width, height);
310   close(fd);
311 }