ldc: Small fixes (includes, less warnings etc.)
[h316.git] / pc-tools / ldc / split.c
CommitLineData
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
21int fd=-3;
22int number=0;
23
24
25enum{OUTSIDE,INSIDE_ASM,INSIDE_FORT};
26int state = OUTSIDE;
27extern int splitnum;
28
29#define bstart_l 1
30#define bend_l 2
31#define endseq_l 3
32char bstart_str[bstart_l] = {CHAR_START};
33char bend_str[bend_l] = {CHAR_END,0xff};
34char endseq_str[endseq_l] = {0x83,0x93,0xff};
35
36void split_init(){
37}
38
39
40void 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}