Enlightenment CVS committal
Author : raster
Project : e17
Module : libs/edje
Dir : e17/libs/edje/src/bin
Modified Files:
edje_cc.h edje_cc_handlers.c edje_cc_out.c edje_cc_parse.c
Log Message:
and.... edje_cc can take small code snippets in script{} areas and compile
them, include them int eh edje.eet and edje can run them. all i have to do
now is actually give the small scripts an api worht talking about
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/bin/edje_cc.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- edje_cc.h 23 Jan 2004 02:13:35 -0000 1.9
+++ edje_cc.h 28 Mar 2004 05:26:17 -0000 1.10
@@ -23,6 +23,8 @@
typedef struct _New_Object_Handler New_Object_Handler;
typedef struct _New_Statement_Handler New_Statement_Handler;
typedef struct _Font Font;
+typedef struct _Code Code;
+typedef struct _Code_Program Code_Program;
struct _New_Object_Handler
{
@@ -42,6 +44,18 @@
char *name;
};
+struct _Code
+{
+ char *shared;
+ Evas_List *programs;
+};
+
+struct _Code_Program
+{
+ int id;
+ char *script;
+};
+
/* global fn calls */
void data_setup(void);
void data_write(void);
@@ -50,7 +64,11 @@
void data_queue_image_lookup(char *name, int *dest);
void data_process_lookups(void);
-
+
+int is_verbatim(void);
+void track_verbatim(int on);
+void set_verbatim(char *s);
+char *get_verbatim(void);
void compile(void);
int is_param(int n);
int is_num(int n);
@@ -81,6 +99,7 @@
extern Edje_File *edje_file;
extern Evas_List *edje_collections;
extern Evas_List *fonts;
+extern Evas_List *codes;
extern New_Object_Handler object_handlers[];
extern New_Statement_Handler statement_handlers[];
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/bin/edje_cc_handlers.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -3 -r1.28 -r1.29
--- edje_cc_handlers.c 8 Mar 2004 02:43:47 -0000 1.28
+++ edje_cc_handlers.c 28 Mar 2004 05:26:17 -0000 1.29
@@ -17,6 +17,8 @@
static void st_collections_group_max(void);
static void st_collections_group_data_item(void);
+static void ob_collections_group_script(void);
+
static void ob_collections_group_parts_part(void);
static void st_collections_group_parts_part_name(void);
static void st_collections_group_parts_part_type(void);
@@ -78,6 +80,8 @@
static void st_collections_group_programs_program_target(void);
static void st_collections_group_programs_program_after(void);
+static void ob_collections_group_programs_program_script(void);
+
/*****/
New_Statement_Handler statement_handlers[] =
@@ -159,6 +163,7 @@
{"collections.group.max", NULL},
{"collections.group.data", NULL},
{"collections.group.data.item", NULL},
+ {"collections.group.script", ob_collections_group_script},
{"collections.group.parts", NULL},
{"collections.group.parts.part", ob_collections_group_parts_part},
{"collections.group.parts.part.name", NULL},
@@ -224,7 +229,8 @@
{"collections.group.programs.program.action", NULL},
{"collections.group.programs.program.transition", NULL},
{"collections.group.programs.program.target", NULL},
- {"collections.group.programs.program.after", NULL}
+ {"collections.group.programs.program.after", NULL},
+ {"collections.group.programs.program.script",
ob_collections_group_programs_program_script}
};
/*****/
@@ -332,6 +338,7 @@
{
Edje_Part_Collection_Directory_Entry *de;
Edje_Part_Collection *pc;
+ Code *cd;
de = mem_alloc(SZ(Edje_Part_Collection_Directory_Entry));
edje_file->collection_dir->entries =
evas_list_append(edje_file->collection_dir->entries, de);
@@ -340,6 +347,9 @@
pc = mem_alloc(SZ(Edje_Part_Collection));
edje_collections = evas_list_append(edje_collections, pc);
pc->id = evas_list_count(edje_collections) - 1;
+
+ cd = mem_alloc(SZ(Code));
+ codes = evas_list_append(codes, cd);
}
static void
@@ -372,6 +382,35 @@
}
static void
+ob_collections_group_script(void)
+{
+ Edje_Part_Collection *pc;
+ Code *cd;
+
+ pc = evas_list_data(evas_list_last(edje_collections));
+ cd = evas_list_data(evas_list_last(codes));
+
+ if (!is_verbatim()) track_verbatim(1);
+ else
+ {
+ char *s;
+
+ s = get_verbatim();
+ if (s)
+ {
+ if (cd->shared)
+ {
+ fprintf(stderr, "%s: Error. parse error %s:%i. There is already an
existing script section for the group\n",
+ progname, file_in, line);
+ exit(-1);
+ }
+ cd->shared = s;
+ set_verbatim(NULL);
+ }
+ }
+}
+
+static void
st_collections_group_data_item(void)
{
Edje_Part_Collection *pc;
@@ -1256,6 +1295,7 @@
"DRAG_VAL_SET", EDJE_ACTION_TYPE_DRAG_VAL_SET,
"DRAG_VAL_STEP", EDJE_ACTION_TYPE_DRAG_VAL_STEP,
"DRAG_VAL_PAGE", EDJE_ACTION_TYPE_DRAG_VAL_PAGE,
+ "SCRIPT", EDJE_ACTION_TYPE_SCRIPT,
NULL);
if (ep->action == EDJE_ACTION_TYPE_STATE_SET)
{
@@ -1348,14 +1388,45 @@
{
Edje_Program_After *pa;
char *name;
-
+
name = parse_str(0);
-
+
pa = mem_alloc(SZ(Edje_Program_After));
pa->id = -1;
ep->after = evas_list_append(ep->after, pa);
-
+
data_queue_program_lookup(pc, name, &(pa->id));
free(name);
}
}
+
+static void
+ob_collections_group_programs_program_script(void)
+{
+ Edje_Part_Collection *pc;
+ Edje_Program *ep;
+ Code *cd;
+
+ pc = evas_list_data(evas_list_last(edje_collections));
+ ep = evas_list_data(evas_list_last(pc->programs));
+ cd = evas_list_data(evas_list_last(codes));
+
+ if (!is_verbatim()) track_verbatim(1);
+ else
+ {
+ char *s;
+
+ s = get_verbatim();
+ if (s)
+ {
+ Code_Program *cp;
+
+ cp = mem_alloc(SZ(Code_Program));
+ cp->id = ep->id;
+ cp->script = s;
+ cd->programs = evas_list_append(cd->programs, cp);
+ set_verbatim(NULL);
+ ep->action = EDJE_ACTION_TYPE_SCRIPT;
+ }
+ }
+}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/bin/edje_cc_out.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- edje_cc_out.c 26 Mar 2004 09:10:04 -0000 1.11
+++ edje_cc_out.c 28 Mar 2004 05:26:17 -0000 1.12
@@ -27,6 +27,7 @@
Edje_File *edje_file = NULL;
Evas_List *edje_collections = NULL;
Evas_List *fonts = NULL;
+Evas_List *codes = NULL;
static Eet_Data_Descriptor *edd_edje_file = NULL;
static Eet_Data_Descriptor *edd_edje_image_directory = NULL;
@@ -77,6 +78,7 @@
int image_num;
int font_num;
int collection_num;
+ int i;
bytes = 0;
input_bytes = 0;
@@ -374,37 +376,6 @@
char buf[4096];
pc = l->data;
-
- /* FIXME: hack!!!! */
- {
- FILE *f;
-
- f = fopen("test.amx", "r");
- if (f)
- {
- int size;
- void *data;
-
- fseek(f, 0, SEEK_END);
- size = ftell(f);
- rewind(f);
- if (size > 0)
- {
- int bt;
-
- data = malloc(size);
- if (data)
- {
- fread(data, size, 1, f);
- snprintf(buf, sizeof(buf), "scripts/%i", pc->id);
- bt = eet_write(ef, buf, data, size, 1);
- free(data);
- printf("WROTE %i bytes of AMX!\n", bt);
- }
- }
- fclose(f);
- }
- }
snprintf(buf, sizeof(buf), "collections/%i", pc->id);
bytes = eet_data_write(ef, edd_edje_part_collection, buf, pc, 1);
if (bytes <= 0)
@@ -424,6 +395,88 @@
progname, bytes, (bytes + 512) / 1024, buf);
}
}
+ for (i = 0, l = codes; l; l = l->next, i++)
+ {
+ Code *cd;
+
+ cd = l->data;
+ if ((cd->shared) || (cd->programs))
+ {
+ int fd;
+ char tmpn[4096];
+
+ strcpy(tmpn, "/tmp/edje_cc.sma-tmp-XXXXXX");
+ fd = mkstemp(tmpn);
+ if (fd >= 0)
+ {
+ FILE *f;
+ char buf[4096];
+ char tmpo[4096];
+ int ret;
+
+ f = fopen(tmpn, "w");
+ if (f)
+ {
+ Evas_List *ll;
+
+ fprintf(f, "#include <edje>\n\n");
+ if (cd->shared) fprintf(f, "%s\n", cd->shared);
+ for (ll = cd->programs; ll; ll = ll->next)
+ {
+ Code_Program *cp;
+
+ cp = ll->data;
+ if (cp->script)
+ {
+ /* FIXME: this prototype needs to be */
+ /* formalised and set in stone */
+ fprintf(f, "public _p%i(sig[], src[]) {\n", cp->id);
+ fprintf(f, "%s\n", cp->script);
+ fprintf(f, "}\n");
+ }
+ }
+ fclose(f);
+ }
+ close(fd);
+ strcpy(tmpo, "/tmp/edje_cc.amx-tmp-XXXXXX");
+ fd = mkstemp(tmpo);
+ if (fd >= 0)
+ {
+ snprintf(buf, sizeof(buf), "embryo_cc -i%s -o%s %s",
+ DAT"data/include", tmpo, tmpn);
+ ret = system(buf);
+ printf("ret = %i\n", ret);
+ close(fd);
+ }
+ f = fopen(tmpo, "r");
+ if (f)
+ {
+ int size;
+ void *data;
+
+ fseek(f, 0, SEEK_END);
+ size = ftell(f);
+ rewind(f);
+ if (size > 0)
+ {
+ int bt;
+
+ data = malloc(size);
+ if (data)
+ {
+ fread(data, size, 1, f);
+ snprintf(buf, sizeof(buf), "scripts/%i", i);
+ bt = eet_write(ef, buf, data, size, 1);
+ free(data);
+ }
+ }
+ fclose(f);
+ }
+ unlink(tmpn);
+ unlink(tmpo);
+ }
+ }
+ }
eet_close(ef);
if (verbose)
{
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/bin/edje_cc_parse.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -3 -r1.16 -r1.17
--- edje_cc_parse.c 11 Mar 2004 03:21:06 -0000 1.16
+++ edje_cc_parse.c 28 Mar 2004 05:26:17 -0000 1.17
@@ -36,7 +36,9 @@
Evas_List *stack = NULL;
Evas_List *params = NULL;
-static char file_buf[4096];
+static char file_buf[4096];
+static int verbatim = 0;
+static char *verbatim_str = NULL;
static void
new_object(void)
@@ -379,6 +381,73 @@
{
stack = evas_list_append(stack, token);
new_object();
+ if ((verbatim == 1) && (p < (end - 2)))
+ {
+ int escaped = 0;
+ int inquotes = 0;
+ int insquotes = 0;
+ int squigglie = 1;
+ char *verbatim_1;
+ char *verbatim_2;
+
+ while ((p[0] != '{') && (p < end)) p++;
+ p++;
+ verbatim_1 = p;
+ verbatim_2 = NULL;
+ for (; p < end; p++)
+ {
+ if (escaped) escaped = 0;
+ if (!escaped)
+ {
+ if (p[0] == '\\') escaped = 1;
+ else if (p[0] == '\"')
+ {
+ if (!insquotes)
+ {
+ if (inquotes) inquotes = 0;
+ else inquotes = 1;
+ }
+ }
+ else if (p[0] == '\'')
+ {
+ if (!inquotes)
+ {
+ if (insquotes) insquotes = 0;
+ else insquotes = 1;
+ }
+ }
+ else if ((!inquotes) && (!insquotes))
+ {
+ if (p[0] == '{') squigglie++;
+ else if (p[0] == '}') squigglie--;
+ if (squigglie == 0)
+ {
+ verbatim_2 = p - 1;
+ break;
+ }
+ }
+ }
+ }
+ if (verbatim_2 > verbatim_1)
+ {
+ int l;
+ char *v;
+
+ l = verbatim_2 - verbatim_1 + 1;
+ v = malloc(l + 1);
+ strncpy(v, verbatim_1, l);
+ v[l] = 0;
+ set_verbatim(v);
+ }
+ else
+ {
+ fprintf(stderr, "%s: Error. parse error %s:%i. { marker
does not have matching } marker\n",
+ progname, file_in, line);
+ exit(-1);
+ }
+ new_object();
+ verbatim = 0;
+ }
}
}
}
@@ -396,6 +465,30 @@
if (clean_file) unlink(clean_file);
}
+int
+is_verbatim(void)
+{
+ return verbatim;
+}
+
+void
+track_verbatim(int on)
+{
+ verbatim = on;
+}
+
+void
+set_verbatim(char *s)
+{
+ verbatim_str = s;
+}
+
+char *
+get_verbatim(void)
+{
+ return verbatim_str;
+}
+
void
compile(void)
{
-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs