1 /* param_routines.c: Data structures for parameter lists.
2 
3 This file is part of Omega,
4 which is based on the web2c distribution of TeX,
5 
6 Copyright (c) 1994--2001 John Plaice and Yannis Haralambous
7 
8 Omega is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12 
13 Omega is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with Omega; if not, write to the Free Software Foundation, Inc.,
20 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
21 
22 */
23 
24 #include "cpascal.h"
25 #include "list_routines.h"
26 #include "manifests.h"
27 #include "header_routines.h"
28 #include "param_routines.h"
29 #include "print_routines.h"
30 #include "out_routines.h"
31 #include "error_routines.h"
32 #include "out_ofm.h"
33 
34 #define PARAM_MIN 1
35 
36 av_list param_list = NULL;
37 int param_max = PARAM_MIN-1;
38 int param_started = FALSE;
39 
40 unsigned np=0;
41 
42 void
init_parameters(void)43 init_parameters(void)
44 {
45     if (param_started==TRUE)
46     warning_0("FONTDIMEN previously defined;  all old parameters ignored");
47     if (param_list!=NULL) {
48         av_list L1 = param_list, L2;
49         while (L1 != NULL) {
50 	    L2 = L1->ptr;
51 	    free(L1);
52 	    L1 = L2;
53         }
54     }
55     param_list = NULL;
56     param_max = PARAM_MIN-1;
57     np=param_max;
58     param_started = TRUE;
59 }
60 
61 void
set_param_word(int index,int val)62 set_param_word(int index, int val)
63 {
64     av_list L1, L2;
65 
66     if (index < PARAM_MIN) {
67         warning_0("PARAMETER index must be at least 1; ignored");
68         return;
69     }
70     L1 = param_list;
71     if (L1 == NULL) {
72         param_list = av_list1(index, val);
73         param_max = index;
74         np=param_max;
75     } else {
76         L2 = L1->ptr;
77         while ((L2 != NULL) && (lattr(L2) <= index)) {
78             L1 = L2;
79             L2 = L2->ptr;
80         }
81         if (index < lattr(L1)) {
82             param_list = av_list1(index, val);
83             param_list->ptr = L1;
84 	} else if (index == lattr(L1)) {
85         warning_1("PARAMETER index (%d) previously defined; "
86                   "old value ignored", index);
87             lval(L1)  = val;
88         } else {
89             if (L2==NULL) {param_max=index; np=param_max;}
90             L2 = av_list1(index, val);
91             L2->ptr = L1->ptr;
92             L1->ptr = L2;
93         }
94     }
95 }
96 
97 void
retrieve_parameters(unsigned char * table)98 retrieve_parameters(unsigned char *table)
99 {
100     int value;
101     unsigned i;
102     unsigned np_prime = np;
103 
104     param_list = NULL;
105     for (i=1; i<=np_prime; i++) {
106         value = ((table[4*i] & 0xff) << 24) |
107                 ((table[4*i+1] & 0xff) << 16) |
108                 ((table[4*i+2] & 0xff) << 8) |
109                 (table[4*i+3] & 0xff);
110         if ((i<=7) | (value != 0)) {
111            set_param_word(i, value);
112         }
113     }
114     np = np_prime;
115 }
116 
117 void
print_parameters(void)118 print_parameters(void)
119 {
120     av_list L = param_list;
121 
122     if (L == NULL)
123         return;
124 
125     print_font_dimension();
126     while (L != NULL) {
127 	print_parameter(lattr(L), lval(L));
128 	L = L->ptr;
129     }
130     right();
131 }
132 
133 static void
output_ofm_one_parameter(unsigned i,fix param)134 output_ofm_one_parameter(unsigned i, fix param)
135 {
136     if (i==P_SLANT) out_ofm_4(param);
137     else out_ofm_scaled(param);
138 }
139 
140 void
output_ofm_parameter(void)141 output_ofm_parameter(void)
142 {
143     unsigned i=1, j;
144 
145     av_list L = param_list;
146 
147     while(L != NULL) {
148        j=lattr(L);
149        while (i<j) {
150            output_ofm_one_parameter(i, 0);
151            i++;
152        }
153        output_ofm_one_parameter(i, lval(L));
154        L = L->ptr; i++;
155     }
156 }
157