[scripting] Modified if-else-fi branches
[people/lynusvaz/gpxe.git] / src / hci / commands / if_cmd.c
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <gpxe/command.h>
4 #include <gpxe/gen_stack.h>
5 #include <gpxe/init.h>
6
7 struct generic_stack if_stack;
8 static struct generic_stack else_stack;
9 int isnum ( char *string, long *num );
10
11 static int if_exec ( int argc, char **argv ) {
12         long cond;
13         int zero = 0;
14         if ( argc != 2 ) {
15                 printf ( "Syntax: if <condition>\n" );
16                 return 1;
17         }
18         
19         if ( !isnum ( argv[1], &cond ) ) {
20                 printf ( "non-numeric condition: %s\n", argv[1] );
21                 return 1;
22         }
23         cond = TOP_GEN_STACK_INT ( &if_stack ) ? ( cond ? 1 : 0 ) : 0;
24         if ( ( push_generic_stack ( &else_stack, &zero, 0 ) < 0 ) || ( push_generic_stack ( &if_stack, &cond, 0 ) < 0 ) ) {
25                 free_generic_stack ( &if_stack );
26                 free_generic_stack ( &else_stack );
27                 return 1;
28         }
29
30         return 0;
31 }
32
33 struct command if_command __command = {
34         .name = "if",
35         .exec = if_exec,
36 };
37
38 static int fi_exec ( int argc, char **argv ) {
39         int cond;
40         if ( argc != 1 ) {
41                 printf ( "Syntax: %s\n", argv[0] );
42                 return 1;
43         }
44         
45         if ( if_stack.tos > 0 ) {       
46                 if ( pop_generic_stack ( &if_stack, &cond ) < 0 )
47                         return 1;
48         } else {
49                 printf ( "fi without if\n" );
50                 return 1;
51         }
52         return 0;               
53 }
54
55
56 struct command fi_command __command = {
57         .name = "fi",
58         .exec = fi_exec,
59 };
60
61 static int else_exec ( int argc, char **argv ) {
62         if ( argc != 1 ) {
63                 printf ( "Syntax: %s\n", argv[0] );
64                 return 1;
65         }
66
67         if ( TOP_GEN_STACK_INT ( &else_stack ) != 0 ) {
68                 printf ( "else without if\n" );
69                 return 1;
70         }
71         
72         if ( ELEMENT_GEN_STACK_INT ( &if_stack, if_stack.tos - 1 ) )
73                 TOP_GEN_STACK_INT ( &if_stack ) = !TOP_GEN_STACK_INT ( &if_stack );
74         
75         return 0;
76 }
77
78 struct command else_command __command = {
79         .name = "else",
80         .exec = else_exec,
81 };
82
83 void init_if ( void ) {
84         int one = 1;
85         init_generic_stack ( &if_stack, sizeof ( int ) );
86         init_generic_stack ( &else_stack, sizeof ( int ) );
87         push_generic_stack ( &if_stack, &one, 0 );
88         push_generic_stack ( &else_stack, &one, 0 );
89         return;
90 }
91
92 struct init_fn initialise_if __init_fn ( INIT_NORMAL ) = {
93         .initialise = init_if,
94 };