cleaner. centralise type parsing... and error checking

SVN revision: 7017
This commit is contained in:
Carsten Haitzler 2003-06-12 13:02:28 +00:00
parent dd7fe79b30
commit 228f197d2b
3 changed files with 180 additions and 57 deletions

View File

@ -15,6 +15,7 @@
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdarg.h>
typedef struct _New_Object_Handler New_Object_Handler;
typedef struct _New_Statement_Handler New_Statement_Handler;
@ -37,6 +38,13 @@ void compile(void);
int object_handler_num(void);
int statement_handler_num(void);
char *parse_str(int n);
int parse_enum(int n, ...);
int parse_int(int n);
int parse_int_range(int n, int f, int t);
double parse_float(int n);
double parse_float_range(int n, int f, int t);
extern Evas_List *img_dirs;
extern char *file_in;
extern char *file_out;

View File

@ -89,74 +89,38 @@ static void
st_images_image(void)
{
Edje_Image_Directory_Entry *img;
char *str;
int v;
img = evas_list_data(evas_list_last(edje_file->image_dir->entries));
str = evas_list_nth(params, 0);
if (str)
img->entry = parse_str(0);
v = parse_enum(1,
"RAW", 0,
"COMP", 1,
"LOSSY", 2,
"USER", 3,
NULL);
if (v == 0)
{
img->entry = strdup(str);
if (!str)
{
fprintf(stderr, "%s: Error. memory allocation of %i bytes failed. %s\n",
progname, strlen(str) + 1, strerror(errno));
exit(-1);
}
img->source_type = EDJE_IMAGE_SOURCE_TYPE_INLINE_PERFECT;
img->source_param = 0;
}
else
else if (v == 1)
{
fprintf(stderr, "%s: Error. %s:%i: no filename for image as arg 1\n",
progname, file_in, line);
exit(-1);
img->source_type = EDJE_IMAGE_SOURCE_TYPE_INLINE_PERFECT;
img->source_param = 1;
}
str = evas_list_nth(params, 1);
if (str)
else if (v == 2)
{
if (!strcasecmp(str, "RAW"))
{
img->source_type = EDJE_IMAGE_SOURCE_TYPE_INLINE_PERFECT;
img->source_param = 0;
}
else if (!strcasecmp(str, "COMP"))
{
img->source_type = EDJE_IMAGE_SOURCE_TYPE_INLINE_PERFECT;
img->source_param = 1;
}
else if (!strcasecmp(str, "LOSSY"))
{
img->source_type = EDJE_IMAGE_SOURCE_TYPE_INLINE_LOSSY;
img->source_param = 0;
}
else if (!strcasecmp(str, "USER"))
{
img->source_type = EDJE_IMAGE_SOURCE_TYPE_EXTERNAL;
img->source_param = 0;
}
else
{
fprintf(stderr, "%s: Error. %s:%i: invalid encoding \"%s\" for image as arg 2\n",
progname, file_in, line, str);
exit(-1);
}
img->source_type = EDJE_IMAGE_SOURCE_TYPE_INLINE_LOSSY;
img->source_param = 0;
}
else
else if (v == 3)
{
fprintf(stderr, "%s: Error. %s:%i: no encoding type for image as arg 2\n",
progname, file_in, line);
exit(-1);
img->source_type = EDJE_IMAGE_SOURCE_TYPE_EXTERNAL;
img->source_param = 0;
}
if (img->source_type != EDJE_IMAGE_SOURCE_TYPE_INLINE_LOSSY) return;
str = evas_list_nth(params, 2);
if (str)
{
img->source_param = atoi(str);
}
else
{
fprintf(stderr, "%s: Error. %s:%i: no encoding quality for lossy as arg 3\n",
progname, file_in, line);
exit(-1);
}
img->source_param = parse_int_range(2, 0, 100);
}
static void

View File

@ -348,3 +348,154 @@ compile(void)
}
close(fd);
}
char *
parse_str(int n)
{
char *str;
char *s;
str = evas_list_nth(params, n);
if (!str)
{
fprintf(stderr, "%s: Error. %s:%i no parameter supplied as argument %i\n",
progname, file_in, line, n + 1);
exit(-1);
}
s = strdup(str);
if (!s)
{
fprintf(stderr, "%s: Error. memory allocation of %i bytes failed. %s\n",
progname, strlen(str) + 1, strerror(errno));
exit(-1);
}
return s;
}
int
parse_enum(int n, ...)
{
char *str;
va_list va;
str = evas_list_nth(params, n);
if (!str)
{
fprintf(stderr, "%s: Error. %s:%i no parameter supplied as argument %i\n",
progname, file_in, line, n + 1);
exit(-1);
}
va_start(va, n);
for (;;)
{
char *s;
int v;
s = va_arg(va, char *);
if (!s)
{
fprintf(stderr, "%s: Error. %s:%i token %s not one of:",
progname, file_in, line, str);
va_start(va, n);
s = va_arg(va, char *);
while (s)
{
v = va_arg(va, int);
fprintf(stderr, " %s", s);
s = va_arg(va, char *);
if (!s) break;
}
fprintf(stderr, "\n");
va_end(va);
exit(-1);
}
v = va_arg(va, int);
if (!strcmp(s, str))
{
va_end(va);
return v;
}
}
va_end(va);
return 0;
}
int
parse_int(int n)
{
char *str;
int i;
str = evas_list_nth(params, n);
if (!str)
{
fprintf(stderr, "%s: Error. %s:%i no parameter supplied as argument %i\n",
progname, file_in, line, n + 1);
exit(-1);
}
i = atoi(str);
return i;
}
int
parse_int_range(int n, int f, int t)
{
char *str;
int i;
str = evas_list_nth(params, n);
if (!str)
{
fprintf(stderr, "%s: Error. %s:%i no parameter supplied as argument %i\n",
progname, file_in, line, n + 1);
exit(-1);
}
i = atoi(str);
if ((i < f) || (i > t))
{
fprintf(stderr, "%s: Error. %s:%i integer %i out of range of %i to %i inclusive\n",
progname, file_in, line, i, f, t);
exit(-1);
}
return i;
}
double
parse_float(int n)
{
char *str;
double i;
str = evas_list_nth(params, n);
if (!str)
{
fprintf(stderr, "%s: Error. %s:%i no parameter supplied as argument %i\n",
progname, file_in, line, n + 1);
exit(-1);
}
i = atof(str);
return i;
}
double
parse_float_range(int n, int f, int t)
{
char *str;
double i;
str = evas_list_nth(params, n);
if (!str)
{
fprintf(stderr, "%s: Error. %s:%i no parameter supplied as argument %i\n",
progname, file_in, line, n + 1);
exit(-1);
}
i = atoi(str);
if ((i < f) || (i > t))
{
fprintf(stderr, "%s: Error. %s:%i integer %i out of range of %i to %i inclusive\n",
progname, file_in, line, i, f, t);
exit(-1);
}
return i;
}