/[public]/psiconv/trunk/lib/psiconv/generate_simple.c
ViewVC logotype

Annotation of /psiconv/trunk/lib/psiconv/generate_simple.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 231 - (hide annotations)
Wed Feb 25 20:57:10 2004 UTC (20 years, 2 months ago) by frodo
File MIME type: text/plain
File size: 6161 byte(s)
(Frodo) Progress information while generating update

Much better progress information now, and better error reporting.

1 frodo 71 /*
2     generate_simple.c - Part of psiconv, a PSION 5 file formats converter
3 frodo 196 Copyright (c) 2000-2004 Frodo Looijaard <frodol@dds.nl>
4 frodo 71
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9    
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13     GNU General Public License for more details.
14    
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18     */
19    
20 frodo 168
21 frodo 71 #include "config.h"
22     #include "compat.h"
23    
24 frodo 184 #include <string.h>
25     #include <stdlib.h>
26    
27 frodo 71 #include "generate_routines.h"
28     #include "error.h"
29    
30 frodo 142 #ifdef DMALLOC
31     #include <dmalloc.h>
32     #endif
33    
34 frodo 184 static int psiconv_write_string_aux(const psiconv_config config,
35     psiconv_buffer buf, int lev,
36     const psiconv_string_t value,int kind);
37 frodo 142
38 frodo 184 int psiconv_write_u8(const psiconv_config config,psiconv_buffer buf,
39     int lev,const psiconv_u8 value)
40 frodo 71 {
41 frodo 79 return psiconv_buffer_add(buf,value);
42 frodo 71 }
43    
44 frodo 184 int psiconv_write_u16(const psiconv_config config,psiconv_buffer buf,
45     int lev,const psiconv_u16 value)
46 frodo 71 {
47     int res;
48 frodo 79 if ((res = psiconv_buffer_add(buf,value & 0xff)))
49 frodo 71 return res;
50 frodo 79 return psiconv_buffer_add(buf,(value & 0xff00) >> 8);
51 frodo 71 }
52    
53 frodo 184 int psiconv_write_u32(const psiconv_config config,psiconv_buffer buf,
54     int lev,const psiconv_u32 value)
55 frodo 71 {
56     int res;
57 frodo 79 if ((res = psiconv_buffer_add(buf,value & 0xff)))
58 frodo 71 return res;
59 frodo 79 if ((res = psiconv_buffer_add(buf,(value & 0xff00) >> 8)))
60 frodo 71 return res;
61 frodo 79 if ((res = psiconv_buffer_add(buf,(value & 0xff0000) >> 16)))
62 frodo 71 return res;
63 frodo 79 return psiconv_buffer_add(buf,(value & 0xff000000) >> 24);
64 frodo 71 }
65    
66 frodo 184 int psiconv_write_S(const psiconv_config config,psiconv_buffer buf,
67     int lev,const psiconv_u32 value)
68 frodo 71 {
69 frodo 184 psiconv_progress(config,lev,0,"Writing S");
70 frodo 71 if (value < 0x40)
71 frodo 184 return psiconv_write_u8(config,buf,lev+1,value * 4 + 2);
72 frodo 71 else if (value < 0x2000)
73 frodo 184 return psiconv_write_u16(config,buf,lev+1,value * 8 + 3);
74 frodo 71 else {
75 frodo 184 psiconv_error(config,0,psiconv_buffer_length(buf),
76 frodo 71 "Don't know how to write S value larger than 0x2000 "
77     "(trying %x)",value);
78     return -PSICONV_E_GENERATE;
79     }
80     }
81    
82 frodo 184 int psiconv_write_X(const psiconv_config config,psiconv_buffer buf,
83     int lev, const psiconv_u32 value)
84 frodo 71 {
85 frodo 184 psiconv_progress(config,lev,0,"Writing X");
86 frodo 71 if (value < 0x80)
87 frodo 184 return psiconv_write_u8(config,buf,lev+1,value * 2);
88 frodo 71 else if (value < 0x4000)
89 frodo 184 return psiconv_write_u16(config,buf,lev+1,value * 4 + 1);
90 frodo 71 else if (value < 0x20000000)
91 frodo 184 return psiconv_write_u16(config,buf,lev+1,value * 8 + 3);
92 frodo 71 else {
93 frodo 184 psiconv_error(config,0,psiconv_buffer_length(buf),
94 frodo 71 "Don't know how to write X value larger than 0x20000000 "
95     "(trying %x)",value);
96     return -PSICONV_E_GENERATE;
97     }
98     }
99    
100 frodo 184 int psiconv_write_length(const psiconv_config config,psiconv_buffer buf,
101     int lev,const psiconv_length_t value)
102 frodo 71 {
103 frodo 184 return psiconv_write_u32(config,buf,lev+1,value * (1440.0/2.54) + 0.5);
104 frodo 71 }
105    
106 frodo 184 int psiconv_write_size(const psiconv_config config,psiconv_buffer buf,
107     int lev, psiconv_size_t value)
108 frodo 71 {
109 frodo 184 return psiconv_write_u32(config,buf,lev+1,value * 20.0 + 0.5);
110 frodo 71 }
111    
112 frodo 184 int psiconv_write_bool(const psiconv_config config,psiconv_buffer buf,
113     int lev,const psiconv_bool_t value)
114 frodo 71 {
115 frodo 72 if ((value != psiconv_bool_true) && (value != psiconv_bool_false))
116 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),
117 frodo 72 "Boolean has non-enum value (found %d)",value);
118 frodo 184 return psiconv_write_u8(config,buf,lev+1,value == psiconv_bool_false?0:1);
119 frodo 71 }
120    
121 frodo 184 int psiconv_write_string(const psiconv_config config,psiconv_buffer buf,
122     int lev, const psiconv_string_t value)
123 frodo 71 {
124 frodo 231 int res;
125 frodo 184 psiconv_progress(config,lev,0,"Writing string");
126 frodo 231 res = psiconv_write_string_aux(config,buf,lev+1,value,-1);
127     if (res)
128     psiconv_error(config,lev,0,"Writing of string failed");
129     else
130     psiconv_progress(config,lev,0,"End of string");
131     return res;
132 frodo 182 }
133    
134 frodo 184 int psiconv_write_short_string(const psiconv_config config,psiconv_buffer buf,
135     int lev,const psiconv_string_t value)
136 frodo 182 {
137 frodo 231 int res;
138 frodo 184 psiconv_progress(config,lev,0,"Writing short string");
139 frodo 231 res = psiconv_write_string_aux(config,buf,lev+1,value,-2);
140     if (res)
141     psiconv_error(config,lev,0,"Writing of short string failed");
142     else
143     psiconv_progress(config,lev,0,"End of short string");
144     return res;
145 frodo 182 }
146    
147 frodo 184 int psiconv_write_charlist(const psiconv_config config,psiconv_buffer buf,
148     int lev,const psiconv_string_t value)
149 frodo 182 {
150 frodo 231 int res;
151     psiconv_progress(config,lev,0,"Writing charlist");
152     res = psiconv_write_string_aux(config,buf,lev+1,value,0);
153     if (res)
154     psiconv_error(config,lev,0,"Writing of charlist failed");
155     else
156     psiconv_progress(config,lev,0,"End of charlist");
157     return res;
158 frodo 184 }
159    
160    
161     int psiconv_write_string_aux(const psiconv_config config,psiconv_buffer buf,
162     int lev, const psiconv_string_t value,int kind)
163     {
164     int res,i,len;
165    
166     len = psiconv_unicode_strlen(value);
167 frodo 72 if (!value) {
168 frodo 231 psiconv_error(config,lev,0, "NULL string");
169 frodo 72 return -PSICONV_E_GENERATE;
170     }
171 frodo 184 if (kind == -1)
172     res = psiconv_write_S(config,buf,lev+1,len);
173     else if (kind == -2)
174     res = psiconv_write_u8(config,buf,lev+1,len);
175 frodo 182 else
176 frodo 184 res = 0;
177 frodo 182 if (res)
178 frodo 71 return res;
179 frodo 184
180     for (i = 0; i < len; i++)
181 frodo 217 if ((res = psiconv_unicode_write_char(config,buf,lev+1,value[i])))
182 frodo 71 return res;
183     return -PSICONV_E_OK;
184     }
185 frodo 80
186 frodo 184 int psiconv_write_offset(const psiconv_config config,psiconv_buffer buf,
187     int lev,psiconv_u32 id)
188 frodo 80 {
189     return psiconv_buffer_add_reference(buf,id);
190     }

frodo@frodo.looijaard.name
ViewVC Help
Powered by ViewVC 1.1.26