ac4dad5a6b94d9de90a04334f0cc8c29699c60e4
Stefan Schuermans initial commit of files fro...

Stefan Schuermans authored 8 years ago

1) /* bluebox distributor
2)  * version 0.3.2 date 2007-07-18
3)  * Copyright (C) 2006-2007 Stefan Schuermans <stefan@blinkenarea.org>
4)  * Copyleft: GNU public license V2.0 - http://www.gnu.org/copyleft/gpl.html
5)  * a BlinkenArea project - http://www.blinkenarea.org/
6)  */
7) 
8) #include <stdio.h>
9) #include <malloc.h>
10) 
11) #include "bd_config.h"
12) #include "bd_fmt.h"
13) 
14) //load a format file
15) //returns pointer to malloc-ed st_bd_fmt structure on success, NULL on error
16) st_bd_fmt * bd_fmt_load( char * filename )
17) {
18)   FILE * p_file;
19)   st_bd_fmt * p_bd_fmt;
Stefan Schuermans fixes for gcc 5.4

Stefan Schuermans authored 8 years ago

20)   int cnt, z1, z2, newline;
Stefan Schuermans initial commit of files fro...

Stefan Schuermans authored 8 years ago

21)   unsigned short x, y;
22)   char buffer[16];
23) 
24)   //check filename (fopen segaults in these cases)
25)   if( filename == NULL || filename[0] == 0 )
26)   {
27)     printf( "bd_fmt: no format file was supplied\n" );
28)     return NULL;
29)   }
30) 
31)   //open file
32)   p_file = fopen( filename, "rt" );
33)   if( p_file == NULL )
34)   {
35)     printf( "bd_fmt: could not open format file \"%s\"\n", filename );
36)     return NULL;
37)   }
38) 
39)   //allocate structure
40)   p_bd_fmt = (st_bd_fmt *)malloc( sizeof( st_bd_fmt ) );
41)   if( p_bd_fmt == NULL )
42)   {
43)     fclose( p_file );
44)     printf( "bd_fmt: could not allocate format structure\n" );
45)     return NULL;
46)   }
47) 
48)   //read width and height
Stefan Schuermans fixes for gcc 5.4

Stefan Schuermans authored 8 years ago

49)   z1 = fscanf( p_file, "%*[ \t\r]" );
Stefan Schuermans initial commit of files fro...

Stefan Schuermans authored 8 years ago

50)   cnt = fscanf( p_file, "%hu%*[ \t\r]%hu", &p_bd_fmt->width, &p_bd_fmt->height );
Stefan Schuermans fixes for gcc 5.4

Stefan Schuermans authored 8 years ago

51)   z2 = fscanf( p_file, "%*[ \t\r]" );
Stefan Schuermans initial commit of files fro...

Stefan Schuermans authored 8 years ago

52)   newline = fgetc( p_file ) == '\n';
Stefan Schuermans fixes for gcc 5.4

Stefan Schuermans authored 8 years ago

53)   if( z1 != 0 || cnt != 2 || z2 != 0 || ! newline )
Stefan Schuermans initial commit of files fro...

Stefan Schuermans authored 8 years ago

54)   {
55)     free( p_bd_fmt );
56)     fclose( p_file );
57)     printf( "bd_fmt: could not read dimensions (\"<width> <height>\")\n" );
58)     return NULL;
59)   }
60)   if( p_bd_fmt->width < 1 || p_bd_fmt->width > 1000 || p_bd_fmt->height < 1 || p_bd_fmt->height > 1000 )
61)   {
62)     free( p_bd_fmt );
63)     fclose( p_file );
64)     printf( "bd_fmt: invalid dimensions (\"%d %d\")\n", p_bd_fmt->width, p_bd_fmt->height );
65)     return NULL;
66)   }
67) 
68)   //allocate two-dimensional array for format pixels
69)   p_bd_fmt->pixels = (st_bd_fmt_pix * *)malloc( p_bd_fmt->height * sizeof( st_bd_fmt_pix * ) );
70)   if( p_bd_fmt->pixels == NULL )
71)   {
72)     free( p_bd_fmt );
73)     fclose( p_file );
74)     printf( "bd_fmt: could not allocate pixel buffer for format structure\n" );
75)     return NULL;
76)   }
77)   for( y = 0; y < p_bd_fmt->height; y++ )
78)   {
79)     p_bd_fmt->pixels[y] = (st_bd_fmt_pix *)malloc( p_bd_fmt->width * sizeof( st_bd_fmt_pix ) );
80)     if( p_bd_fmt->pixels[y] == NULL )
81)     {
82)       for( y-- ; (short)y >= 0; y-- )
83)         free( p_bd_fmt->pixels[y] );
84)       free( p_bd_fmt->pixels );
85)       free( p_bd_fmt );
86)       fclose( p_file );
87)       printf( "bd_fmt: could not allocate pixel buffer for format structure\n" );
88)       return NULL;
89)     }
90)   }
91) 
92)   //read format pixels
93)   for( y = 0; y < p_bd_fmt->height; y++ )
94)   {
95)     for( x = 0; x < p_bd_fmt->width; x++ )
96)     {
97)       //read in whitespace
98)       cnt = fscanf( p_file, "%1[ \t\r]%*[ \t\r]", buffer );
99)       if( x > 0 && cnt != 1 ) //there must be whitespace if not in the first column
100)       {
101)         printf( "bd_fmt: missing whitespace before pixel in column %d of row %d\n", x, y );
102)         break;
103)       }
104)       //pixel is invalid by default
105)       p_bd_fmt->pixels[y][x].valid = 0;
106)       //check if ignore pixel
107)       cnt = fscanf( p_file, "%1[.,/-]", buffer );
108)       //it is an ignore pixel
109)       if( cnt == 1 )
110)       {
111)         //mark pixel as invalid
112)         p_bd_fmt->pixels[y][x].dev_no = -1;
113)         p_bd_fmt->pixels[y][x].ser_no = -1;
114)         p_bd_fmt->pixels[y][x].pix_no = -1;
115)         p_bd_fmt->pixels[y][x].out_buf_ofs = -1;
116)         p_bd_fmt->pixels[y][x].sync_bit = 0x80;
117)         p_bd_fmt->pixels[y][x].valid = 0;
118)       }
119)       //it is not an ignore pixel
120)       else
121)       {
122)         //read pixel
123)         cnt = fscanf( p_file,
124)                       "%hu%*[.,/-]%hu%*[.,/-]%hu",
125)                       &p_bd_fmt->pixels[y][x].dev_no,
126)                       &p_bd_fmt->pixels[y][x].ser_no,
127)                       &p_bd_fmt->pixels[y][x].pix_no );
128)         //success
129)         if( cnt == 3 )
130)         {
131)           //check values
132)           if( p_bd_fmt->pixels[y][x].dev_no >= bd_out_dev_cnt
133)            || p_bd_fmt->pixels[y][x].ser_no >= bd_out_ser_cnt
134)            || p_bd_fmt->pixels[y][x].pix_no >= bd_out_pix_cnt )
135)           {
136)             printf( "bd_fmt: pixel in column %d of row %d (\"%d-%d-%d\") does not exist\n",
137)                     x, y,
138)                     p_bd_fmt->pixels[y][x].dev_no,
139)                     p_bd_fmt->pixels[y][x].ser_no,
140)                     p_bd_fmt->pixels[y][x].pix_no );
141)             break;
142)           }
143)           //calculate offset into output buffer
144)           p_bd_fmt->pixels[y][x].out_buf_ofs = (1 + p_bd_fmt->pixels[y][x].pix_no) * bd_out_ser_cnt
145)                                              + p_bd_fmt->pixels[y][x].ser_no;
146)           //save sync bit
147)           p_bd_fmt->pixels[y][x].sync_bit = p_bd_fmt->pixels[y][x].pix_no == 0 ? 0x80 : 0x00;
148)           //mark pixel as valid
149)           p_bd_fmt->pixels[y][x].valid = 1;
150)         }
151)         else
152)         {
153)           printf( "bd_fmt: pixel in column %d of row %d has invalid format\n", x, y );
154)           break;
155)         }
156)       } //it is not an ignore pixel
157)     } //for( x ...
158)     //end outer loop if error during inner loop
159)     if( x < p_bd_fmt->width )
160)       break;
161)     //read newline
Stefan Schuermans fixes for gcc 5.4

Stefan Schuermans authored 8 years ago

162)     z1 = fscanf( p_file, "%*[ \t\r]" );
Stefan Schuermans initial commit of files fro...

Stefan Schuermans authored 8 years ago

163)     newline = fgetc( p_file ) == '\n';
Stefan Schuermans fixes for gcc 5.4

Stefan Schuermans authored 8 years ago

164)     if( z1 != 0 || ! newline )