ldc: Small fixes (includes, less warnings etc.)
[h316.git] / pc-tools / ldc / split.c
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <unistd.h>
6
7 #include "hw_types.h"
8 #include "hw_helpers.h"
9 #include "process.h"
10 #include "split.h"
11
12 #define CHAR_START 0x81
13 #define CHAR_END 0223
14
15
16 //#define STOP1 0x83
17 //#define STOP1 0x93
18 //#define STOP1 0xff
19
20
21 int fd=-3;
22 int number=0;
23
24
25 enum{OUTSIDE,INSIDE_ASM,INSIDE_FORT};
26 int state = OUTSIDE;
27 extern int splitnum;
28
29 #define bstart_l 1
30 #define bend_l 2
31 #define endseq_l 3
32 char bstart_str[bstart_l] = {CHAR_START};
33 char bend_str[bend_l] = {CHAR_END,0xff};
34 char endseq_str[endseq_l] = {0x83,0x93,0xff};
35
36 void split_init(){
37 }
38
39
40 void split(datablock * block){
41 if ((block->type==BT_STOP) && splitnum){
42 char filename[200];
43 number+=10;
44 snprintf(filename,200,"%04i-STOP",number);
45 fd=open (filename,O_WRONLY|O_CREAT|O_TRUNC,00644);
46 write(fd,endseq_str,endseq_l);
47 close (fd);
48 return;
49 }
50
51 if (block->type!=BT_DATA) return;
52
53 switch (state){
54 case OUTSIDE:
55 if (get_blocktype(block)==6){
56 char* fn = extract_label6(block);
57 char filename[200];
58 number+=10;
59 if (splitnum) snprintf(filename,200,"%04i-%s",number,fn);
60 else snprintf(filename,200,"%s",fn);
61 free(fn);
62 while (filename[strlen(filename)-1]==' ')filename [strlen(filename)-1]=0;
63 fd=open (filename,O_WRONLY|O_CREAT|O_TRUNC,00644);
64 state=INSIDE_FORT;
65 write(fd,bstart_str,bstart_l);
66 write(fd,block->raw_data,(block->size)*3);
67 write(fd,bend_str,bend_l);
68 }
69
70 if ((get_blocktype(block)==0)&& (get_blocksubtype(block)==0)){
71 char ** labels=extract_labels0(block);
72 char* fn = labels[0];
73 char filename[200];
74 number+=10;
75 if (splitnum) snprintf(filename,200,"%04i-%s",number,fn);
76 else snprintf(filename,200,"%s",fn);
77
78 while (filename[strlen(filename)-1]==' ')filename [strlen(filename)-1]=0;
79 fd=open (filename,O_WRONLY|O_CREAT|O_TRUNC,00644);
80 dispose_labels(labels);
81
82 state=INSIDE_ASM;
83 write(fd,bstart_str,bstart_l);
84 write(fd,block->raw_data,(block->size)*3);
85 write(fd,bend_str,bend_l);
86 }
87 break;
88
89 case INSIDE_ASM:
90 write(fd,bstart_str,bstart_l);
91 write(fd,block->raw_data,(block->size)*3);
92 write(fd,bend_str,bend_l);
93 if (get_blocksubtype(block)==014){
94 state=OUTSIDE;
95 close(fd);
96 }
97 break;
98
99 case INSIDE_FORT:
100 write(fd,bstart_str,bstart_l);
101 write(fd,block->raw_data,(block->size)*3);
102 write(fd,bend_str,bend_l);
103 if ((get_blocktype(block)==3)||get_blocktype(block)==4){
104 state=OUTSIDE;
105 close(fd);
106 }
107 break;
108 }
109 }