@@ -185,11 +185,15 @@ lk_init(void)
185
185
lk_set_log_fn (ctx , log_file , stderr );
186
186
lk_set_log_priority (ctx , LOG_ERR );
187
187
188
- if (init_array (ctx , & ctx -> keymap , sizeof (void * )) < 0 ||
189
- init_array (ctx , & ctx -> func_table , sizeof (void * )) < 0 ||
190
- init_array (ctx , & ctx -> accent_table , sizeof (void * )) < 0 ||
191
- init_array (ctx , & ctx -> key_constant , sizeof (char )) < 0 ||
192
- init_array (ctx , & ctx -> key_line , sizeof (int )) < 0 ) {
188
+ int ret = 0 ;
189
+
190
+ ret = ret ?: init_array (ctx , & ctx -> keymap , sizeof (void * ));
191
+ ret = ret ?: init_array (ctx , & ctx -> func_table , sizeof (void * ));
192
+ ret = ret ?: init_array (ctx , & ctx -> accent_table , sizeof (void * ));
193
+ ret = ret ?: init_array (ctx , & ctx -> key_constant , sizeof (char ));
194
+ ret = ret ?: init_array (ctx , & ctx -> key_line , sizeof (int ));
195
+
196
+ if (ret ) {
193
197
lk_free (ctx );
194
198
return NULL ;
195
199
}
@@ -204,61 +208,49 @@ lk_init(void)
204
208
return ctx ;
205
209
}
206
210
207
- int lk_free (struct lk_ctx * ctx )
208
- {
209
- unsigned int i ; //, j;
210
-
211
- if (!ctx )
212
- return -1 ;
213
-
214
- if (ctx -> keymap ) {
215
- for (i = 0 ; i < ctx -> keymap -> total ; i ++ ) {
216
- struct lk_array * map ;
217
-
218
- map = lk_array_get_ptr (ctx -> keymap , i );
219
- if (!map )
220
- continue ;
221
-
222
- lk_array_free (map );
223
- free (map );
224
- }
225
- lk_array_free (ctx -> keymap );
226
- free (ctx -> keymap );
211
+ enum ctx_array_type {
212
+ FREE_CTX_KEYMAP ,
213
+ FREE_CTX_FUNC_TABLE ,
214
+ FREE_CTX_ACCENT_TABLE ,
215
+ };
227
216
228
- ctx -> keymap = NULL ;
229
- }
217
+ static void * free_ctx_array (struct lk_array * arr , enum ctx_array_type array_type )
218
+ {
219
+ if (!arr )
220
+ return NULL ;
230
221
231
- if (ctx -> func_table ) {
232
- for (i = 0 ; i < ctx -> func_table -> total ; i ++ ) {
233
- char * ptr ;
222
+ for (int i = 0 ; i < arr -> total ; i ++ ) {
223
+ void * ptr = lk_array_get_ptr (arr , i );
234
224
235
- ptr = lk_array_get_ptr (ctx -> func_table , i );
236
- if (!ptr )
237
- continue ;
225
+ if (!ptr )
226
+ continue ;
238
227
239
- free (ptr );
228
+ switch (array_type ) {
229
+ case FREE_CTX_KEYMAP :
230
+ lk_array_free (ptr );
231
+ break ;
232
+ case FREE_CTX_FUNC_TABLE :
233
+ case FREE_CTX_ACCENT_TABLE :
234
+ break ;
240
235
}
241
- lk_array_free (ctx -> func_table );
242
- free (ctx -> func_table );
243
236
244
- ctx -> func_table = NULL ;
237
+ free ( ptr ) ;
245
238
}
246
239
247
- if (ctx -> accent_table ) {
248
- for (i = 0 ; i < ctx -> accent_table -> total ; i ++ ) {
249
- struct lk_array * ptr ;
240
+ lk_array_free (arr );
241
+ free (arr );
250
242
251
- ptr = lk_array_get_ptr (ctx -> accent_table , i );
252
- if (!ptr )
253
- continue ;
243
+ return NULL ;
244
+ }
254
245
255
- free ( ptr );
256
- }
257
- lk_array_free ( ctx -> accent_table );
258
- free ( ctx -> accent_table ) ;
246
+ int lk_free ( struct lk_ctx * ctx )
247
+ {
248
+ if (! ctx )
249
+ return -1 ;
259
250
260
- ctx -> accent_table = NULL ;
261
- }
251
+ ctx -> keymap = free_ctx_array (ctx -> keymap , FREE_CTX_KEYMAP );
252
+ ctx -> func_table = free_ctx_array (ctx -> func_table , FREE_CTX_FUNC_TABLE );
253
+ ctx -> accent_table = free_ctx_array (ctx -> accent_table , FREE_CTX_ACCENT_TABLE );
262
254
263
255
if (ctx -> key_constant ) {
264
256
lk_array_free (ctx -> key_constant );
0 commit comments