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;
|
fixes for gcc 5.4
Stefan Schuermans authored 8 years ago
|
20) int cnt, z1, z2, newline;
|
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
|
fixes for gcc 5.4
Stefan Schuermans authored 8 years ago
|
49) z1 = fscanf( p_file, "%*[ \t\r]" );
|
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 );
|
fixes for gcc 5.4
Stefan Schuermans authored 8 years ago
|
51) z2 = fscanf( p_file, "%*[ \t\r]" );
|
initial commit of files fro...
Stefan Schuermans authored 8 years ago
|
52) newline = fgetc( p_file ) == '\n';
|
fixes for gcc 5.4
Stefan Schuermans authored 8 years ago
|
53) if( z1 != 0 || cnt != 2 || z2 != 0 || ! newline )
|
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
|
fixes for gcc 5.4
Stefan Schuermans authored 8 years ago
|
162) z1 = fscanf( p_file, "%*[ \t\r]" );
|
initial commit of files fro...
Stefan Schuermans authored 8 years ago
|
163) newline = fgetc( p_file ) == '\n';
|
fixes for gcc 5.4
Stefan Schuermans authored 8 years ago
|
164) if( z1 != 0 || ! newline )
|