openbsd-ports/graphics/glut/patches/patch-lib_glut_strokegen_y
lebel 7f08f73fef initial import of glut-3.7:
--
The OpenGL Utility Toolkit, a window system independent toolkit for
writing OpenGL programs. It implements a simple windowing application
programming interface (API) for OpenGL.  GLUT is designed for
constructing small to medium sized OpenGL programs. While GLUT is
well-suited to learning OpenGL and developing simple OpenGL
applications, GLUT is not a full-featured toolkit so large applications
requiring sophisticated user interfaces are better off using native
window system toolkits like Motif.
 
WWW: http://reality.sgi.com/opengl/glut3/glut3.html

Submitted by Dan Weeks <danimal@danimal.org>
2001-06-20 18:55:24 +00:00

1303 lines
33 KiB
Plaintext

$OpenBSD: patch-lib_glut_strokegen_y,v 1.1.1.1 2001/06/20 18:55:24 lebel Exp $
--- lib/glut/strokegen.y.orig Fri Aug 7 20:09:09 1998
+++ lib/glut/strokegen.y Wed Jun 20 12:11:38 2001
@@ -1,649 +1,649 @@
-%{
-/* $XConsortium: to_wfont.y,v 5.7 94/04/17 20:10:08 rws Exp $ */
-
-/*****************************************************************
-
-Copyright (c) 1989,1990, 1991 X Consortium
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of the X Consortium shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from the X Consortium.
-
-Copyright (c) 1989,1990, 1991 by Sun Microsystems, Inc.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Sun Microsystems,
-and the X Consortium, not be used in advertising or publicity
-pertaining to distribution of the software without specific, written
-prior permission.
-
-SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
-SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-
-#define YYMAXDEPTH 10000
-
-#include <X11/Xos.h>
-#include <stdio.h>
-#include <ctype.h>
-#ifndef L_SET
-#define L_SET SEEK_SET
-#endif
-#include "stroke.h"
-
-#ifdef X_NOT_STDC_ENV
-FILE *fopen();
-#endif
-
-typedef struct {
-
- float std_left, /* NCGA standard left spacing */
- std_wide, /* character width */
- std_rght; /* Right spacing */
-} Standard;
-
-
-char fname[80];
-char symname[80] = "FONT";
-Dispatch *Table; /* dispatch table */
-Standard *sp_table; /* NCGA font spacings */
-Path *strokes; /* strokes of each character */
-Property *property; /* property list */
-
-struct {
- int path, point, props;
-} count, expect;
-
-Path_subpath *current_path;
-
-Font_header head; /* font header */
-int tableindex; /* which character */
-int yyerrno; /* error number */
-
-%}
-
-%union {
- int nil; /* void is reserved */
- int ival;
- float dval;
- char *cval;
-}
-
-%start font
-
-%token <dval> REAL
-%token <ival> INTEGER
-%token <cval> STRING
-
-%token <nil> BOTTOM
-%token <nil> CENTER
-%token <nil> CLOSE
-%token <nil> FONTNAME
-%token <nil> PROPERTIES
-%token <nil> NUM_CH
-%token <nil> INDEX
-%token <nil> L_SPACE
-%token <nil> MAGIC
-%token <nil> OPEN
-%token <nil> RIGHT
-%token <nil> R_SPACE
-%token <nil> STROKE
-%token <nil> TOP
-%token <nil> VERTICES
-%token <nil> BEARING
-%token <nil> WIDTH
-
-%type <cval> fontname
-%type <ival> properties
-%type <dval> top bottom center right
-%type <ival> nstroke nvertice n_pts index num_ch
-%type <ival> closeflag
-%type <ival> counter
-%type <dval> sp_left wide sp_right
-
-%%
-
-font : fontheader num_ch fontprops fontbody spacing { fini(); }|
- fontheader fontbody { fini(); };
-
-fontheader : fontname top bottom
- { wf_header($1, $2, $3); };
-
-fontname : FONTNAME STRING
- { $$ = $2; };
-
-top : TOP REAL { $$ = $2;};
-
-bottom : BOTTOM REAL { $$ = $2;};
-
-num_ch: NUM_CH INTEGER { set_num_ch($2);};
-
-fontprops : /* empty */ | properties;
-
-properties : PROPERTIES INTEGER { init_properties ($2); } property_list
- { check_num_props (); }
-
-property_list : /* empty */ | single_property property_list
-
-single_property : STRING STRING { add_property($1, $2); };
-
-fontbody : /* empty */
- | glyph fontbody;
-
-glyph : glyph_header strokes
- { check_nstroke(); };
-
-glyph_header : index { tableindex = $1; } sym_headinfo;
-
-sym_headinfo : nstroke center right nvertice
- { glyph_header($1, $2, $3, $4); };
-
-index : INDEX INTEGER { check_num_ch(); $$ = $2; };
-
-nstroke : STROKE INTEGER { $$ = $2; expect.path = $2; };
-
-nvertice: {$$ = 0;} | VERTICES INTEGER { $$ = $2; } ;
-
-center : CENTER REAL{ $$ = $2; };
-
-right : RIGHT REAL{ $$ = $2; };
-
-strokes : /* empty */ | path strokes;
-
-path : closeflag n_pts { init_path($1, $2); } points
- { check_npts(); }
-
-points : /* empty */ | coord points;
-
-closeflag : CLOSE { $$ = $1 == CLOSE; } | OPEN { $$ = $1 == CLOSE; } ;
-
-n_pts : INTEGER { $$ = $1; };
-
-coord : REAL REAL { add_point($1, $2); };
-
-spacing : /* empty */
- | item spacing;
-
-item : counter {tableindex = $1;} sp_left wide sp_right
- { std_space($3, $4, $5); };
-
-counter : BEARING INTEGER {$$ = $2;};
-
-sp_left: L_SPACE REAL {$$ = $2;};
-
-wide : WIDTH REAL {$$ = $2;};
-
-sp_right: R_SPACE REAL {$$ = $2;};
-
-%%
-
-#define BYE(err) yyerrno = (err), yyerror()
-
-#define ERR_BASE 1000
-#define OPEN_ERROR 1001
-#define WRITE_ERROR 1002
-#define WRONG_NAME 1003
-#define NO_MEMORY 1004
-#define EXCEED_PATH 1005
-#define EXCEED_POINT 1006
-#define PATH_MISMATCH 1007
-#define POINT_MISMATCH 1008
-#define PROP_MISMATCH 1009
-#define EXCEED_PROPS 1010
-
-char *prog;
-
-main(argc, argv)
- int argc;
- char *argv[];
-
-{
- /* Usage : to_wfont [-o outfile] [infile] */
- char *s;
-
- fname[0] = 0;
- tableindex = 0;
- head.num_ch = -1;
-
- prog = *argv;
- while (--argc > 0 && *++argv != NULL) {
- s = *argv;
- if (*s++ == '-')
- switch (*s) {
- case 's':
- if (*++argv != NULL)
- {
- --argc;
- (void) strcpy(symname, *argv);
- }
- break;
- case 'o':
- if (*++argv != NULL)
- {
- --argc;
- (void) strcpy(fname, *argv);
- }
- break;
- default: /* ignore other options */
- ;
- }
- else {
- FILE *fp;
-
- /* standard input redirection */
- fp = fopen(*argv, "r");
- if (fp != NULL) {
- if (close(fileno(stdin)) < 0)
- {
- perror(prog);
- return;
- }
- if (dup(fileno(fp)) < 0)
- {
- perror(prog);
- return;
- }
- (void) fclose(fp);
- }
- }
- }
- return (yyparse());
-}
-
-/* set number of characters */
-set_num_ch(num_ch)
-int num_ch;
-{
- yyerrno = 0;
- head.num_ch = num_ch;
- if (num_ch > 0) {
- Table = (Dispatch *) malloc(num_ch * sizeof(Dispatch));
- sp_table = (Standard *) malloc(num_ch * sizeof(Standard));
- strokes = (Path *) malloc(num_ch * sizeof(Path));
- }
-
- for (tableindex = 0; tableindex < num_ch; tableindex++) {
- Table[tableindex].center = 0.0;
- Table[tableindex].right = 0.0;
- Table[tableindex].offset = 0;
-
- sp_table[tableindex].std_left = 0.0;
- sp_table[tableindex].std_wide = 0.0;
- sp_table[tableindex].std_rght = 0.0;
-
- strokes[tableindex].n_subpaths = 0;
- strokes[tableindex].n_vertices = 0;
- strokes[tableindex].subpaths = NULL;
- }
-}
-
-/* initialize the property info in the header */
-init_properties(num_props)
- int num_props;
-{
- if (num_props > 0) {
- head.properties = (Property *)
- malloc (num_props * sizeof (Property));
- head.num_props = expect.props = num_props;
- }
- else {
- head.properties = NULL;
- head.num_props = expect.props = 0;
- }
- count.props = -1;
- property = head.properties; /* initialize the list pointer */
-}
-
-check_num_props()
-{
- count.props++;
- if (count.props != expect.props)
- BYE (PROP_MISMATCH);
-}
-
-/* add individual property info into the buffer */
-add_property(name, value)
- char *name,
- *value;
-{
- /* check if the property exceeds allocated space */
-
- if (++count.props >= head.num_props)
- BYE(EXCEED_PROPS);
-
- /* copy the strings into the buffer */
-
- (void) strcpy (property->propname, name);
- (void) strcpy (property->propvalue, value);
-
- /* increment the property pointer */
-
- property++;
-}
-
-check_num_ch()
-{
-
- if (head.num_ch == -1)
- set_num_ch(128);
-
-}
-
-yyerror()
-{
-#ifndef __bsdi__
- extern int yylineno;
-#endif
-# define ERR_SIZE (sizeof(err_string) / sizeof(char *))
- static char *err_string[] = {
- "Cannot open file",
- "Write fails",
- "Illegal font name",
- "Memory allocation failure",
- "Specified number of strokes exceeded",
- "Specified number of points exceeded",
- "Number of strokes do not match",
- "Number of points do not match",
- "Number of properties do not match",
- "Specified number of properties exceeded",
- 0};
- char *str;
-
- yyerrno -= ERR_BASE;
- if (yyerrno > 0 && yyerrno < ERR_SIZE)
- str = err_string[yyerrno-1];
- else
- str = "Syntax error";
-#ifdef __bsdi__
- fprintf(stderr, "%s.\n", str);
-#else
- fprintf(stderr, "line %d: %s.\n", yylineno, str);
-#endif
- freeall();
- (void) unlink(fname);
- exit(1);
-}
-
-/* create wfont header */
-wf_header(name, top, bottom)
- char *name;
- float top,
- bottom;
-{
-
- if (name == NULL)
- BYE(WRONG_NAME);
- head.top = (float) top;
- head.bottom = (float) bottom;
- head.magic = WFONT_MAGIC_PEX;
- (void) strcpy(head.name, name);
- free(name);
-}
-
-/* create header for each glyph */
-glyph_header(npath, center, right, npts)
- int npath,
- npts;
- float center,
- right;
-{
- {
- register Path *strk = strokes + tableindex;
-
- if (npath > 0) /* Don't allocate space unless the character
- has strokes associated with it. */
- {
- strk->subpaths = (Path_subpath *)
- malloc(npath * sizeof (Path_subpath));
-
- if (strk->subpaths == NULL)
- BYE(NO_MEMORY);
-
- strk->type = PATH_2DF;
- strk->n_subpaths = npath;
- strk->n_vertices = npts;
- }
- else { /* Just initialize the entry */
- strk->subpaths = NULL;
- strk->type = PATH_2DF;
- strk->n_subpaths = 0;
- strk->n_vertices = 0;
- }
- }
- {
- register Dispatch *tbl = Table + tableindex;
-
- tbl->offset = 0;
- tbl->center = center;
- tbl->right = right;
- }
- count.path = -1; /* initialize path counter, not to
- * exceed n_subpath */
-}
-
-/* create standard spacing info for each glyph */
-std_space(l_bear, wide, r_bear)
-
- float l_bear,
- wide,
- r_bear;
-{
- register Standard *tbl = sp_table +tableindex;
- tbl->std_left = l_bear;
- tbl->std_wide = wide;
- tbl->std_rght = r_bear;
-}
-
-/* initialize each sub_path */
-init_path(close, n)
- int close,
- n;
-{
- register Path_subpath *path;
-
- if (++count.path >= strokes[tableindex].n_subpaths)
- BYE(EXCEED_PATH);
- path = current_path = strokes[tableindex].subpaths + count.path;
- path->n_pts = n;
- path->closed = close;
- if (n > 0)
- path->pts.pt2df = (Path_point2df *)
- malloc(n * sizeof (Path_point2df));
- if (path->pts.pt2df == NULL)
- BYE(NO_MEMORY);
- expect.point = path->n_pts;
- count.point = -1; /* initialize point counter, not to
- * exceed n_pts */
-}
-
-/* accumulating points for each sub_path */
-add_point(x, y)
- float x,
- y;
-{
- register Path_subpath *path;
- register Path_point2df *pt_ptr;
-
- path = current_path;
- if (++count.point >= path->n_pts)
- BYE(EXCEED_POINT);
- pt_ptr = path->pts.pt2df + count.point;
- pt_ptr->x = x;
- pt_ptr->y = y;
-}
-
-/* Path_type + n_subpaths + n_vertices */
-#define STROKE_HEAD (sizeof (Path_type) + sizeof (int) + sizeof (int))
-
-/* write out file, close everything, free everything */
-fini()
-{
- static long zero = 0;
-
- /* pointers used to walk the arrays */
- register Path_subpath *spath;
- register Dispatch *tbl_ptr;
- register Path *strptr;
- register Property *prop_ptr;
-
- FILE *fp;
- int npath;
- register int i,
- j,
- k;
- Standard *sp_ptr;
- Path_point2df *pt;
-
- printf("\n/* GENERATED FILE -- DO NOT MODIFY */\n\n");
- printf("#include \"glutstroke.h\"\n\n");
-
-# define BY_BYE(err) fclose(fp), BYE(err)
-
- /* adjust the characters for spacing, note max char width */
- head.max_width = 0.0;
- for (i = 0, tbl_ptr = Table, strptr = strokes, sp_ptr = sp_table;
- i < head.num_ch; i++, tbl_ptr++, strptr++, sp_ptr++) {
- tbl_ptr->center += sp_ptr->std_left;
- tbl_ptr->right += sp_ptr->std_left + sp_ptr->std_rght;
- if (tbl_ptr->right > head.max_width)
- head.max_width = tbl_ptr->right;
- npath = strptr->n_subpaths;
- if (npath > 0 || tbl_ptr->center != 0.0 ||
- tbl_ptr->right != 0.0) {
- for (j = 0, spath = strptr->subpaths;
- j < npath; j++, spath++) {
- for(k=0, pt = spath->pts.pt2df;
- k<spath->n_pts; k++, pt++) {
- pt->x += sp_ptr->std_left;
- }
- }
- }
- }
-
- /* write the stroke table */
- for (i = 0, tbl_ptr = Table, strptr = strokes;
- i < head.num_ch; i++, tbl_ptr++, strptr++) {
- if (strptr->n_subpaths > 0 &&
- tbl_ptr->center != 0.0 &&
- tbl_ptr->right != 0.0) {
- if(isprint(i)) {
- printf("/* char: %d '%c' */\n\n", i, i);
- } else {
- printf("/* char: %d */\n\n", i);
- }
-
- for (j = 0, spath = strptr->subpaths;
- j < strptr->n_subpaths; j++, spath++) {
- int z;
-
- printf("static const CoordRec char%d_stroke%d[] = {\n", i, j);
- for(z = 0; z < spath->n_pts; z++) {
- printf(" { %g, %g },\n",
- spath->pts.pt2df[z].x, spath->pts.pt2df[z].y);
- }
- printf("};\n\n");
- }
-
- printf("static const StrokeRec char%d[] = {\n", i);
- for (j = 0, spath = strptr->subpaths;
- j < strptr->n_subpaths; j++, spath++) {
- printf(" { %d, char%d_stroke%d },\n",
- spath->n_pts, i, j);
- }
- printf("};\n\n");
- }
- }
- printf("static const StrokeCharRec chars[] = {\n");
- for (i = 0, tbl_ptr = Table, strptr = strokes;
- i < head.num_ch; i++, tbl_ptr++, strptr++) {
- if (strptr->n_subpaths > 0 &&
- tbl_ptr->center != 0.0 &&
- tbl_ptr->right != 0.0) {
- printf(" { %d, char%d, %g, %g },\n",
- strptr->n_subpaths, i, tbl_ptr->center, tbl_ptr->right);
- } else {
- printf(" { 0, /* char%d */ 0, %g, %g },\n",
- i, tbl_ptr->center, tbl_ptr->right);
- }
- }
- printf("};\n\n");
-
- printf("StrokeFontRec %s = { \"%s\", %d, chars, %.6g, %.6g };\n\n",
- symname, head.name, head.num_ch,
- (double) head.top, (double) head.bottom);
-
- fflush(stdout);
-
- freeall();
-# undef BY_BYE
-}
-
-freeall()
-{
- register Path *path;
- register Path_subpath *spath;
- register int i,
- j,
- n;
-
- path = strokes;
- for (i = 0; i < head.num_ch; i++, path++) {
- n = path->n_subpaths;
- if (n <= 0)
- continue;
- spath = path->subpaths;
- for (j = 0; j < n; j++, spath++)
- if (spath->pts.pt2df != NULL)
- free((char *) spath->pts.pt2df);
- if (path->subpaths != NULL)
- free((char *) path->subpaths);
- }
- free(Table);
- free(sp_table);
- free(strokes);
- if (head.properties != NULL)
- free((char *) head.properties);
-}
-
-check_nstroke()
-{
- count.path++;
- if (expect.path != count.path)
- BYE(PATH_MISMATCH);
-}
-
-check_npts()
-{
- count.point++;
- if (expect.point != count.point)
- BYE(POINT_MISMATCH);
-}
+%{
+/* $XConsortium: to_wfont.y,v 5.7 94/04/17 20:10:08 rws Exp $ */
+
+/*****************************************************************
+
+Copyright (c) 1989,1990, 1991 X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the X Consortium.
+
+Copyright (c) 1989,1990, 1991 by Sun Microsystems, Inc.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Sun Microsystems,
+and the X Consortium, not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission.
+
+SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
+SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+
+#define YYMAXDEPTH 10000
+
+#include <X11/Xos.h>
+#include <stdio.h>
+#include <ctype.h>
+#ifndef L_SET
+#define L_SET SEEK_SET
+#endif
+#include "stroke.h"
+
+#ifdef X_NOT_STDC_ENV
+FILE *fopen();
+#endif
+
+typedef struct {
+
+ float std_left, /* NCGA standard left spacing */
+ std_wide, /* character width */
+ std_rght; /* Right spacing */
+} Standard;
+
+
+char fname[80];
+char symname[80] = "FONT";
+Dispatch *Table; /* dispatch table */
+Standard *sp_table; /* NCGA font spacings */
+Path *strokes; /* strokes of each character */
+Property *property; /* property list */
+
+struct {
+ int path, point, props;
+} count, expect;
+
+Path_subpath *current_path;
+
+Font_header head; /* font header */
+int tableindex; /* which character */
+int yyerrno; /* error number */
+
+%}
+
+%union {
+ int nil; /* void is reserved */
+ int ival;
+ float dval;
+ char *cval;
+}
+
+%start font
+
+%token <dval> REAL
+%token <ival> INTEGER
+%token <cval> STRING
+
+%token <nil> BOTTOM
+%token <nil> CENTER
+%token <nil> CLOSE
+%token <nil> FONTNAME
+%token <nil> PROPERTIES
+%token <nil> NUM_CH
+%token <nil> INDEX
+%token <nil> L_SPACE
+%token <nil> MAGIC
+%token <nil> OPEN
+%token <nil> RIGHT
+%token <nil> R_SPACE
+%token <nil> STROKE
+%token <nil> TOP
+%token <nil> VERTICES
+%token <nil> BEARING
+%token <nil> WIDTH
+
+%type <cval> fontname
+%type <ival> properties
+%type <dval> top bottom center right
+%type <ival> nstroke nvertice n_pts index num_ch
+%type <ival> closeflag
+%type <ival> counter
+%type <dval> sp_left wide sp_right
+
+%%
+
+font : fontheader num_ch fontprops fontbody spacing { fini(); }|
+ fontheader fontbody { fini(); };
+
+fontheader : fontname top bottom
+ { wf_header($1, $2, $3); };
+
+fontname : FONTNAME STRING
+ { $$ = $2; };
+
+top : TOP REAL { $$ = $2;};
+
+bottom : BOTTOM REAL { $$ = $2;};
+
+num_ch: NUM_CH INTEGER { set_num_ch($2);};
+
+fontprops : /* empty */ | properties;
+
+properties : PROPERTIES INTEGER { init_properties ($2); } property_list
+ { check_num_props (); }
+
+property_list : /* empty */ | single_property property_list
+
+single_property : STRING STRING { add_property($1, $2); };
+
+fontbody : /* empty */
+ | glyph fontbody;
+
+glyph : glyph_header strokes
+ { check_nstroke(); };
+
+glyph_header : index { tableindex = $1; } sym_headinfo;
+
+sym_headinfo : nstroke center right nvertice
+ { glyph_header($1, $2, $3, $4); };
+
+index : INDEX INTEGER { check_num_ch(); $$ = $2; };
+
+nstroke : STROKE INTEGER { $$ = $2; expect.path = $2; };
+
+nvertice: {$$ = 0;} | VERTICES INTEGER { $$ = $2; } ;
+
+center : CENTER REAL{ $$ = $2; };
+
+right : RIGHT REAL{ $$ = $2; };
+
+strokes : /* empty */ | path strokes;
+
+path : closeflag n_pts { init_path($1, $2); } points
+ { check_npts(); }
+
+points : /* empty */ | coord points;
+
+closeflag : CLOSE { $$ = $1 == CLOSE; } | OPEN { $$ = $1 == CLOSE; } ;
+
+n_pts : INTEGER { $$ = $1; };
+
+coord : REAL REAL { add_point($1, $2); };
+
+spacing : /* empty */
+ | item spacing;
+
+item : counter {tableindex = $1;} sp_left wide sp_right
+ { std_space($3, $4, $5); };
+
+counter : BEARING INTEGER {$$ = $2;};
+
+sp_left: L_SPACE REAL {$$ = $2;};
+
+wide : WIDTH REAL {$$ = $2;};
+
+sp_right: R_SPACE REAL {$$ = $2;};
+
+%%
+
+#define BYE(err) yyerrno = (err), yyerror()
+
+#define ERR_BASE 1000
+#define OPEN_ERROR 1001
+#define WRITE_ERROR 1002
+#define WRONG_NAME 1003
+#define NO_MEMORY 1004
+#define EXCEED_PATH 1005
+#define EXCEED_POINT 1006
+#define PATH_MISMATCH 1007
+#define POINT_MISMATCH 1008
+#define PROP_MISMATCH 1009
+#define EXCEED_PROPS 1010
+
+char *prog;
+
+main(argc, argv)
+ int argc;
+ char *argv[];
+
+{
+ /* Usage : to_wfont [-o outfile] [infile] */
+ char *s;
+
+ fname[0] = 0;
+ tableindex = 0;
+ head.num_ch = -1;
+
+ prog = *argv;
+ while (--argc > 0 && *++argv != NULL) {
+ s = *argv;
+ if (*s++ == '-')
+ switch (*s) {
+ case 's':
+ if (*++argv != NULL)
+ {
+ --argc;
+ (void) strlcpy(symname, *argv, sizeof(symname));
+ }
+ break;
+ case 'o':
+ if (*++argv != NULL)
+ {
+ --argc;
+ (void) strlcpy(fname, *argv, sizeof(fname));
+ }
+ break;
+ default: /* ignore other options */
+ ;
+ }
+ else {
+ FILE *fp;
+
+ /* standard input redirection */
+ fp = fopen(*argv, "r");
+ if (fp != NULL) {
+ if (close(fileno(stdin)) < 0)
+ {
+ perror(prog);
+ return;
+ }
+ if (dup(fileno(fp)) < 0)
+ {
+ perror(prog);
+ return;
+ }
+ (void) fclose(fp);
+ }
+ }
+ }
+ return (yyparse());
+}
+
+/* set number of characters */
+set_num_ch(num_ch)
+int num_ch;
+{
+ yyerrno = 0;
+ head.num_ch = num_ch;
+ if (num_ch > 0) {
+ Table = (Dispatch *) malloc(num_ch * sizeof(Dispatch));
+ sp_table = (Standard *) malloc(num_ch * sizeof(Standard));
+ strokes = (Path *) malloc(num_ch * sizeof(Path));
+ }
+
+ for (tableindex = 0; tableindex < num_ch; tableindex++) {
+ Table[tableindex].center = 0.0;
+ Table[tableindex].right = 0.0;
+ Table[tableindex].offset = 0;
+
+ sp_table[tableindex].std_left = 0.0;
+ sp_table[tableindex].std_wide = 0.0;
+ sp_table[tableindex].std_rght = 0.0;
+
+ strokes[tableindex].n_subpaths = 0;
+ strokes[tableindex].n_vertices = 0;
+ strokes[tableindex].subpaths = NULL;
+ }
+}
+
+/* initialize the property info in the header */
+init_properties(num_props)
+ int num_props;
+{
+ if (num_props > 0) {
+ head.properties = (Property *)
+ malloc (num_props * sizeof (Property));
+ head.num_props = expect.props = num_props;
+ }
+ else {
+ head.properties = NULL;
+ head.num_props = expect.props = 0;
+ }
+ count.props = -1;
+ property = head.properties; /* initialize the list pointer */
+}
+
+check_num_props()
+{
+ count.props++;
+ if (count.props != expect.props)
+ BYE (PROP_MISMATCH);
+}
+
+/* add individual property info into the buffer */
+add_property(name, value)
+ char *name,
+ *value;
+{
+ /* check if the property exceeds allocated space */
+
+ if (++count.props >= head.num_props)
+ BYE(EXCEED_PROPS);
+
+ /* copy the strings into the buffer */
+
+ (void) strcpy (property->propname, name);
+ (void) strcpy (property->propvalue, value);
+
+ /* increment the property pointer */
+
+ property++;
+}
+
+check_num_ch()
+{
+
+ if (head.num_ch == -1)
+ set_num_ch(128);
+
+}
+
+yyerror()
+{
+#ifndef __bsdi__
+ extern int yylineno;
+#endif
+# define ERR_SIZE (sizeof(err_string) / sizeof(char *))
+ static char *err_string[] = {
+ "Cannot open file",
+ "Write fails",
+ "Illegal font name",
+ "Memory allocation failure",
+ "Specified number of strokes exceeded",
+ "Specified number of points exceeded",
+ "Number of strokes do not match",
+ "Number of points do not match",
+ "Number of properties do not match",
+ "Specified number of properties exceeded",
+ 0};
+ char *str;
+
+ yyerrno -= ERR_BASE;
+ if (yyerrno > 0 && yyerrno < ERR_SIZE)
+ str = err_string[yyerrno-1];
+ else
+ str = "Syntax error";
+#ifdef __bsdi__
+ fprintf(stderr, "%s.\n", str);
+#else
+ fprintf(stderr, "line %d: %s.\n", yylineno, str);
+#endif
+ freeall();
+ (void) unlink(fname);
+ exit(1);
+}
+
+/* create wfont header */
+wf_header(name, top, bottom)
+ char *name;
+ float top,
+ bottom;
+{
+
+ if (name == NULL)
+ BYE(WRONG_NAME);
+ head.top = (float) top;
+ head.bottom = (float) bottom;
+ head.magic = WFONT_MAGIC_PEX;
+ (void) strcpy(head.name, name);
+ free(name);
+}
+
+/* create header for each glyph */
+glyph_header(npath, center, right, npts)
+ int npath,
+ npts;
+ float center,
+ right;
+{
+ {
+ register Path *strk = strokes + tableindex;
+
+ if (npath > 0) /* Don't allocate space unless the character
+ has strokes associated with it. */
+ {
+ strk->subpaths = (Path_subpath *)
+ malloc(npath * sizeof (Path_subpath));
+
+ if (strk->subpaths == NULL)
+ BYE(NO_MEMORY);
+
+ strk->type = PATH_2DF;
+ strk->n_subpaths = npath;
+ strk->n_vertices = npts;
+ }
+ else { /* Just initialize the entry */
+ strk->subpaths = NULL;
+ strk->type = PATH_2DF;
+ strk->n_subpaths = 0;
+ strk->n_vertices = 0;
+ }
+ }
+ {
+ register Dispatch *tbl = Table + tableindex;
+
+ tbl->offset = 0;
+ tbl->center = center;
+ tbl->right = right;
+ }
+ count.path = -1; /* initialize path counter, not to
+ * exceed n_subpath */
+}
+
+/* create standard spacing info for each glyph */
+std_space(l_bear, wide, r_bear)
+
+ float l_bear,
+ wide,
+ r_bear;
+{
+ register Standard *tbl = sp_table +tableindex;
+ tbl->std_left = l_bear;
+ tbl->std_wide = wide;
+ tbl->std_rght = r_bear;
+}
+
+/* initialize each sub_path */
+init_path(close, n)
+ int close,
+ n;
+{
+ register Path_subpath *path;
+
+ if (++count.path >= strokes[tableindex].n_subpaths)
+ BYE(EXCEED_PATH);
+ path = current_path = strokes[tableindex].subpaths + count.path;
+ path->n_pts = n;
+ path->closed = close;
+ if (n > 0)
+ path->pts.pt2df = (Path_point2df *)
+ malloc(n * sizeof (Path_point2df));
+ if (path->pts.pt2df == NULL)
+ BYE(NO_MEMORY);
+ expect.point = path->n_pts;
+ count.point = -1; /* initialize point counter, not to
+ * exceed n_pts */
+}
+
+/* accumulating points for each sub_path */
+add_point(x, y)
+ float x,
+ y;
+{
+ register Path_subpath *path;
+ register Path_point2df *pt_ptr;
+
+ path = current_path;
+ if (++count.point >= path->n_pts)
+ BYE(EXCEED_POINT);
+ pt_ptr = path->pts.pt2df + count.point;
+ pt_ptr->x = x;
+ pt_ptr->y = y;
+}
+
+/* Path_type + n_subpaths + n_vertices */
+#define STROKE_HEAD (sizeof (Path_type) + sizeof (int) + sizeof (int))
+
+/* write out file, close everything, free everything */
+fini()
+{
+ static long zero = 0;
+
+ /* pointers used to walk the arrays */
+ register Path_subpath *spath;
+ register Dispatch *tbl_ptr;
+ register Path *strptr;
+ register Property *prop_ptr;
+
+ FILE *fp;
+ int npath;
+ register int i,
+ j,
+ k;
+ Standard *sp_ptr;
+ Path_point2df *pt;
+
+ printf("\n/* GENERATED FILE -- DO NOT MODIFY */\n\n");
+ printf("#include \"glutstroke.h\"\n\n");
+
+# define BY_BYE(err) fclose(fp), BYE(err)
+
+ /* adjust the characters for spacing, note max char width */
+ head.max_width = 0.0;
+ for (i = 0, tbl_ptr = Table, strptr = strokes, sp_ptr = sp_table;
+ i < head.num_ch; i++, tbl_ptr++, strptr++, sp_ptr++) {
+ tbl_ptr->center += sp_ptr->std_left;
+ tbl_ptr->right += sp_ptr->std_left + sp_ptr->std_rght;
+ if (tbl_ptr->right > head.max_width)
+ head.max_width = tbl_ptr->right;
+ npath = strptr->n_subpaths;
+ if (npath > 0 || tbl_ptr->center != 0.0 ||
+ tbl_ptr->right != 0.0) {
+ for (j = 0, spath = strptr->subpaths;
+ j < npath; j++, spath++) {
+ for(k=0, pt = spath->pts.pt2df;
+ k<spath->n_pts; k++, pt++) {
+ pt->x += sp_ptr->std_left;
+ }
+ }
+ }
+ }
+
+ /* write the stroke table */
+ for (i = 0, tbl_ptr = Table, strptr = strokes;
+ i < head.num_ch; i++, tbl_ptr++, strptr++) {
+ if (strptr->n_subpaths > 0 &&
+ tbl_ptr->center != 0.0 &&
+ tbl_ptr->right != 0.0) {
+ if(isprint(i)) {
+ printf("/* char: %d '%c' */\n\n", i, i);
+ } else {
+ printf("/* char: %d */\n\n", i);
+ }
+
+ for (j = 0, spath = strptr->subpaths;
+ j < strptr->n_subpaths; j++, spath++) {
+ int z;
+
+ printf("static const CoordRec char%d_stroke%d[] = {\n", i, j);
+ for(z = 0; z < spath->n_pts; z++) {
+ printf(" { %g, %g },\n",
+ spath->pts.pt2df[z].x, spath->pts.pt2df[z].y);
+ }
+ printf("};\n\n");
+ }
+
+ printf("static const StrokeRec char%d[] = {\n", i);
+ for (j = 0, spath = strptr->subpaths;
+ j < strptr->n_subpaths; j++, spath++) {
+ printf(" { %d, char%d_stroke%d },\n",
+ spath->n_pts, i, j);
+ }
+ printf("};\n\n");
+ }
+ }
+ printf("static const StrokeCharRec chars[] = {\n");
+ for (i = 0, tbl_ptr = Table, strptr = strokes;
+ i < head.num_ch; i++, tbl_ptr++, strptr++) {
+ if (strptr->n_subpaths > 0 &&
+ tbl_ptr->center != 0.0 &&
+ tbl_ptr->right != 0.0) {
+ printf(" { %d, char%d, %g, %g },\n",
+ strptr->n_subpaths, i, tbl_ptr->center, tbl_ptr->right);
+ } else {
+ printf(" { 0, /* char%d */ 0, %g, %g },\n",
+ i, tbl_ptr->center, tbl_ptr->right);
+ }
+ }
+ printf("};\n\n");
+
+ printf("StrokeFontRec %s = { \"%s\", %d, chars, %.6g, %.6g };\n\n",
+ symname, head.name, head.num_ch,
+ (double) head.top, (double) head.bottom);
+
+ fflush(stdout);
+
+ freeall();
+# undef BY_BYE
+}
+
+freeall()
+{
+ register Path *path;
+ register Path_subpath *spath;
+ register int i,
+ j,
+ n;
+
+ path = strokes;
+ for (i = 0; i < head.num_ch; i++, path++) {
+ n = path->n_subpaths;
+ if (n <= 0)
+ continue;
+ spath = path->subpaths;
+ for (j = 0; j < n; j++, spath++)
+ if (spath->pts.pt2df != NULL)
+ free((char *) spath->pts.pt2df);
+ if (path->subpaths != NULL)
+ free((char *) path->subpaths);
+ }
+ free(Table);
+ free(sp_table);
+ free(strokes);
+ if (head.properties != NULL)
+ free((char *) head.properties);
+}
+
+check_nstroke()
+{
+ count.path++;
+ if (expect.path != count.path)
+ BYE(PATH_MISMATCH);
+}
+
+check_npts()
+{
+ count.point++;
+ if (expect.point != count.point)
+ BYE(POINT_MISMATCH);
+}