437b3ba8 |
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 | } |