| … | |
… | |
| 36 | const psiconv_string_t value,int kind); |
36 | const psiconv_string_t value,int kind); |
| 37 | |
37 | |
| 38 | int psiconv_write_u8(const psiconv_config config,psiconv_buffer buf, |
38 | int psiconv_write_u8(const psiconv_config config,psiconv_buffer buf, |
| 39 | int lev,const psiconv_u8 value) |
39 | int lev,const psiconv_u8 value) |
| 40 | { |
40 | { |
| 41 | psiconv_progress(config,lev,0,"Writing u8"); |
|
|
| 42 | return psiconv_buffer_add(buf,value); |
41 | return psiconv_buffer_add(buf,value); |
| 43 | } |
42 | } |
| 44 | |
43 | |
| 45 | int psiconv_write_u16(const psiconv_config config,psiconv_buffer buf, |
44 | int psiconv_write_u16(const psiconv_config config,psiconv_buffer buf, |
| 46 | int lev,const psiconv_u16 value) |
45 | int lev,const psiconv_u16 value) |
| 47 | { |
46 | { |
| 48 | int res; |
47 | int res; |
| 49 | psiconv_progress(config,lev,0,"Writing u16"); |
|
|
| 50 | if ((res = psiconv_buffer_add(buf,value & 0xff))) |
48 | if ((res = psiconv_buffer_add(buf,value & 0xff))) |
| 51 | return res; |
49 | return res; |
| 52 | return psiconv_buffer_add(buf,(value & 0xff00) >> 8); |
50 | return psiconv_buffer_add(buf,(value & 0xff00) >> 8); |
| 53 | } |
51 | } |
| 54 | |
52 | |
| 55 | int psiconv_write_u32(const psiconv_config config,psiconv_buffer buf, |
53 | int psiconv_write_u32(const psiconv_config config,psiconv_buffer buf, |
| 56 | int lev,const psiconv_u32 value) |
54 | int lev,const psiconv_u32 value) |
| 57 | { |
55 | { |
| 58 | int res; |
56 | int res; |
| 59 | psiconv_progress(config,lev,0,"Writing u32"); |
|
|
| 60 | if ((res = psiconv_buffer_add(buf,value & 0xff))) |
57 | if ((res = psiconv_buffer_add(buf,value & 0xff))) |
| 61 | return res; |
58 | return res; |
| 62 | if ((res = psiconv_buffer_add(buf,(value & 0xff00) >> 8))) |
59 | if ((res = psiconv_buffer_add(buf,(value & 0xff00) >> 8))) |
| 63 | return res; |
60 | return res; |
| 64 | if ((res = psiconv_buffer_add(buf,(value & 0xff0000) >> 16))) |
61 | if ((res = psiconv_buffer_add(buf,(value & 0xff0000) >> 16))) |
| … | |
… | |
| 101 | } |
98 | } |
| 102 | |
99 | |
| 103 | int psiconv_write_length(const psiconv_config config,psiconv_buffer buf, |
100 | int psiconv_write_length(const psiconv_config config,psiconv_buffer buf, |
| 104 | int lev,const psiconv_length_t value) |
101 | int lev,const psiconv_length_t value) |
| 105 | { |
102 | { |
| 106 | psiconv_progress(config,lev,0,"Writing length"); |
|
|
| 107 | return psiconv_write_u32(config,buf,lev+1,value * (1440.0/2.54) + 0.5); |
103 | return psiconv_write_u32(config,buf,lev+1,value * (1440.0/2.54) + 0.5); |
| 108 | } |
104 | } |
| 109 | |
105 | |
| 110 | int psiconv_write_size(const psiconv_config config,psiconv_buffer buf, |
106 | int psiconv_write_size(const psiconv_config config,psiconv_buffer buf, |
| 111 | int lev, psiconv_size_t value) |
107 | int lev, psiconv_size_t value) |
| 112 | { |
108 | { |
| 113 | psiconv_progress(config,lev,0,"Writing size"); |
|
|
| 114 | return psiconv_write_u32(config,buf,lev+1,value * 20.0 + 0.5); |
109 | return psiconv_write_u32(config,buf,lev+1,value * 20.0 + 0.5); |
| 115 | } |
110 | } |
| 116 | |
111 | |
| 117 | int psiconv_write_bool(const psiconv_config config,psiconv_buffer buf, |
112 | int psiconv_write_bool(const psiconv_config config,psiconv_buffer buf, |
| 118 | int lev,const psiconv_bool_t value) |
113 | int lev,const psiconv_bool_t value) |
| 119 | { |
114 | { |
| 120 | psiconv_progress(config,lev,0,"Writing bool"); |
|
|
| 121 | if ((value != psiconv_bool_true) && (value != psiconv_bool_false)) |
115 | if ((value != psiconv_bool_true) && (value != psiconv_bool_false)) |
| 122 | psiconv_warn(config,0,psiconv_buffer_length(buf), |
116 | psiconv_warn(config,0,psiconv_buffer_length(buf), |
| 123 | "Boolean has non-enum value (found %d)",value); |
117 | "Boolean has non-enum value (found %d)",value); |
| 124 | return psiconv_write_u8(config,buf,lev+1,value == psiconv_bool_false?0:1); |
118 | return psiconv_write_u8(config,buf,lev+1,value == psiconv_bool_false?0:1); |
| 125 | } |
119 | } |
| 126 | |
120 | |
| 127 | int psiconv_write_string(const psiconv_config config,psiconv_buffer buf, |
121 | int psiconv_write_string(const psiconv_config config,psiconv_buffer buf, |
| 128 | int lev, const psiconv_string_t value) |
122 | int lev, const psiconv_string_t value) |
| 129 | { |
123 | { |
|
|
124 | int res; |
| 130 | psiconv_progress(config,lev,0,"Writing string"); |
125 | psiconv_progress(config,lev,0,"Writing string"); |
| 131 | return psiconv_write_string_aux(config,buf,lev+1,value,-1); |
126 | 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 | } |
132 | } |
| 133 | |
133 | |
| 134 | int psiconv_write_short_string(const psiconv_config config,psiconv_buffer buf, |
134 | int psiconv_write_short_string(const psiconv_config config,psiconv_buffer buf, |
| 135 | int lev,const psiconv_string_t value) |
135 | int lev,const psiconv_string_t value) |
| 136 | { |
136 | { |
|
|
137 | int res; |
| 137 | psiconv_progress(config,lev,0,"Writing short string"); |
138 | psiconv_progress(config,lev,0,"Writing short string"); |
| 138 | return psiconv_write_string_aux(config,buf,lev+1,value,-2); |
139 | 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; |
| 139 | } |
145 | } |
| 140 | |
146 | |
| 141 | int psiconv_write_charlist(const psiconv_config config,psiconv_buffer buf, |
147 | int psiconv_write_charlist(const psiconv_config config,psiconv_buffer buf, |
| 142 | int lev,const psiconv_string_t value) |
148 | int lev,const psiconv_string_t value) |
| 143 | { |
149 | { |
|
|
150 | int res; |
| 144 | psiconv_progress(config,lev,0,"Writing short string"); |
151 | psiconv_progress(config,lev,0,"Writing charlist"); |
| 145 | return psiconv_write_string_aux(config,buf,lev+1,value,0); |
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; |
| 146 | } |
158 | } |
| 147 | |
159 | |
| 148 | |
160 | |
| 149 | int psiconv_write_string_aux(const psiconv_config config,psiconv_buffer buf, |
161 | int psiconv_write_string_aux(const psiconv_config config,psiconv_buffer buf, |
| 150 | int lev, const psiconv_string_t value,int kind) |
162 | int lev, const psiconv_string_t value,int kind) |
| 151 | { |
163 | { |
| 152 | int res,i,len; |
164 | int res,i,len; |
| 153 | |
165 | |
| 154 | psiconv_progress(config,lev,0,"Writing string (auxiliary)"); |
|
|
| 155 | len = psiconv_unicode_strlen(value); |
166 | len = psiconv_unicode_strlen(value); |
| 156 | if (!value) { |
167 | if (!value) { |
| 157 | psiconv_error(config,0,psiconv_buffer_length(buf), |
168 | psiconv_error(config,lev,0, "NULL string"); |
| 158 | "NULL string"); |
|
|
| 159 | return -PSICONV_E_GENERATE; |
169 | return -PSICONV_E_GENERATE; |
| 160 | } |
170 | } |
| 161 | if (kind == -1) |
171 | if (kind == -1) |
| 162 | res = psiconv_write_S(config,buf,lev+1,len); |
172 | res = psiconv_write_S(config,buf,lev+1,len); |
| 163 | else if (kind == -2) |
173 | else if (kind == -2) |
| … | |
… | |
| 174 | } |
184 | } |
| 175 | |
185 | |
| 176 | int psiconv_write_offset(const psiconv_config config,psiconv_buffer buf, |
186 | int psiconv_write_offset(const psiconv_config config,psiconv_buffer buf, |
| 177 | int lev,psiconv_u32 id) |
187 | int lev,psiconv_u32 id) |
| 178 | { |
188 | { |
| 179 | psiconv_progress(config,lev,0,"Writing offset"); |
|
|
| 180 | return psiconv_buffer_add_reference(buf,id); |
189 | return psiconv_buffer_add_reference(buf,id); |
| 181 | } |
190 | } |