summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/fonts/malayalam/preproc/scr.c
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/fonts/malayalam/preproc/scr.c')
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/scr.c185
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;
+}
+
+
+
+
+