e0443a00c63e91bd4500cfa78f589632dde45fb6
[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
6 struct generic_stack if_stack = { .ptr = NULL, .tos = -1, .size = sizeof ( int ) };
7 static struct generic_stack else_stack = { .ptr = NULL, .tos = -1, .size = sizeof ( int ) };
8 int if_tos = 0;
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\n" );
21                 return -1;
22         }
23         cond = cond ? 1 : 0;
24         push_generic_stack ( &else_stack, &zero, 0 );
25         push_generic_stack ( &if_stack, &cond, 0 );
26         
27         if ( ( if_tos == -1 || ( ( int * ) if_stack.ptr )[if_tos] ) && if_stack.tos - if_tos == 1 )             /* If the top of logical stack == 1 and the current command has been pushed over it */
28                 if_tos++;
29         
30         //printf ( "Condition is %ld\n", cond );
31         return 0;
32 }
33
34 struct command if_command __command = {
35         .name = "if",
36         .exec = if_exec,
37 };
38
39 static int fi_exec ( int argc, char **argv ) {
40         int cond;
41         if ( argc != 1 ) {
42                 printf ( "Syntax: %s\n", argv[0] );
43                 return -1;
44         }
45         
46         if ( pop_generic_stack ( &if_stack, &cond ) == 0 ) {
47                 if ( if_tos - 1 == if_stack.tos ) {
48                         if_tos = if_stack.tos;
49                 }
50         } else {
51                 printf ( "fi without if\n" );
52                 return -1;
53         }
54         return 0;               
55 }
56
57
58 struct command fi_command __command = {
59         .name = "fi",
60         .exec = fi_exec,
61 };
62
63 static int else_exec ( int argc, char **argv ) {
64         if ( argc != 1 ) {
65                 printf ( "Syntax: %s\n", argv[0] );
66         }
67
68         if ( ( ( int * ) else_stack.ptr )[else_stack.tos] != 0 ) {
69                 printf ( "else without if\n" );
70                 return -1;
71         }
72         
73         if ( if_tos == if_stack.tos ) {
74                 ( ( int * ) if_stack.ptr )[if_stack.tos] = !( ( ( int * ) if_stack.ptr )[if_stack.tos] );
75         }
76         return 0;
77 }
78
79 struct command else_command __command = {
80         .name = "else",
81         .exec = else_exec,
82 };