slidescript/src/vars.c

190 lines
4.7 KiB
C
Raw Normal View History

/*
SlideScript - minimalistic top-down scripting language.
2022-05-17 19:24:54 -07:00
(C) Copyright 2014-2022 Chris Dorman - some rights reserved (GPLv2)
View README file supplied with this software for more details
*/
2021-05-09 21:31:49 -07:00
//--------------------------------------------------------------------
// Header files.
2021-04-11 14:43:56 -07:00
#include "inc/deps.h"
#include "inc/vars.h"
#include "inc/util.h"
2021-05-09 21:31:49 -07:00
//--------------------------------------------------------------------
// Module-private variables and/or data.
static QLIST QM_VAR [ONE];
//--------------------------------------------------------------------
// Functions.
void release_vars (void)
{
2021-05-09 21:31:49 -07:00
qflush (QM_VAR);
}
//--------------------------------------------------------------------
void set_var (int index, char *varname, char *vardata)
{
strcpy (svars [index].var_name, varname);
/* Set pointer in struct to a block of memory
THEN write to the memory buffer. */
2021-05-09 21:31:49 -07:00
svars [index].var_data = qmalloc (QM_VAR,
strlen (vardata) + ONE);
strcpy (svars [index].var_data, vardata);
}
2021-05-09 21:31:49 -07:00
//--------------------------------------------------------------------
char *get_var_data (char *varname)
{
int xx;
2021-05-09 21:31:49 -07:00
for(xx = ZERO; xx < MAXVARS; xx++)
{
2021-05-09 21:31:49 -07:00
char *varp = svars [xx].var_name;
if (*varp == '\0') continue;
2021-05-12 11:04:27 -07:00
2021-05-09 21:31:49 -07:00
if(strcmp (varp, varname) == ZERO)
{
2021-05-09 21:31:49 -07:00
return svars [xx].var_data;
}
}
return NULL;
}
2021-05-12 11:04:27 -07:00
//--------------------------------------------------------------------
// Clear variable data by name
//--------------------------------------------------------------------
char *clear_var_data (char *varname)
{
int xx;
for(xx = ZERO; xx < MAXVARS; xx++)
{
char *varp = svars [xx].var_name;
if (*varp == '\0') continue;
if(strcmp (varp, varname) == ZERO)
{
qfree(svars[xx].var_data);
strcpy(svars[xx].var_name, "\0");
return "Variable free'd";
}
}
return NULL;
}
2021-05-09 21:31:49 -07:00
//--------------------------------------------------------------------
int get_var_count()
{
int yy;
2021-05-09 21:31:49 -07:00
for(yy = ZERO; yy < MAXVARS; yy++)
{
2021-05-09 21:31:49 -07:00
if (strlen (svars [yy].var_name) > ZERO)
{
continue;
}
else
{
return yy;
}
}
2021-05-09 21:31:49 -07:00
return ZERO;
}
2021-05-09 21:31:49 -07:00
//--------------------------------------------------------------------
char *parse_vars (char *var_string)
{
2021-05-09 21:31:49 -07:00
int str_char ;
int sbufsize ;
char *ptr_input ; // Pointer into input text
char *buf_output ; // Output buffer
char *ptr_output ; // Pointer into that buffer
char *buf_varname ; // Variable-name buffer
char *ptr_varname ; // Pointer into that buffer
2021-05-09 21:31:49 -07:00
char *var_data ; // Variable data
int len_data ; // Length of data excluding EOS
2021-05-09 21:31:49 -07:00
//--------------------------------------------------------------------
2021-05-09 21:31:49 -07:00
sbufsize = strlen (var_string) + ONE;
buf_varname = qmalloc (QM_VAR, sbufsize);
buf_output = qmalloc (QM_VAR, sbufsize);
2021-05-09 21:31:49 -07:00
*buf_output = NULLBYTE;
*buf_varname = NULLBYTE;
2021-05-09 21:31:49 -07:00
//--------------------------------------------------------------------
for (ptr_input = var_string, ptr_output = buf_output;
(str_char = *ptr_input) != NULLBYTE;
ptr_input++)
{
if (str_char != TOKEN)
2021-05-09 21:31:49 -07:00
{
*ptr_output++ = str_char ;
*ptr_output = NULLBYTE ;
continue;
}
2021-05-09 21:31:49 -07:00
ptr_varname = buf_varname;
do { *ptr_varname++ = (str_char = *++ptr_input); }
while ((str_char != NULLBYTE) && (str_char != TOKEN));
2021-05-09 21:31:49 -07:00
str_char = *ptr_input;
if ((str_char != NULLBYTE) && (str_char != TOKEN))
2021-05-09 21:31:49 -07:00
x_error ("ss:error:buffer out of sync");
str_char = ptr_varname [-1];
if ((str_char != NULLBYTE) && (str_char != TOKEN))
2021-05-09 21:31:49 -07:00
x_error ("ss:error:buffer out of sync");
2021-05-09 21:31:49 -07:00
ptr_varname [-1] = NULLBYTE;
2021-05-09 21:31:49 -07:00
if (*buf_varname == NULLBYTE)
2021-04-08 20:55:59 -07:00
{
2021-05-09 21:31:49 -07:00
x_warn ("ss:warning:variable syntax error!");
2021-04-08 20:55:59 -07:00
return NULL;
}
2021-05-09 21:31:49 -07:00
var_data = get_var_data (buf_varname);
if (var_data == NULL)
2021-04-08 20:55:59 -07:00
{
2021-05-09 21:31:49 -07:00
x_error ("ss:error:variable data not found, abort!");
2021-04-08 20:55:59 -07:00
}
2021-05-09 21:31:49 -07:00
if (*ptr_input == NULLBYTE) break;
2021-05-09 21:31:49 -07:00
len_data = strlen (var_data);
int moo = ptr_output - buf_output;
buf_output = qrealloc (buf_output,
strlen (buf_output) + len_data + ONE);
ptr_output = buf_output + moo;
2021-05-09 21:31:49 -07:00
strcat (buf_output, var_data);
ptr_output += len_data;
}
2021-05-09 21:31:49 -07:00
*ptr_output = NULLBYTE;
return buf_output;
}
2021-05-09 21:31:49 -07:00
//--------------------------------------------------------------------
// End of file.