diff options
Diffstat (limited to 'Master/texmf-dist/source/fonts/malayalam/preproc/scr.c')
-rw-r--r-- | Master/texmf-dist/source/fonts/malayalam/preproc/scr.c | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/scr.c b/Master/texmf-dist/source/fonts/malayalam/preproc/scr.c new file mode 100644 index 00000000000..7a323e9e372 --- /dev/null +++ b/Master/texmf-dist/source/fonts/malayalam/preproc/scr.c @@ -0,0 +1,185 @@ +/* + +scr.c -- read script table from file + +History: + 26-APR-1993 changed directory structure of source files (JH) + 24-DEC-1992 added ability to look in directory given by home + 08-OCT-1992 added support for at{end|begin}syllabe (JH) + 21-JUL-1992 added support for reepham (JH) + 06-JUL-1992 Genesis (Jeroen Hellingman) + +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "scr.h" +#include "mm.h" + +extern char *progname; +extern int verbose; + +static AVLtree *read_prebuild(FILE *f); +static AVLtree *read_table(FILE *f); + + +scr_table *read_scr(char *filename) +{ int stop = FALSE; + char b[BUFSIZE]; + char *command=b; + string_list *rest=NULL; + scr_table *result = NULL; + FILE *f; + + f = fopen(filename, "r"); + if(f==NULL) + { filename = prepend_home(filename); + f = fopen(filename, "r"); + if(f==NULL) + { fprintf(stderr, "%s: can't open %s\n", progname, filename); + exit(1); + } + } + if(verbose) printf("reading script definition from %s\n", filename); + + result=malloc(sizeof(scr_table)); + if(result==NULL){fprintf(stderr,"can't allocate\n");exit(0);} + + result->prebuild = NULL; + result->primary = NULL; + result->secondary = NULL; + result->atbegin = NULL; + result->atend = NULL; + result->atbeginsyllabe = ""; + result->atendsyllabe = ""; + result->reepham = FALSE; + + get_command(f, command, &rest); + if(strcmp(command, "malayalam")!=0) + { fprintf(stderr, "%s: script type is not malayalam\n", progname); + exit(0); + } + result->script_type = MALAYALAM_SCRIPT; + + while(!stop) + { get_command(f, command, &rest); + if(command == NULL || strcmp(command, "end")==0) + { if(result->prebuild == NULL || + result->atbegin == NULL || + result->atend == NULL) + { fprintf(stderr, "%s: invalid script file &s:\n", progname, filename); + if(result->prebuild == NULL) + fprintf(stderr, "no @prebuild given\n"); + if(result->atbegin == NULL) + fprintf(stderr, "no @atbegin given\n"); + if(result->atend == NULL) + fprintf(stderr, "no @atend given\n"); + exit(1); + } + stop = TRUE; + } + else /* handle commmands */ + { if(strcmp(command, "atbegin")==0) + result->atbegin = rest->s; + else + { if(strcmp(command, "atend")==0) + result->atend = rest->s; + else + { if(strcmp(command, "prebuild")==0) + result->prebuild = read_prebuild(f); + else + { if(strcmp(command, "primary")==0) + result->primary = read_table(f); + else + { if(strcmp(command, "secondary")==0) + result->secondary = read_table(f); + else + { if(strcmp(command, "reepham")==0) + result->reepham = TRUE; + else + { if(strcmp(command, "atbeginsyllabe")==0) + result->atbeginsyllabe = rest->s; + else + { if(strcmp(command, "atendsyllabe")==0) + result->atendsyllabe = rest->s; + else + { fprintf(stderr, "unknown command @%s ignored\n", command); + } + }}}}}}}} + } + return result; +} + +prebuild_char *new_prebuild_char(char *c, char *g) +{ prebuild_char *result = NULL; + + result = malloc(sizeof(prebuild_char)); + if(result==NULL){fprintf(stderr,"can't allocate\n");exit(0);} + + result->c = c; + result->g = g; + + return result; +} + +int cmp_prebuild_char(void *a, void *b) +{ return strcmp(((prebuild_char*)a)->c, ((prebuild_char*)b)->c); +} + +static AVLtree *read_prebuild(FILE *f) +{ AVLtree *result = NULL; + string_list *l; + + while((l = get_line(f)) != NULL) + { + if(l->n==NULL) + { fprintf(stderr, "incomplete line\n"); + } + else + { prebuild_char *p = new_prebuild_char(l->s, l->n->s); + AVLinsert(p, &result, cmp_prebuild_char); + } + } + return result; +} + +glyph_pair *new_glyph_pair(char *c, char *b, char *a) +{ glyph_pair *result = NULL; + + result = malloc(sizeof(glyph_pair)); + if(result==NULL){fprintf(stderr,"can't allocate\n");exit(0);} + + result->c = c; + result->b = b; + result->a = a; + + return result; +} + +int cmp_glyph_pair(void *a, void *b) +{ return strcmp(((glyph_pair*)a)->c, ((glyph_pair*)b)->c); +} + +static AVLtree *read_table(FILE *f) +{ AVLtree *result = NULL; + string_list *l; + + while((l = get_line(f)) != NULL) + { + if(l->n==NULL || l->n->n == NULL) + { fprintf(stderr, "incomplete line\n"); + } + else + { glyph_pair *p = new_glyph_pair(l->s, l->n->s, l->n->n->s); + AVLinsert(p, &result, cmp_glyph_pair); + } + } + return result; +} + + + + + |