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