summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/lua/lmplib.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/lua/lmplib.c')
-rw-r--r--Build/source/texk/web2c/luatexdir/lua/lmplib.c1273
1 files changed, 0 insertions, 1273 deletions
diff --git a/Build/source/texk/web2c/luatexdir/lua/lmplib.c b/Build/source/texk/web2c/luatexdir/lua/lmplib.c
deleted file mode 100644
index b435618e97b..00000000000
--- a/Build/source/texk/web2c/luatexdir/lua/lmplib.c
+++ /dev/null
@@ -1,1273 +0,0 @@
-/* $Id$ */
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifndef pdfTeX
-#include <lua.h>
-#include <lauxlib.h>
-#include <lualib.h>
-#else
-#include <../lua51/lua.h>
-#include <../lua51/lauxlib.h>
-#include <../lua51/lualib.h>
-#endif
-
-#include "mplib.h"
-#include "mpmp.h"
-#include "mppsout.h" /* for mp_edge_object */
-
-#define MPLIB_METATABLE "MPlib"
-#define MPLIB_FIG_METATABLE "MPlib.fig"
-#define MPLIB_GR_METATABLE "MPlib.gr"
-
-#define mplib_init_S(a) do { \
- lua_pushliteral(L,#a); \
- mplib_##a##_ptr = (char *)lua_tostring(L,-1); \
- mplib_##a##_index = luaL_ref (L,LUA_REGISTRYINDEX); \
- } while (0)
-
-#define mplib_push_S(a) do { \
- lua_rawgeti(L,LUA_REGISTRYINDEX,mplib_##a##_index); \
- } while (0)
-
-#define mplib_is_S(a,i) (mplib_##a##_ptr==(char *)lua_tostring(L,i))
-
-#define mplib_make_S(a) \
- static int mplib_##a##_index = 0; \
- static char *mplib_##a##_ptr = NULL
-
-static int mplib_type_Ses[mp_special_code+1] = {0}; /* [0] is not used */
-
-mplib_make_S(fill);
-mplib_make_S(outline);
-mplib_make_S(text);
-mplib_make_S(special);
-mplib_make_S(start_bounds);
-mplib_make_S(stop_bounds);
-mplib_make_S(start_clip);
-mplib_make_S(stop_clip);
-
-mplib_make_S(left_type);
-mplib_make_S(right_type);
-mplib_make_S(x_coord);
-mplib_make_S(y_coord);
-mplib_make_S(left_x);
-mplib_make_S(left_y);
-mplib_make_S(right_x);
-mplib_make_S(right_y);
-
-mplib_make_S(color);
-mplib_make_S(dash);
-mplib_make_S(depth);
-mplib_make_S(dsize);
-mplib_make_S(font);
-mplib_make_S(height);
-mplib_make_S(htap);
-mplib_make_S(linecap);
-mplib_make_S(linejoin);
-mplib_make_S(miterlimit);
-mplib_make_S(path);
-mplib_make_S(pen);
-mplib_make_S(postscript);
-mplib_make_S(prescript);
-mplib_make_S(transform);
-mplib_make_S(type);
-mplib_make_S(width);
-
-void mplib_init_Ses(lua_State *L) {
- mplib_init_S(fill);
- mplib_init_S(outline);
- mplib_init_S(text);
- mplib_init_S(start_bounds);
- mplib_init_S(stop_bounds);
- mplib_init_S(start_clip);
- mplib_init_S(stop_clip);
- mplib_init_S(special);
-
- mplib_type_Ses[mp_fill_code] = mplib_fill_index;
- mplib_type_Ses[mp_stroked_code] = mplib_outline_index;
- mplib_type_Ses[mp_text_code] = mplib_text_index;
- mplib_type_Ses[mp_start_bounds_code] = mplib_start_bounds_index;
- mplib_type_Ses[mp_stop_bounds_code] = mplib_stop_bounds_index;
- mplib_type_Ses[mp_start_clip_code] = mplib_start_clip_index;
- mplib_type_Ses[mp_stop_clip_code] = mplib_stop_clip_index;
- mplib_type_Ses[mp_special_code] = mplib_special_index;
-
- mplib_init_S(left_type);
- mplib_init_S(right_type);
- mplib_init_S(x_coord);
- mplib_init_S(y_coord);
- mplib_init_S(left_x);
- mplib_init_S(left_y);
- mplib_init_S(right_x);
- mplib_init_S(right_y);
-
- mplib_init_S(color);
- mplib_init_S(dash);
- mplib_init_S(depth);
- mplib_init_S(dsize);
- mplib_init_S(font);
- mplib_init_S(height);
- mplib_init_S(htap);
- mplib_init_S(linecap);
- mplib_init_S(linejoin);
- mplib_init_S(miterlimit);
- mplib_init_S(path);
- mplib_init_S(pen);
- mplib_init_S(postscript);
- mplib_init_S(prescript);
- mplib_init_S(transform);
- mplib_init_S(type);
- mplib_init_S(width);
-}
-
-
-
-
-#define xfree(A) if ((A)!=NULL) { free((A)); A = NULL; }
-
-#define is_mp(L,b) (MP *)luaL_checkudata(L,b,MPLIB_METATABLE)
-#define is_fig(L,b) (struct mp_edge_object **)luaL_checkudata(L,b,MPLIB_FIG_METATABLE)
-#define is_gr_object(L,b) (struct mp_graphic_object **)luaL_checkudata(L,b,MPLIB_GR_METATABLE)
-
-/* Enumeration string arrays */
-
-static const char *interaction_options[] =
- { "unknown","batch","nonstop","scroll","errorstop", NULL};
-
-static const char *mplib_filetype_names[] =
- {"term", "error", "mp", "log", "ps", "mem", "tfm", "map", "pfb", "enc", NULL};
-
-/* only "endpoint" and "explicit" actually happen in paths,
- as well as "open" in elliptical pens */
-
-static const char *knot_type_enum[] =
- { "endpoint", "explicit", "given", "curl", "open", "end_cycle" };
-
-/* object fields */
-
-static const char *fill_fields[] =
- { "type", "path", "htap", "pen", "color", "linejoin", "miterlimit",
- "prescript", "postscript", NULL };
-
-static const char *stroked_fields[] =
- { "type", "path", "pen", "color", "linejoin", "miterlimit", "linecap", "dash",
- "prescript", "postscript", NULL };
-
-static const char *text_fields[] =
- { "type", "text", "dsize", "font", "color", "width", "height", "depth", "transform",
- "prescript", "postscript", NULL };
-
-static const char *special_fields[] =
- { "type", "prescript", NULL };
-
-static const char *start_bounds_fields[] =
- { "type", "path", NULL };
-
-static const char *start_clip_fields[] =
- { "type", "path", NULL };
-
-static const char *stop_bounds_fields[] =
- { "type", NULL };
-
-static const char *stop_clip_fields[] =
- { "type", NULL };
-
-static const char *no_fields[] =
- { NULL };
-
-typedef enum {
- P_ERROR_LINE, P_HALF_LINE, P_MAX_LINE, P_MAIN_MEMORY,
- P_HASH_SIZE, P_HASH_PRIME, P_PARAM_SIZE, P_IN_OPEN, P_RANDOM_SEED,
- P_INTERACTION, P_INI_VERSION, P_TROFF_MODE, P_PRINT_NAMES, P_MEM_NAME,
- P_JOB_NAME, P_FIND_FILE, P__SENTINEL
-} mplib_parm_idx;
-
-typedef struct {
- const char *name; /* parameter name */
- mplib_parm_idx idx; /* parameter index */
-} mplib_parm_struct;
-
-static mplib_parm_struct mplib_parms[] = {
- {"error_line", P_ERROR_LINE },
- {"half_error_line", P_HALF_LINE },
- {"max_print_line", P_MAX_LINE },
- {"main_memory", P_MAIN_MEMORY },
- {"hash_size", P_HASH_SIZE },
- {"hash_prime", P_HASH_PRIME },
- {"param_size", P_PARAM_SIZE },
- {"max_in_open", P_IN_OPEN },
- {"random_seed", P_RANDOM_SEED },
- {"interaction", P_INTERACTION },
- {"ini_version", P_INI_VERSION },
- {"troff_mode", P_TROFF_MODE },
- {"print_found_names", P_PRINT_NAMES },
- {"mem_name", P_MEM_NAME },
- {"job_name", P_JOB_NAME },
- {"find_file", P_FIND_FILE },
- {NULL, P__SENTINEL }
-};
-
-typedef struct _FILE_ITEM {
- FILE *f;
-} _FILE_ITEM ;
-
-typedef struct _FILE_ITEM File;
-
-#define make_stream_buf(A) char *A; size_t A##_size; size_t A##_used
-
-#define free_stream_buf(A) xfree(mplib_data->A); mplib_data->A##_size = 0; mplib_data->A##_used = 0
-
-typedef struct _MPLIB_INSTANCE_DATA {
- void *term_file_ptr;
- void *err_file_ptr;
- void *log_file_ptr;
- void *ps_file_ptr;
- make_stream_buf(term_out);
- make_stream_buf(error_out);
- make_stream_buf(log_out);
- make_stream_buf(ps_out);
- char *input_data;
- char *input_data_ptr;
- size_t input_data_len;
- struct mp_edge_object *edges ;
- lua_State *LL;
-} _MPLIB_INSTANCE_DATA;
-
-typedef struct _MPLIB_INSTANCE_DATA mplib_instance;
-
-static mplib_instance *mplib_get_data (MP mp) {
- return (mplib_instance *)mp->userdata;
-}
-
-static mplib_instance *mplib_make_data (void) {
- mplib_instance *mplib_data = malloc(sizeof(mplib_instance));
- memset(mplib_data,0,sizeof(mplib_instance));
- return mplib_data ;
-}
-
-
-/* Start by defining all the callback routines for the library
- * except |run_make_mpx| and |run_editor|.
- */
-
-
-char *mplib_find_file (MP mp, const char *fname, const char *fmode, int ftype) {
- mplib_instance *mplib_data = mplib_get_data(mp);
- lua_State *L = mplib_data->LL;
- lua_checkstack(L,4);
- lua_getfield(L,LUA_REGISTRYINDEX,"mplib_file_finder");
- if (lua_isfunction(L,-1)) {
- char *s = NULL, *x = NULL;
- lua_pushstring(L, fname);
- lua_pushstring(L, fmode);
- if (ftype >= mp_filetype_text) {
- lua_pushnumber(L, ftype-mp_filetype_text);
- } else {
- lua_pushstring(L, mplib_filetype_names[ftype]);
- }
- if(lua_pcall(L,3,1,0) != 0) {
- fprintf(stdout,"Error in mp.find_file: %s\n", (char *)lua_tostring(L,-1));
- return NULL;
- }
- x = (char *)lua_tostring(L,-1);
- if (x!=NULL)
- s = strdup(x);
- lua_pop(L,1); /* pop the string */
- return s;
- } else {
- lua_pop(L,1);
- }
- if (fmode[0] != 'r' || (! access (fname,R_OK)) || ftype) {
- return strdup(fname);
- }
- return NULL;
-}
-
-static int
-mplib_find_file_function (lua_State *L) {
- if (! (lua_isfunction(L,-1)|| lua_isnil(L,-1) )) {
- return 1; /* error */
- }
- lua_pushstring(L, "mplib_file_finder");
- lua_pushvalue(L,-2);
- lua_rawset(L,LUA_REGISTRYINDEX);
- return 0;
-}
-
-void *mplib_open_file(MP mp, const char *fname, const char *fmode, int ftype) {
- File *ff = malloc(sizeof (File));
- if (ff) {
- mplib_instance *mplib_data = mplib_get_data(mp);
- ff->f = NULL;
- if (ftype==mp_filetype_terminal) {
- if (fmode[0] == 'r') {
- ff->f = stdin;
- } else {
- xfree(mplib_data->term_file_ptr);
- ff->f = malloc(1);
- mplib_data->term_file_ptr = ff->f;
- }
- } else if (ftype==mp_filetype_error) {
- xfree(mplib_data->err_file_ptr);
- ff->f = malloc(1);
- mplib_data->err_file_ptr = ff->f;
- } else if (ftype == mp_filetype_log) {
- xfree(mplib_data->log_file_ptr);
- ff->f = malloc(1);
- mplib_data->log_file_ptr = ff->f;
- } else if (ftype == mp_filetype_postscript) {
- xfree(mplib_data->ps_file_ptr);
- ff->f = malloc(1);
- mplib_data->ps_file_ptr = ff->f;
- } else {
- char realmode[3];
- char *f = mplib_find_file(mp, fname,fmode,ftype);
- if (f==NULL)
- return NULL;
- realmode[0] = *fmode;
- realmode[1] = 'b';
- realmode[2] = 0;
- ff->f = fopen(f, realmode);
- if ((fmode[0] == 'r') && (ff->f == NULL)) {
- free(ff);
- return NULL;
- }
- }
- return ff;
- }
- return NULL;
-}
-
-static int
-mplib_get_char (void *f, mplib_instance *mplib_data) {
- int c;
- if (f==stdin && mplib_data->input_data != NULL) {
- if (mplib_data->input_data_len==0) {
- if (mplib_data->input_data_ptr!=NULL)
- mplib_data->input_data_ptr = NULL;
- else
- mplib_data->input_data = NULL;
- c = EOF;
- } else {
- mplib_data->input_data_len--;
- c = *(mplib_data->input_data_ptr)++;
- }
- } else {
- c = fgetc(f);
- }
- return c;
-}
-
-static void
-mplib_unget_char (void *f, mplib_instance *mplib_data, int c) {
- if (f==stdin && mplib_data->input_data_ptr != NULL) {
- mplib_data->input_data_len++;
- mplib_data->input_data_ptr--;
- } else {
- ungetc(c,f);
- }
-}
-
-
-char *mplib_read_ascii_file (MP mp, void *ff, size_t *size) {
- char *s = NULL;
- if (ff!=NULL) {
- int c;
- size_t len = 0, lim = 128;
- mplib_instance *mplib_data = mplib_get_data(mp);
- FILE *f = ((File *)ff)->f;
- if (f==NULL)
- return NULL;
- *size = 0;
- c = mplib_get_char(f,mplib_data);
- if (c==EOF)
- return NULL;
- s = malloc(lim);
- if (s==NULL) return NULL;
- while (c!=EOF && c!='\n' && c!='\r') {
- if (len==lim) {
- s =realloc(s, (lim+(lim>>2)));
- if (s==NULL) return NULL;
- lim+=(lim>>2);
- }
- s[len++] = c;
- c = mplib_get_char(f,mplib_data);
- }
- if (c=='\r') {
- c = mplib_get_char(f,mplib_data);
- if (c!=EOF && c!='\n')
- mplib_unget_char(f,mplib_data,c);
- }
- s[len] = 0;
- *size = len;
- }
- return s;
-}
-
-#define APPEND_STRING(a,b) do { \
- if ((mplib_data->a##_used+strlen(b))>=mplib_data->a##_size) { \
- mplib_data->a##_size += 256+(mplib_data->a##_size)/5+strlen(b); \
- mplib_data->a = realloc(mplib_data->a,mplib_data->a##_size); \
- } \
- (void)strcpy(mplib_data->a+mplib_data->a##_used,b); \
- mplib_data->a##_used += strlen(b); \
- } while (0)
-
-void mplib_write_ascii_file (MP mp, void *ff, const char *s) {
- if (ff!=NULL) {
- void *f = ((File *)ff)->f;
- mplib_instance *mplib_data = mplib_get_data(mp);
- if (f!=NULL) {
- if (f==mplib_data->term_file_ptr) {
- APPEND_STRING(term_out,s);
- } else if (f==mplib_data->err_file_ptr) {
- APPEND_STRING(error_out,s);
- } else if (f==mplib_data->log_file_ptr) {
- APPEND_STRING(log_out,s);
- } else if (f==mplib_data->ps_file_ptr) {
- APPEND_STRING(ps_out,s);
- } else {
- fprintf((FILE *)f,"%s",s);
- }
- }
- }
-}
-
-void mplib_read_binary_file (MP mp, void *ff, void **data, size_t *size) {
- (void)mp;
- if (ff!=NULL) {
- size_t len = 0;
- FILE *f = ((File *)ff)->f;
- if (f!=NULL)
- len = fread(*data,1,*size,f);
- *size = len;
- }
-}
-
-void mplib_write_binary_file (MP mp, void *ff, void *s, size_t size) {
- (void)mp;
- if (ff!=NULL) {
- FILE *f = ((File *)ff)->f;
- if (f!=NULL)
- fwrite(s,size,1,f);
- }
-}
-
-
-void mplib_close_file (MP mp, void *ff) {
- if (ff!=NULL) {
- mplib_instance *mplib_data = mplib_get_data(mp);
- void *f = ((File *)ff)->f;
- if (f != NULL && f != mplib_data->term_file_ptr && f != mplib_data->err_file_ptr
- && f != mplib_data->log_file_ptr && f != mplib_data->ps_file_ptr) {
- fclose(f);
- }
- free(ff);
- }
-}
-
-int mplib_eof_file (MP mp, void *ff) {
- if (ff!=NULL) {
- mplib_instance *mplib_data = mplib_get_data(mp);
- FILE *f = ((File *)ff)->f;
- if (f==NULL)
- return 1;
- if (f==stdin && mplib_data->input_data != NULL) {
- return (mplib_data->input_data_len==0);
- }
- return feof(f);
- }
- return 1;
-}
-
-void mplib_flush_file (MP mp, void *ff) {
- (void)mp;
- (void)ff;
- return ;
-}
-
-#define APPEND_TO_EDGES(a) do { \
- if (mplib_data->edges==NULL) { \
- mplib_data->edges = hh; \
- } else { \
- struct mp_edge_object *p = mplib_data->edges; \
- while (p->_next!=NULL) { p = p->_next; } \
- p->_next = hh; \
- } \
-} while (0)
-
-void mplib_shipout_backend (MP mp, int h) {
- struct mp_edge_object *hh = mp_gr_export(mp, h);
- if (hh) {
- mplib_instance *mplib_data = mplib_get_data(mp);
- APPEND_TO_EDGES(hh);
- }
-}
-
-
-static void
-mplib_setup_file_ops(struct MP_options * options) {
- options->find_file = mplib_find_file;
- options->open_file = mplib_open_file;
- options->close_file = mplib_close_file;
- options->eof_file = mplib_eof_file;
- options->flush_file = mplib_flush_file;
- options->write_ascii_file = mplib_write_ascii_file;
- options->read_ascii_file = mplib_read_ascii_file;
- options->write_binary_file = mplib_write_binary_file;
- options->read_binary_file = mplib_read_binary_file;
- options->shipout_backend = mplib_shipout_backend;
-}
-
-static int
-mplib_new (lua_State *L) {
- MP *mp_ptr;
- mp_ptr = lua_newuserdata(L, sizeof(MP *));
- if (mp_ptr) {
- int i;
- mplib_instance *mplib_data;
- struct MP_options * options; /* instance options */
- options = mp_options();
- mplib_setup_file_ops(options);
- mplib_data = mplib_make_data();
- mplib_data->LL = L;
- options->userdata = (void *)mplib_data;
- options->noninteractive = 1; /* required ! */
- options->print_found_names = 0;
- if (lua_type(L,1)==LUA_TTABLE) {
- for (i=0;mplib_parms[i].name!=NULL;i++) {
- lua_getfield(L,1,mplib_parms[i].name);
- if (lua_isnil(L,-1)) {
- lua_pop(L,1);
- continue; /* skip unset */
- }
- switch(mplib_parms[i].idx) {
- case P_ERROR_LINE:
- options->error_line = lua_tointeger(L,-1);
- break;
- case P_HALF_LINE:
- options->half_error_line = lua_tointeger(L,-1);
- break;
- case P_MAX_LINE:
- options->max_print_line = lua_tointeger(L,-1);
- break;
- case P_MAIN_MEMORY:
- options->main_memory = lua_tointeger(L,-1);
- break;
- case P_HASH_SIZE:
- options->hash_size = lua_tointeger(L,-1);
- break;
- case P_HASH_PRIME:
- options->hash_prime = lua_tointeger(L,-1);
- break;
- case P_PARAM_SIZE:
- options->param_size = lua_tointeger(L,-1);
- break;
- case P_IN_OPEN:
- options->max_in_open = lua_tointeger(L,-1);
- break;
- case P_RANDOM_SEED:
- options->random_seed = lua_tointeger(L,-1);
- break;
- case P_INTERACTION:
- options->interaction = luaL_checkoption(L,-1,"errorstopmode", interaction_options);
- break;
- case P_INI_VERSION:
- options->ini_version = lua_toboolean(L,-1);
- break;
- case P_TROFF_MODE:
- options->troff_mode = lua_toboolean(L,-1);
- break;
- case P_PRINT_NAMES:
- options->print_found_names = lua_toboolean(L,-1);
- break;
- /*
- case P_COMMAND_LINE:
- options->command_line = strdup((char *)lua_tostring(L,-1));
- break;
- */
- case P_MEM_NAME:
- options->mem_name = strdup((char *)lua_tostring(L,-1));
- break;
- case P_JOB_NAME:
- options->job_name = strdup((char *)lua_tostring(L,-1));
- break;
- case P_FIND_FILE:
- if(mplib_find_file_function(L)) { /* error here */
- fprintf(stdout,"Invalid arguments to mp.new({find_file=...})\n");
- }
- break;
- default:
- break;
- }
- lua_pop(L,1);
- }
- }
- *mp_ptr = mp_new(options);
- xfree(options->command_line);
- xfree(options->mem_name);
- xfree(options->job_name);
- free(options);
- if (*mp_ptr) {
- luaL_getmetatable(L,MPLIB_METATABLE);
- lua_setmetatable(L,-2);
- return 1;
- }
- }
- lua_pushnil(L);
- return 1;
-}
-
-static int
-mplib_collect (lua_State *L) {
- MP *mp_ptr = is_mp(L,1);
- xfree(*mp_ptr);
- return 0;
-}
-
-static int
-mplib_tostring (lua_State *L) {
- MP *mp_ptr = is_mp(L,1);
- if (*mp_ptr!=NULL) {
- lua_pushfstring(L,"<MP %p>",*mp_ptr);
- return 1;
- }
- return 0;
-}
-
-static int
-mplib_wrapresults(lua_State *L, mplib_instance *mplib_data, int h) {
- lua_checkstack(L,5);
- lua_newtable(L);
- if (mplib_data->term_out != NULL) {
- lua_pushstring(L,mplib_data->term_out);
- lua_setfield(L,-2,"term");
- free_stream_buf(term_out);
- }
- if (mplib_data->error_out != NULL) {
- lua_pushstring(L,mplib_data->error_out);
- lua_setfield(L,-2,"error");
- free_stream_buf(error_out);
- }
- if (mplib_data->log_out != NULL ) {
- lua_pushstring(L,mplib_data->log_out);
- lua_setfield(L,-2,"log");
- free_stream_buf(log_out);
- }
- if (mplib_data->edges != NULL ) {
- struct mp_edge_object **v;
- struct mp_edge_object *p = mplib_data->edges;
- int i = 1;
- lua_newtable(L);
- while (p!=NULL) {
- v = lua_newuserdata (L, sizeof(struct mp_edge_object *));
- *v = p;
- luaL_getmetatable(L,MPLIB_FIG_METATABLE);
- lua_setmetatable(L,-2);
- lua_rawseti(L,-2,i); i++;
- p = p->_next;
- }
- lua_setfield(L,-2,"fig");
- mplib_data->edges = NULL;
- }
- lua_pushnumber(L,h);
- lua_setfield(L,-2,"status");
- return 1;
-}
-
-static int
-mplib_execute (lua_State *L) {
- MP *mp_ptr = is_mp(L,1);
- if (*mp_ptr!=NULL && lua_isstring(L,2)) {
- int h;
- mplib_instance *mplib_data = mplib_get_data(*mp_ptr);
- mplib_data->input_data = (char *)lua_tolstring(L,2, &(mplib_data->input_data_len));
- mplib_data->input_data_ptr = mplib_data->input_data;
- if ((*mp_ptr)->run_state==0) {
- h = mp_initialize(*mp_ptr);
- }
- h = mp_execute(*mp_ptr);
- if (mplib_data->input_data_len!=0) {
- mplib_data->input_data = NULL;
- mplib_data->input_data_ptr = NULL;
- mplib_data->input_data_len=0;
- }
- return mplib_wrapresults(L, mplib_data, h);
- } else {
- lua_pushnil(L);
- }
- return 1;
-}
-
-static int
-mplib_finish (lua_State *L) {
- MP *mp_ptr = is_mp(L,1);
- if (*mp_ptr!=NULL) {
- mplib_instance *mplib_data = mplib_get_data(*mp_ptr);
- int h = mp_finish(*mp_ptr);
- return mplib_wrapresults(L, mplib_data, h);
- } else {
- lua_pushnil(L);
- }
- return 1;
-}
-
-static int
-mplib_statistics (lua_State *L) {
- MP *mp_ptr = is_mp(L,1);
- if (*mp_ptr!=NULL) {
- lua_newtable(L);
- lua_pushnumber(L, mp_memory_usage (*mp_ptr));
- lua_setfield(L,-2,"main_memory");
- lua_pushnumber(L, mp_hash_usage (*mp_ptr));
- lua_setfield(L,-2,"hash_size");
- lua_pushnumber(L, mp_param_usage (*mp_ptr));
- lua_setfield(L,-2,"param_size");
- lua_pushnumber(L, mp_open_usage (*mp_ptr));
- lua_setfield(L,-2,"max_in_open");
- } else {
- lua_pushnil(L);
- }
- return 1;
-}
-
-
-/* figure methods */
-
-static int
-mplib_fig_collect (lua_State *L) {
- struct mp_edge_object **hh = is_fig(L,1);
- if (*hh!=NULL) {
- mp_gr_toss_objects (*hh);
- *hh=NULL;
- }
- return 0;
-}
-
-static int
-mplib_fig_body (lua_State *L) {
- int i = 1;
- struct mp_graphic_object **v;
- struct mp_graphic_object *p;
- struct mp_edge_object **hh = is_fig(L,1);
- lua_newtable(L);
- p = (*hh)->body;
- while (p!=NULL) {
- v = lua_newuserdata (L, sizeof(struct mp_graphic_object *));
- *v = p;
- luaL_getmetatable(L,MPLIB_GR_METATABLE);
- lua_setmetatable(L,-2);
- lua_rawseti(L,-2,i); i++;
- p = p->_link_field;
- }
- (*hh)->body = NULL; /* prevent double free */
- return 1;
-}
-
-static int
-mplib_fig_copy_body (lua_State *L) {
- int i = 1;
- struct mp_graphic_object **v;
- struct mp_graphic_object *p;
- struct mp_edge_object **hh = is_fig(L,1);
- lua_newtable(L);
- p = (*hh)->body;
- while (p!=NULL) {
- v = lua_newuserdata (L, sizeof(struct mp_graphic_object *));
- *v = mp_gr_copy_object((*hh)->_parent,p);
- luaL_getmetatable(L,MPLIB_GR_METATABLE);
- lua_setmetatable(L,-2);
- lua_rawseti(L,-2,i); i++;
- p = p->_link_field;
- }
- return 1;
-}
-
-
-static int
-mplib_fig_tostring (lua_State *L) {
- struct mp_edge_object **hh = is_fig(L,1);
- lua_pushfstring(L,"<figure %p>",*hh);
- return 1;
-}
-
-
-
-static int
-mp_wrapped_shipout (struct mp_edge_object *hh, int prologues, int procset) {
- MP mp = hh->_parent;
- if (setjmp(mp->jump_buf)) {
- return 0;
- }
- mp_gr_ship_out(hh,prologues,procset);
- return 1;
-}
-
-static int
-mplib_fig_postscript (lua_State *L) {
- struct mp_edge_object **hh = is_fig(L,1);
- int prologues = luaL_optnumber(L,2,-1);
- int procset = luaL_optnumber(L,3,-1);
- mplib_instance *mplib_data = mplib_get_data((*hh)->_parent);
- if (mplib_data->ps_out == NULL) {
- if (mp_wrapped_shipout(*hh,prologues, procset)) {
- if (mplib_data->ps_out!=NULL ) {
- lua_pushstring(L, mplib_data->ps_out);
- free_stream_buf(ps_out);
- } else {
- lua_pushnil(L);
- }
- return 1;
- } else {
- lua_pushnil(L);
- lua_pushstring(L,mplib_data->log_out);
- xfree(mplib_data->ps_out);
- return 2;
- }
- }
- lua_pushnil(L);
- return 1;
-}
-
-static int
-mplib_fig_filename (lua_State *L) {
- struct mp_edge_object **hh = is_fig(L,1);
- if (*hh!= NULL) {
- char *s = (*hh)->_filename;
- lua_pushstring(L,s);
- } else {
- lua_pushnil(L);
- }
- return 1;
-}
-
-
-static int
-mplib_fig_bb (lua_State *L) {
- struct mp_edge_object **hh = is_fig(L,1);
- lua_newtable(L);
- lua_pushnumber(L, (double)(*hh)->_minx/65536.0);
- lua_rawseti(L,-2,1);
- lua_pushnumber(L, (double)(*hh)->_miny/65536.0);
- lua_rawseti(L,-2,2);
- lua_pushnumber(L, (double)(*hh)->_maxx/65536.0);
- lua_rawseti(L,-2,3);
- lua_pushnumber(L, (double)(*hh)->_maxy/65536.0);
- lua_rawseti(L,-2,4);
- return 1;
-}
-
-/* object methods */
-
-static int
-mplib_gr_collect (lua_State *L) {
- struct mp_graphic_object **hh = is_gr_object(L,1);
- if (*hh!=NULL) {
- mp_gr_toss_object(*hh);
- *hh=NULL;
- }
- return 0;
-}
-
-static int
-mplib_gr_tostring (lua_State *L) {
- struct mp_graphic_object **hh = is_gr_object(L,1);
- lua_pushfstring(L,"<object %p>",*hh);
- return 1;
-}
-
-
-static int
-mplib_gr_fields (lua_State *L) {
- const char **fields;
- int i ;
- struct mp_graphic_object **hh = is_gr_object(L,1);
- if (*hh) {
- switch ((*hh)->_type_field) {
- case mp_fill_code: fields = fill_fields; break;
- case mp_stroked_code: fields = stroked_fields; break;
- case mp_text_code: fields = text_fields; break;
- case mp_special_code: fields = special_fields; break;
- case mp_start_clip_code: fields = start_clip_fields; break;
- case mp_start_bounds_code: fields = start_bounds_fields; break;
- case mp_stop_clip_code: fields = stop_clip_fields; break;
- case mp_stop_bounds_code: fields = stop_bounds_fields; break;
- default: fields = no_fields;
- }
- lua_newtable(L);
- for (i=0;fields[i]!=NULL;i++) {
- lua_pushstring(L,fields[i]);
- lua_rawseti(L,-2,(i+1));
- }
- } else {
- lua_pushnil(L);
- }
- return 1;
-}
-
-
-#define mplib_push_number(L,x) lua_pushnumber(L,(lua_Number)(x)/65536.0)
-
-#define MPLIB_PATH 0
-#define MPLIB_PEN 1
-
-static void
-mplib_push_path (lua_State *L, struct mp_knot *h, int is_pen) {
- struct mp_knot *p; /* for scanning the path */
- int i=1;
- p=h;
- if (p!=NULL) {
- lua_newtable(L);
- do {
- lua_createtable(L,0,6);
- if (!is_pen) {
- if (p->left_type_field != mp_explicit) {
- mplib_push_S(left_type);
- lua_pushstring(L,knot_type_enum[p->left_type_field]);
- lua_rawset(L,-3);
- }
- if (p->right_type_field != mp_explicit) {
- mplib_push_S(right_type);
- lua_pushstring(L,knot_type_enum[p->right_type_field]);
- lua_rawset(L,-3);
- }
- }
- mplib_push_S(x_coord);
- mplib_push_number(L,p->x_coord_field);
- lua_rawset(L,-3);
- mplib_push_S(y_coord);
- mplib_push_number(L,p->y_coord_field);
- lua_rawset(L,-3);
- mplib_push_S(left_x);
- mplib_push_number(L,p->left_x_field);
- lua_rawset(L,-3);
- mplib_push_S(left_y);
- mplib_push_number(L,p->left_y_field);
- lua_rawset(L,-3);
- mplib_push_S(right_x);
- mplib_push_number(L,p->right_x_field);
- lua_rawset(L,-3);
- mplib_push_S(right_y);
- mplib_push_number(L,p->right_y_field);
- lua_rawset(L,-3);
- lua_rawseti(L,-2,i); i++;
- if ( p->right_type_field==mp_endpoint ) {
- return;
- }
- p=p->next_field;
- } while (p!=h) ;
- } else {
- lua_pushnil(L);
- }
-}
-
-/* this assumes that the top of the stack is a table
- or nil already in the case
- */
-static void
-mplib_push_pentype (lua_State *L, struct mp_knot *h) {
- struct mp_knot *p; /* for scanning the path */
- p=h;
- if (p==NULL) {
- /* do nothing */
- } else if (p==p->next_field) {
- mplib_push_S(type);
- lua_pushstring(L,"elliptical");
- lua_rawset(L,-3);
- } else {
- }
-}
-
-#define set_color_objects(pq) \
- object_color_model = pq->color_model_field; \
- object_color_a = pq->color_field._a_val; \
- object_color_b = pq->color_field._b_val; \
- object_color_c = pq->color_field._c_val; \
- object_color_d = pq->color_field._d_val;
-
-
-static void
-mplib_push_color (lua_State *L, struct mp_graphic_object *p ) {
- int object_color_model;
- int object_color_a, object_color_b, object_color_c, object_color_d ;
- if (p!=NULL) {
- if (p->_type_field == mp_fill_code) {
- mp_fill_object *h = (mp_fill_object *)p;
- set_color_objects(h);
- } else if (p->_type_field == mp_stroked_code) {
- mp_stroked_object *h = (mp_stroked_object *)p;
- set_color_objects(h);
- } else {
- mp_text_object *h = (mp_text_object *)p;
- set_color_objects(h);
- }
- lua_newtable(L);
- if (object_color_model >= mp_grey_model) {
- mplib_push_number(L,object_color_a);
- lua_rawseti(L,-2,1);
- if (object_color_model >= mp_rgb_model) {
- mplib_push_number(L,object_color_b);
- lua_rawseti(L,-2,2);
- mplib_push_number(L,object_color_c);
- lua_rawseti(L,-2,3);
- if (object_color_model == mp_cmyk_model) {
- mplib_push_number(L,object_color_d);
- lua_rawseti(L,-2,4);
- }
- }
- }
- } else {
- lua_pushnil(L);
- }
-}
-
-/* the dash scale is not exported, the field has no external value */
-static void
-mplib_push_dash (lua_State *L, struct mp_stroked_object *h ) {
- mp_dash_object *d;
- double ds;
- if (h!=NULL && h->dash_p_field != NULL) {
- d = h->dash_p_field;
- lua_newtable(L);
- mplib_push_number(L,d->offset_field);
- lua_setfield(L,-2,"offset");
- if (d->array_field!=NULL ) {
- int i = 0;
- lua_newtable(L);
- while (*(d->array_field+i) != -1) {
- ds = *(d->array_field+1) / 65536.0;
- lua_pushnumber(L, ds);
- i++;
- lua_rawseti(L,-2,i);
- }
- lua_setfield(L,-2,"dashes");
- }
- } else {
- lua_pushnil(L);
- }
-}
-
-static void
-mplib_push_transform (lua_State *L, struct mp_text_object *h ) {
- int i = 1;
- if (h!=NULL) {
- lua_createtable(L,6,0);
- mplib_push_number(L,h->tx_field);
- lua_rawseti(L,-2,i); i++;
- mplib_push_number(L,h->ty_field);
- lua_rawseti(L,-2,i); i++;
- mplib_push_number(L,h->txx_field);
- lua_rawseti(L,-2,i); i++;
- mplib_push_number(L,h->tyx_field);
- lua_rawseti(L,-2,i); i++;
- mplib_push_number(L,h->txy_field);
- lua_rawseti(L,-2,i); i++;
- mplib_push_number(L,h->tyy_field);
- lua_rawseti(L,-2,i); i++;
- } else {
- lua_pushnil(L);
- }
-}
-
-#define FIELD(A) (mplib_is_S(A,2))
-
-static void
-mplib_fill_field (lua_State *L, struct mp_fill_object *h) {
- if (FIELD(path)) {
- mplib_push_path(L, h->path_p_field, MPLIB_PATH);
- } else if (FIELD(htap)) {
- mplib_push_path(L, h->htap_p_field, MPLIB_PATH);
- } else if (FIELD(pen)) {
- mplib_push_path(L, h->pen_p_field, MPLIB_PEN);
- mplib_push_pentype(L, h->pen_p_field);
- } else if (FIELD(color)) {
- mplib_push_color(L,(mp_graphic_object *)h);
- } else if (FIELD(linejoin)) {
- lua_pushnumber(L,h->ljoin_field);
- } else if (FIELD(miterlimit)) {
- mplib_push_number(L,h->miterlim_field);
- } else if (FIELD(prescript)) {
- lua_pushstring(L,h->pre_script_field);
- } else if (FIELD(postscript)) {
- lua_pushstring(L,h->post_script_field);
- } else {
- lua_pushnil(L);
- }
-}
-
-static void
-mplib_stroked_field (lua_State *L, struct mp_stroked_object *h) {
- if (FIELD(path)) {
- mplib_push_path(L, h->path_p_field, MPLIB_PATH);
- } else if (FIELD(pen)) {
- mplib_push_path(L, h->pen_p_field, MPLIB_PEN);
- mplib_push_pentype(L, h->pen_p_field);
- } else if (FIELD(color)) {
- mplib_push_color(L, (mp_graphic_object *)h);
- } else if (FIELD(dash)) {
- mplib_push_dash(L,h);
- } else if (FIELD(linecap)) {
- lua_pushnumber(L,h->lcap_field);
- } else if (FIELD(linejoin)) {
- lua_pushnumber(L,h->ljoin_field);
- } else if (FIELD(miterlimit)) {
- mplib_push_number(L,h->miterlim_field);
- } else if (FIELD(prescript)) {
- lua_pushstring(L,h->pre_script_field);
- } else if (FIELD(postscript)) {
- lua_pushstring(L,h->post_script_field);
- } else {
- lua_pushnil(L);
- }
-}
-
-static void
-mplib_text_field (lua_State *L, struct mp_text_object *h) {
- if (FIELD(text)) {
- lua_pushstring(L,h->text_p_field);
- } else if (FIELD(dsize)) {
- mplib_push_number(L,(h->font_dsize_field/16));
- } else if (FIELD(font)) {
- lua_pushstring(L,h->font_name_field);
- } else if (FIELD(color)) {
- mplib_push_color(L,(mp_graphic_object *)h);
- } else if (FIELD(width)) {
- mplib_push_number(L,h->width_field);
- } else if (FIELD(height)) {
- mplib_push_number(L,h->height_field);
- } else if (FIELD(depth)) {
- mplib_push_number(L,h->depth_field);
- } else if (FIELD(transform)) {
- mplib_push_transform(L,h);
- } else if (FIELD(prescript)) {
- lua_pushstring(L,h->pre_script_field);
- } else if (FIELD(postscript)) {
- lua_pushstring(L,h->post_script_field);
- } else {
- lua_pushnil(L);
- }
-}
-
-static void
-mplib_special_field (lua_State *L, struct mp_special_object *h) {
- if (FIELD(prescript)) {
- lua_pushstring(L,h->pre_script_field);
- } else {
- lua_pushnil(L);
- }
-}
-
-static void
-mplib_start_bounds_field (lua_State *L, struct mp_bounds_object *h) {
- if (FIELD(path)) {
- mplib_push_path(L,h->path_p_field, MPLIB_PATH);
- } else {
- lua_pushnil(L);
- }
-}
-
-static void
-mplib_start_clip_field (lua_State *L, struct mp_clip_object *h) {
- if (FIELD(path)) {
- mplib_push_path(L,h->path_p_field, MPLIB_PATH);
- } else {
- lua_pushnil(L);
- }
-}
-
-static int
-mplib_gr_index (lua_State *L) {
- struct mp_graphic_object **hh = is_gr_object(L,1);
- if (*hh) {
- struct mp_graphic_object *h = *hh;
-
- if (mplib_is_S(type,2)) {
- lua_rawgeti(L,LUA_REGISTRYINDEX,mplib_type_Ses[h->_type_field]);
- } else {
- switch (h->_type_field) {
- case mp_fill_code: mplib_fill_field(L,(mp_fill_object *)h); break;
- case mp_stroked_code: mplib_stroked_field(L,(mp_stroked_object *)h); break;
- case mp_text_code: mplib_text_field(L,(mp_text_object *)h); break;
- case mp_special_code: mplib_special_field(L,(mp_special_object *)h); break;
- case mp_start_clip_code: mplib_start_clip_field(L,(mp_clip_object *)h); break;
- case mp_start_bounds_code: mplib_start_bounds_field(L,(mp_bounds_object *)h); break;
- /* case mp_stop_clip_code: */
- /* case mp_stop_bounds_code: */
- default: lua_pushnil(L);
- }
- }
- } else {
- lua_pushnil(L);
- }
- return 1;
-}
-
-
-static const struct luaL_reg mplib_meta[] = {
- {"__gc", mplib_collect},
- {"__tostring", mplib_tostring},
- {NULL, NULL} /* sentinel */
-};
-
-static const struct luaL_reg mplib_fig_meta[] = {
- {"__gc", mplib_fig_collect },
- {"__tostring", mplib_fig_tostring },
- {"objects", mplib_fig_body },
- {"copy_objects", mplib_fig_copy_body },
- {"filename", mplib_fig_filename },
- {"postscript", mplib_fig_postscript },
- {"boundingbox", mplib_fig_bb },
- {NULL, NULL} /* sentinel */
-};
-
-static const struct luaL_reg mplib_gr_meta[] = {
- {"__gc", mplib_gr_collect },
- {"__tostring", mplib_gr_tostring },
- {"__index", mplib_gr_index },
- {NULL, NULL} /* sentinel */
-};
-
-
-static const struct luaL_reg mplib_d [] = {
- {"execute", mplib_execute },
- {"finish", mplib_finish },
- {"statistics", mplib_statistics },
- {NULL, NULL} /* sentinel */
-};
-
-
-static const struct luaL_reg mplib_m[] = {
- {"new", mplib_new },
- {"fields", mplib_gr_fields },
- {NULL, NULL} /* sentinel */
-};
-
-
-int
-luaopen_mp (lua_State *L) {
- mplib_init_Ses(L);
-
- luaL_newmetatable(L,MPLIB_GR_METATABLE);
- lua_pushvalue(L, -1); /* push metatable */
- lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */
- luaL_register(L, NULL, mplib_gr_meta); /* object meta methods */
- lua_pop(L,1);
-
- luaL_newmetatable(L,MPLIB_FIG_METATABLE);
- lua_pushvalue(L, -1); /* push metatable */
- lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */
- luaL_register(L, NULL, mplib_fig_meta); /* figure meta methods */
- lua_pop(L,1);
-
- luaL_newmetatable(L,MPLIB_METATABLE);
- lua_pushvalue(L, -1); /* push metatable */
- lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */
- luaL_register(L, NULL, mplib_meta); /* meta methods */
- luaL_register(L, NULL, mplib_d); /* dict methods */
- luaL_register(L, "mplib", mplib_m); /* module functions */
- return 1;
-}
-