File tree 3 files changed +63
-2
lines changed
3 files changed +63
-2
lines changed Original file line number Diff line number Diff line change @@ -409,6 +409,35 @@ regex_free(regex_t *regex)
409
409
free (regex );
410
410
}
411
411
412
+ void
413
+ free_expression2 (expression_node_t * exp )
414
+ {
415
+ cm_stack * stack = cm_stack_init (64 );
416
+ cm_stack_push (stack , exp );
417
+ while (stack -> length > 0 ) {
418
+ expression_node_t * e = (expression_node_t * ) cm_stack_pop (stack );
419
+ if (e -> type == CHAR_LITERAL || e -> type == CHAR_LITERAL ) {
420
+ free (e );
421
+ continue ;
422
+ }
423
+ if (e -> type == INFIX_EXPRESSION ) {
424
+ infix_expression_t * infix = (infix_expression_t * ) e ;
425
+ cm_stack_push (stack , infix -> left );
426
+ cm_stack_push (stack , infix -> right );
427
+ free (e );
428
+ continue ;
429
+ }
430
+ if (e -> type == POSTFIX_EXPRESSION ) {
431
+ postfix_expression_t * postfix = (postfix_expression_t * ) e ;
432
+ cm_stack_push (stack , postfix -> left );
433
+ free (e );
434
+ continue ;
435
+ }
436
+ free (e );
437
+ }
438
+ cm_stack_free (stack );
439
+ }
440
+
412
441
void
413
442
free_expression (expression_node_t * exp )
414
443
{
Original file line number Diff line number Diff line change @@ -78,8 +78,8 @@ cm_list_free(cm_list *list, void (*free_data) (void *))
78
78
while (list_node != NULL ) {
79
79
if (free_data )
80
80
free_data (list_node -> data );
81
- else
82
- free (list_node -> data );
81
+ // else
82
+ // free(list_node->data);
83
83
temp_node = list_node -> next ;
84
84
free (list_node );
85
85
list_node = temp_node ;
@@ -466,3 +466,29 @@ pointer_equals(void *key1, void*key2)
466
466
{
467
467
return key1 == key2 ;
468
468
}
469
+
470
+ void
471
+ cm_stack_push (cm_stack * stack , void * v )
472
+ {
473
+ cm_array_list * l = (cm_array_list * ) stack ;
474
+ cm_array_list_add (l , v );
475
+ }
476
+
477
+ void *
478
+ cm_stack_pop (cm_stack * stack )
479
+ {
480
+ stack -> length -- ;
481
+ return stack -> array [stack -> length ];
482
+ }
483
+
484
+ cm_stack *
485
+ cm_stack_init (size_t init_size )
486
+ {
487
+ return (cm_stack * ) cm_array_list_init (init_size , NULL );
488
+ }
489
+
490
+ void
491
+ cm_stack_free (cm_stack * stack )
492
+ {
493
+ cm_array_list_free ((cm_array_list * ) stack );
494
+ }
Original file line number Diff line number Diff line change @@ -69,6 +69,8 @@ typedef struct cm_hash_table {
69
69
void (* free_value ) (void * );
70
70
} cm_hash_table ;
71
71
72
+ typedef cm_array_list cm_stack ;
73
+
72
74
73
75
cm_list * cm_list_init (void );
74
76
int cm_list_add (cm_list * , void * );
@@ -83,6 +85,10 @@ void *cm_array_list_last(cm_array_list *);
83
85
void * cm_array_list_first (cm_array_list * );
84
86
void cm_array_list_remove (cm_array_list * , size_t );
85
87
void cm_array_list_free (cm_array_list * );
88
+ void * cm_stack_pop (cm_stack * );
89
+ void cm_stack_push (cm_stack * , void * );
90
+ cm_stack * cm_stack_init (size_t );
91
+ void cm_stack_free (cm_stack * );
86
92
char * cm_array_string_list_join (cm_array_list * , const char * );
87
93
cm_array_list * cm_array_list_copy (cm_array_list * , void * (* copy_func ) (void * ));
88
94
You can’t perform that action at this time.
0 commit comments