437b3ba8 |
1 | #include <stdio.h> |
2 | #include <sys/types.h> |
3 | #include <sys/stat.h> |
4 | #include <fcntl.h> |
d34afc1e |
5 | #include <unistd.h> |
437b3ba8 |
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 | } |