boot-maker: Fix warnings (missing header file)
[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>
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
20int fd=-3;
21int number=0;
22
23
24enum{OUTSIDE,INSIDE_ASM,INSIDE_FORT};
25int state = OUTSIDE;
26extern int splitnum;
27
28#define bstart_l 1
29#define bend_l 2
30#define endseq_l 3
31char bstart_str[bstart_l] = {CHAR_START};
32char bend_str[bend_l] = {CHAR_END,0xff};
33char endseq_str[endseq_l] = {0x83,0x93,0xff};
34
35void split_init(){
36}
37
38
39void 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}