7 #include "shell_vars.h"
8 #include "statements.h"
9 #include "shell_defs.h"
13 struct _shell_var
*next
;
19 typedef struct _shell_var shell_var
;
21 static shell_var
*var_list
;
23 char *shell_strdup(const char *some_str
)
27 result
= malloc(strlen(some_str
) + 1);
30 strcpy(result
,some_str
);
36 bool string_to_long_int(const char *str
,long int *out
)
38 const char *scanner
= str
;
48 while ((*scanner
!= 0) && (isdigit(*scanner
))){
50 (*out
) = (*out
)*10 + (*scanner
)-48;
55 if(do_neg
) *out
= -(*out
);
57 return (*scanner
!= 0);
60 void shell_value_free(shell_value
*value
)
62 if(!value
->isnumber
) free(value
->value
.val_text
);
67 char *shell_value_to_char(shell_value
*value
)
71 sprintf(tmp
,"%ld",value
->value
.val_number
);
72 return shell_strdup(tmp
);
74 return shell_strdup(value
->value
.val_text
);
78 int shell_value_to_number(shell_value
*value
,long int *number
)
81 *number
= value
->value
.val_number
;
84 return string_to_long_int(value
->value
.val_text
,number
);
88 int shell_value_get_text(shell_value
* value
,char **text
){
89 if(value
->isnumber
) return SHE_INVALID_TYPE
;
90 *text
= value
->value
.val_text
;
94 int shell_value_get_number(shell_value
*value
,long int *number
)
96 if(!value
->isnumber
) return SHE_INVALID_TYPE
;
97 *number
= value
->value
.val_number
;
103 static void shell_var_free(shell_var
*var
)
105 shell_value_free(var
->value
);
111 shell_value
*shell_value_init_number(long int value
)
113 shell_value
*current
;
115 current
= malloc(sizeof(shell_value
));
116 if(current
== NULL
) return NULL
;
118 current
->isnumber
= true;
119 current
->value
.val_number
= value
;
125 shell_value
*shell_value_init_text(const char *value
)
127 shell_value
*current
;
129 current
= malloc(sizeof(shell_value
));
130 if(current
== NULL
) goto err
;
132 current
->value
.val_text
= shell_strdup(value
);
133 if(current
->value
.val_text
== NULL
) goto err1
;
135 current
->isnumber
= false;
145 int shell_value_set_text(shell_value
*value
,const char *new_value
)
147 char *val
= shell_strdup(new_value
);
148 if(val
== NULL
) return SHE_NO_MEMORY
;
150 if(!value
->isnumber
) free(value
->value
.val_text
);
152 value
->value
.val_text
= val
;
153 value
->isnumber
= false;
158 int shell_value_set_number(shell_value
*value
,long int new_value
)
160 if(!value
->isnumber
) free(value
->value
.val_text
);
162 value
->value
.val_number
= new_value
;
163 value
->isnumber
= true;
170 shell_value
*shell_value_clone(shell_value
*var
)
173 return shell_value_init_number(var
->value
.val_number
);
175 return shell_value_init_text(var
->value
.val_text
);
184 int shell_value_neg(shell_value
*out
)
189 err
= shell_value_get_number(out
,&value
);
190 if(err
!= SHE_NO_ERROR
) return err
;
192 err
= shell_value_set_number(out
,-value
);
197 // out = out .op. out
199 int shell_value_do_operation(shell_value
*out
,const shell_value
*other
,int oper_type
)
206 if(out
->isnumber
!= other
->isnumber
) return SHE_INVALID_TYPE
;
209 i1
= out
->value
.val_number
;
210 i2
= other
->value
.val_number
;
211 printf("%ld %ld %d",i1
,i2
,oper_type
);
213 case SVO_ADD
: i3
= i1
+i2
;break;
214 case SVO_SUB
: i3
= i1
-i2
;break;
215 case SVO_MUL
: i3
= i1
*i2
;break;
216 case SVO_DIV
: i3
= i1
/i2
;break;
217 case SVO_BIGGER
: i3
= i1
>i2
;break;
218 case SVO_LESS
: i3
= i1
<i2
;break;
219 case SVO_EQUAL
: i3
= i1
== i2
;break;
220 case SVO_BIGGER_E
: i3
= i1
>=i2
;break;
221 case SVO_LESS_E
: i3
= i1
<= i2
;break;
222 case SVO_NOT_EQUAL
: i3
= i1
!= i2
;break;
223 default: return SHE_INVALID_OPERATION
;
228 i1
= strcmp(out
->value
.val_text
,other
->value
.val_text
);
231 case SVO_EQUAL
: i3
= i1
== 0;break;
232 case SVO_BIGGER
: i3
= i1
> 0;break;
233 case SVO_LESS
: i3
= i1
< 0;break;
234 case SVO_BIGGER_E
: i3
= i1
>= 0;break;
235 case SVO_LESS_E
: i3
= i1
<= 0;break;
236 case SVO_NOT_EQUAL
: i3
= i1
!= 0;break;
237 default : return SHE_INVALID_OPERATION
;
241 err
= shell_value_set_number(out
,i3
);
250 static shell_var
*shell_var_init_value(const char *name
,shell_value
*value
)
254 current
= malloc(sizeof(shell_var
));
255 if(current
== NULL
) goto err
;
257 current
->name
= shell_strdup(name
);
258 if(current
->name
== NULL
) goto err2
;
260 current
->value
= value
;
275 // Add shell variable
278 static int shell_var_add(const char *var_name
,shell_value
*value
)
282 current
= shell_var_init_value(var_name
,value
);
284 current
->next
= var_list
;
291 return SHE_NO_MEMORY
;
295 static shell_var
* find_shell_var_by_name(const char *name
)
301 while((current
!= NULL
) && (strcmp(current
->name
,name
) != 0)) current
= current
->next
;
310 static int shell_var_set(const char *var_name
,shell_value
*value
)
314 current
= find_shell_var_by_name(var_name
);
319 return shell_var_add(var_name
,value
);
323 shell_value_free(current
->value
);
324 current
->value
= value
;
329 int shell_var_set_number(const char *var_name
,long int number
)
333 value
= shell_value_init_number(number
);
334 if(value
== NULL
) return SHE_NO_MEMORY
;
336 return shell_var_set(var_name
,value
);
340 int shell_var_set_text(const char *var_name
,const char *text
)
344 value
= shell_value_init_text(text
);
345 if(value
== NULL
) return SHE_NO_MEMORY
;
347 return shell_var_set(var_name
,value
);
352 int set_shell_var_with_value(const char *var_name
,shell_value
*value
)
354 return shell_var_set(var_name
,shell_value_clone(value
));
357 shell_value
*get_value_by_name(const char *name
)
360 shell_value
*result
= NULL
;
362 current
= find_shell_var_by_name(name
);
364 if(current
!= NULL
) result
= current
->value
;
370 void init_vars(void){