Added ESEXP_RES_TIME for time values. (ESExpResult): Added a "time_t
2001-04-03 Federico Mena Quintero <federico@ximian.com> * e-sexp.h (ESExpResultType): Added ESEXP_RES_TIME for time values. (ESExpResult): Added a "time_t value.time" field. (ESExpTermType): Added ESEXP_TERM_TIME. (ESExpTerm): Added a "time_t value.time" field. * e-sexp.c (e_sexp_result_free): Deal with time values. Also, be more paranoid; added a default clause with g_assert_not_reached(). (term_eval_lt): Deal with time values. (term_eval_gt): Likewise. (term_eval_eq): Likewise. (term_eval_plus): Likewise. (term_eval_sub): Likewise. (e_sexp_term_eval): Likewise. (eval_dump_result): Likewise. (parse_dump_term): Likewise. (parse_term_free): Likewise. svn path=/trunk/; revision=9130
This commit is contained in:

committed by
Federico Mena Quintero

parent
0cebe028cb
commit
004034cf32
@ -1,3 +1,23 @@
|
|||||||
|
2001-04-03 Federico Mena Quintero <federico@ximian.com>
|
||||||
|
|
||||||
|
* e-sexp.h (ESExpResultType): Added ESEXP_RES_TIME for time
|
||||||
|
values.
|
||||||
|
(ESExpResult): Added a "time_t value.time" field.
|
||||||
|
(ESExpTermType): Added ESEXP_TERM_TIME.
|
||||||
|
(ESExpTerm): Added a "time_t value.time" field.
|
||||||
|
|
||||||
|
* e-sexp.c (e_sexp_result_free): Deal with time values. Also, be
|
||||||
|
more paranoid; added a default clause with g_assert_not_reached().
|
||||||
|
(term_eval_lt): Deal with time values.
|
||||||
|
(term_eval_gt): Likewise.
|
||||||
|
(term_eval_eq): Likewise.
|
||||||
|
(term_eval_plus): Likewise.
|
||||||
|
(term_eval_sub): Likewise.
|
||||||
|
(e_sexp_term_eval): Likewise.
|
||||||
|
(eval_dump_result): Likewise.
|
||||||
|
(parse_dump_term): Likewise.
|
||||||
|
(parse_term_free): Likewise.
|
||||||
|
|
||||||
2001-04-01 Gediminas Paulauskas <menesis@delfi.lt>
|
2001-04-01 Gediminas Paulauskas <menesis@delfi.lt>
|
||||||
|
|
||||||
* e-gui-utils.h: new type EPixmap, which is used to cache pixmaps for
|
* e-gui-utils.h: new type EPixmap, which is used to cache pixmaps for
|
||||||
|
@ -43,9 +43,15 @@
|
|||||||
string = (+ string*)
|
string = (+ string*)
|
||||||
Concat strings.
|
Concat strings.
|
||||||
|
|
||||||
|
time_t = (+ time_t*)
|
||||||
|
Add time_t values.
|
||||||
|
|
||||||
int = (- int int*)
|
int = (- int int*)
|
||||||
Subtract integers from the first.
|
Subtract integers from the first.
|
||||||
|
|
||||||
|
time_t = (- time_t*)
|
||||||
|
Subtract time_t values from the first.
|
||||||
|
|
||||||
Comparison operators:
|
Comparison operators:
|
||||||
|
|
||||||
bool = (< int int)
|
bool = (< int int)
|
||||||
@ -55,7 +61,11 @@
|
|||||||
bool = (< string string)
|
bool = (< string string)
|
||||||
bool = (> string string)
|
bool = (> string string)
|
||||||
bool = (= string string)
|
bool = (= string string)
|
||||||
Perform a comparision of 2 integers, or 2 string values.
|
|
||||||
|
bool = (< time_t time_t)
|
||||||
|
bool = (> time_t time_t)
|
||||||
|
bool = (= time_t time_t)
|
||||||
|
Perform a comparision of 2 integers, 2 string values, or 2 time values.
|
||||||
|
|
||||||
Function flow:
|
Function flow:
|
||||||
|
|
||||||
@ -168,12 +178,15 @@ e_sexp_result_free(struct _ESExp *f, struct _ESExpResult *t)
|
|||||||
break;
|
break;
|
||||||
case ESEXP_RES_BOOL:
|
case ESEXP_RES_BOOL:
|
||||||
case ESEXP_RES_INT:
|
case ESEXP_RES_INT:
|
||||||
|
case ESEXP_RES_TIME:
|
||||||
break;
|
break;
|
||||||
case ESEXP_RES_STRING:
|
case ESEXP_RES_STRING:
|
||||||
g_free(t->value.string);
|
g_free(t->value.string);
|
||||||
break;
|
break;
|
||||||
case ESEXP_RES_UNDEFINED:
|
case ESEXP_RES_UNDEFINED:
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
e_memchunk_free(f->result_chunks, t);
|
e_memchunk_free(f->result_chunks, t);
|
||||||
}
|
}
|
||||||
@ -358,6 +371,9 @@ term_eval_lt(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
|
|||||||
} else if (r1->type == ESEXP_RES_INT) {
|
} else if (r1->type == ESEXP_RES_INT) {
|
||||||
r->type = ESEXP_RES_BOOL;
|
r->type = ESEXP_RES_BOOL;
|
||||||
r->value.bool = r1->value.number < r2->value.number;
|
r->value.bool = r1->value.number < r2->value.number;
|
||||||
|
} else if (r1->type == ESEXP_RES_TIME) {
|
||||||
|
r->type = ESEXP_RES_BOOL;
|
||||||
|
r->value.bool = r1->value.time < r2->value.time;
|
||||||
} else if (r1->type == ESEXP_RES_STRING) {
|
} else if (r1->type == ESEXP_RES_STRING) {
|
||||||
r->type = ESEXP_RES_BOOL;
|
r->type = ESEXP_RES_BOOL;
|
||||||
r->value.bool = strcmp(r1->value.string, r2->value.string) < 0;
|
r->value.bool = strcmp(r1->value.string, r2->value.string) < 0;
|
||||||
@ -387,6 +403,9 @@ term_eval_gt(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
|
|||||||
} else if (r1->type == ESEXP_RES_INT) {
|
} else if (r1->type == ESEXP_RES_INT) {
|
||||||
r->type = ESEXP_RES_BOOL;
|
r->type = ESEXP_RES_BOOL;
|
||||||
r->value.bool = r1->value.number > r2->value.number;
|
r->value.bool = r1->value.number > r2->value.number;
|
||||||
|
} else if (r1->type == ESEXP_RES_TIME) {
|
||||||
|
r->type = ESEXP_RES_BOOL;
|
||||||
|
r->value.bool = r1->value.time > r2->value.time;
|
||||||
} else if (r1->type == ESEXP_RES_STRING) {
|
} else if (r1->type == ESEXP_RES_STRING) {
|
||||||
r->type = ESEXP_RES_BOOL;
|
r->type = ESEXP_RES_BOOL;
|
||||||
r->value.bool = strcmp(r1->value.string, r2->value.string) > 0;
|
r->value.bool = strcmp(r1->value.string, r2->value.string) > 0;
|
||||||
@ -414,6 +433,8 @@ term_eval_eq(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
|
|||||||
r->value.bool = r1->value.number == r2->value.number;
|
r->value.bool = r1->value.number == r2->value.number;
|
||||||
} else if (r1->type == ESEXP_RES_BOOL) {
|
} else if (r1->type == ESEXP_RES_BOOL) {
|
||||||
r->value.bool = r1->value.bool == r2->value.bool;
|
r->value.bool = r1->value.bool == r2->value.bool;
|
||||||
|
} else if (r1->type == ESEXP_RES_TIME) {
|
||||||
|
r->value.bool = r1->value.time == r2->value.time;
|
||||||
} else if (r1->type == ESEXP_RES_STRING) {
|
} else if (r1->type == ESEXP_RES_STRING) {
|
||||||
r->value.bool = strcmp(r1->value.string, r2->value.string) == 0;
|
r->value.bool = strcmp(r1->value.string, r2->value.string) == 0;
|
||||||
}
|
}
|
||||||
@ -458,7 +479,22 @@ term_eval_plus(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *dat
|
|||||||
r->value.string = s->str;
|
r->value.string = s->str;
|
||||||
g_string_free(s, FALSE);
|
g_string_free(s, FALSE);
|
||||||
break; }
|
break; }
|
||||||
|
case ESEXP_RES_TIME: {
|
||||||
|
time_t total;
|
||||||
|
|
||||||
|
total = argv[0]->value.time;
|
||||||
|
|
||||||
|
for (i = 1; i < argc && argv[i]->type == ESEXP_RES_TIME; i++)
|
||||||
|
total += argv[i]->value.time;
|
||||||
|
|
||||||
|
if (i < argc) {
|
||||||
|
e_sexp_resultv_free (f, argc, argv);
|
||||||
|
e_sexp_fatal_error (f, "Invalid types in (+ time_t)");
|
||||||
|
}
|
||||||
|
|
||||||
|
r = e_sexp_result_new (f, ESEXP_RES_TIME);
|
||||||
|
r->value.time = total;
|
||||||
|
break; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -491,6 +527,22 @@ term_eval_sub(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data
|
|||||||
r = e_sexp_result_new(f, ESEXP_RES_INT);
|
r = e_sexp_result_new(f, ESEXP_RES_INT);
|
||||||
r->value.number = total;
|
r->value.number = total;
|
||||||
break; }
|
break; }
|
||||||
|
case ESEXP_RES_TIME: {
|
||||||
|
time_t total;
|
||||||
|
|
||||||
|
total = argv[0]->value.time;
|
||||||
|
|
||||||
|
for (i = 1; i < argc && argv[i]->type == ESEXP_RES_TIME; i++)
|
||||||
|
total -= argv[i]->value.time;
|
||||||
|
|
||||||
|
if (i < argc) {
|
||||||
|
e_sexp_resultv_free (f, argc, argv);
|
||||||
|
e_sexp_fatal_error (f, "Invalid types in (- time_t)");
|
||||||
|
}
|
||||||
|
|
||||||
|
r = e_sexp_result_new (f, ESEXP_RES_TIME);
|
||||||
|
r->value.time = total;
|
||||||
|
break; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -570,6 +622,11 @@ e_sexp_term_eval(struct _ESExp *f, struct _ESExpTerm *t)
|
|||||||
r = e_sexp_result_new(f, ESEXP_RES_BOOL);
|
r = e_sexp_result_new(f, ESEXP_RES_BOOL);
|
||||||
r->value.bool = t->value.bool;
|
r->value.bool = t->value.bool;
|
||||||
break;
|
break;
|
||||||
|
case ESEXP_TERM_TIME:
|
||||||
|
r(printf(" (time_t %d)\n", t->value.time));
|
||||||
|
r = e_sexp_result_new (f, ESEXP_RES_TIME);
|
||||||
|
r->value.time = t->value.time;
|
||||||
|
break;
|
||||||
case ESEXP_TERM_IFUNC:
|
case ESEXP_TERM_IFUNC:
|
||||||
if (t->value.func.sym->f.ifunc)
|
if (t->value.func.sym->f.ifunc)
|
||||||
r = t->value.func.sym->f.ifunc(f, t->value.func.termcount, t->value.func.terms, t->value.func.sym->data);
|
r = t->value.func.sym->f.ifunc(f, t->value.func.termcount, t->value.func.terms, t->value.func.sym->data);
|
||||||
@ -623,6 +680,9 @@ eval_dump_result(ESExpResult *r, int depth)
|
|||||||
case ESEXP_RES_BOOL:
|
case ESEXP_RES_BOOL:
|
||||||
printf("bool: %c\n", r->value.bool?'t':'f');
|
printf("bool: %c\n", r->value.bool?'t':'f');
|
||||||
break;
|
break;
|
||||||
|
case ESEXP_RES_TIME:
|
||||||
|
printf("time_t: %ld\n", (long) r->value.time);
|
||||||
|
break;
|
||||||
case ESEXP_RES_UNDEFINED:
|
case ESEXP_RES_UNDEFINED:
|
||||||
printf(" <undefined>\n");
|
printf(" <undefined>\n");
|
||||||
break;
|
break;
|
||||||
@ -654,6 +714,9 @@ parse_dump_term(struct _ESExpTerm *t, int depth)
|
|||||||
case ESEXP_TERM_BOOL:
|
case ESEXP_TERM_BOOL:
|
||||||
printf(" #%c", t->value.bool?'t':'f');
|
printf(" #%c", t->value.bool?'t':'f');
|
||||||
break;
|
break;
|
||||||
|
case ESEXP_TERM_TIME:
|
||||||
|
printf(" %ld", (long) t->value.time);
|
||||||
|
break;
|
||||||
case ESEXP_TERM_IFUNC:
|
case ESEXP_TERM_IFUNC:
|
||||||
case ESEXP_TERM_FUNC:
|
case ESEXP_TERM_FUNC:
|
||||||
printf(" (function %s\n", t->value.func.sym->name);
|
printf(" (function %s\n", t->value.func.sym->name);
|
||||||
@ -711,6 +774,8 @@ parse_term_free(struct _ESExp *f, struct _ESExpTerm *t)
|
|||||||
break;
|
break;
|
||||||
case ESEXP_TERM_INT:
|
case ESEXP_TERM_INT:
|
||||||
break;
|
break;
|
||||||
|
case ESEXP_TERM_TIME:
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
printf("parse_term_free: unknown type: %d\n", t->type);
|
printf("parse_term_free: unknown type: %d\n", t->type);
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#define _E_SEXP_H
|
#define _E_SEXP_H
|
||||||
|
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
|
#include <time.h>
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
#ifdef E_SEXP_IS_GTK_OBJECT
|
#ifdef E_SEXP_IS_GTK_OBJECT
|
||||||
@ -42,6 +43,7 @@ enum _ESExpResultType {
|
|||||||
ESEXP_RES_INT, /* type is a number */
|
ESEXP_RES_INT, /* type is a number */
|
||||||
ESEXP_RES_STRING, /* type is a pointer to a single string */
|
ESEXP_RES_STRING, /* type is a pointer to a single string */
|
||||||
ESEXP_RES_BOOL, /* boolean type */
|
ESEXP_RES_BOOL, /* boolean type */
|
||||||
|
ESEXP_RES_TIME, /* time_t type */
|
||||||
ESEXP_RES_UNDEFINED /* unknown type */
|
ESEXP_RES_UNDEFINED /* unknown type */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -52,6 +54,7 @@ struct _ESExpResult {
|
|||||||
int number;
|
int number;
|
||||||
char *string;
|
char *string;
|
||||||
int bool;
|
int bool;
|
||||||
|
time_t time;
|
||||||
} value;
|
} value;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -59,6 +62,7 @@ enum _ESExpTermType {
|
|||||||
ESEXP_TERM_INT = 0, /* integer literal */
|
ESEXP_TERM_INT = 0, /* integer literal */
|
||||||
ESEXP_TERM_BOOL, /* boolean literal */
|
ESEXP_TERM_BOOL, /* boolean literal */
|
||||||
ESEXP_TERM_STRING, /* string literal */
|
ESEXP_TERM_STRING, /* string literal */
|
||||||
|
ESEXP_TERM_TIME, /* time_t literal (number of seconds past the epoch) */
|
||||||
ESEXP_TERM_FUNC, /* normal function, arguments are evaluated before calling */
|
ESEXP_TERM_FUNC, /* normal function, arguments are evaluated before calling */
|
||||||
ESEXP_TERM_IFUNC, /* immediate function, raw terms are arguments */
|
ESEXP_TERM_IFUNC, /* immediate function, raw terms are arguments */
|
||||||
ESEXP_TERM_VAR, /* variable reference */
|
ESEXP_TERM_VAR, /* variable reference */
|
||||||
@ -80,6 +84,7 @@ struct _ESExpTerm {
|
|||||||
char *string;
|
char *string;
|
||||||
int number;
|
int number;
|
||||||
int bool;
|
int bool;
|
||||||
|
time_t time;
|
||||||
struct {
|
struct {
|
||||||
struct _ESExpSymbol *sym;
|
struct _ESExpSymbol *sym;
|
||||||
struct _ESExpTerm **terms;
|
struct _ESExpTerm **terms;
|
||||||
|
Reference in New Issue
Block a user