1 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
2 /*	  All Rights Reserved  	*/
3 
4 
5 /*
6  * Copyright (c) 1980 Regents of the University of California.
7  * All rights reserved. The Berkeley software License Agreement
8  * specifies the terms and conditions for redistribution.
9  */
10 
11 /*
12  * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
13  * All Rights Reserved.
14  */
15 
16 /*	from OpenSolaris "matrix.c	1.3	05/06/02 SMI"	 SVr4.0 1.1		*/
17 
18 /*
19  * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
20  *
21  * Sccsid @(#)matrix.c	1.4 (gritter) 10/29/05
22  */
23 
24 /*
25  * Changes Copyright (c) 2014 Carsten Kunze (carsten.kunze at arcor.de)
26  */
27 
28 #include "e.h"
29 #include "y.tab.h"
30 
31 extern YYSTYPE yyval;
32 
33 void
column(int type,int p1)34 column(int type, int p1) {
35 	int i;
36 
37 	lp[p1] = ct - p1 - 1;
38 	if( dbg ){
39 		printf(".\t%d column of", type);
40 		for( i=p1+1; i<ct; i++ )
41 			printf(" S%d", lp[i]);
42 		printf(", rows=%d\n",lp[p1]);
43 	}
44 	lp[ct++] = type;
45 }
46 
47 void
matrix(int p1)48 matrix(int p1) {
49 #ifndef	NEQN
50 	float hb, b;
51 #else	/* NEQN */
52 	int hb, b;
53 #endif	/* NEQN */
54 	int nrow, ncol, i, j, k, val[100];
55 	char *space;
56 
57 	space = "\\ \\ ";
58 	nrow = lp[p1];	/* disaster if rows inconsistent */
59 	ncol = 0;
60 	for( i=p1; i<ct; i += lp[i]+2 ){
61 		ncol++;
62 		if(dbg)printf(".\tcolct=%d\n",lp[i]);
63 	}
64 	for( k=1; k<=nrow; k++ ) {
65 		hb = b = 0;
66 		j = p1 + k;
67 		for( i=0; i<ncol; i++ ) {
68 			hb = max(hb, eht[lp[j]]-ebase[lp[j]]);
69 			b = max(b, ebase[lp[j]]);
70 			j += nrow + 2;
71 		}
72 #ifndef	NEQN
73 		if(dbg)printf(".\trow %d: b=%g, hb=%g\n", k, b, hb);
74 #else	/* NEQN */
75 		if(dbg)printf(".\trow %d: b=%d, hb=%d\n", k, b, hb);
76 #endif	/* NEQN */
77 		j = p1 + k;
78 		for( i=0; i<ncol; i++ ) {
79 			ebase[lp[j]] = b;
80 			eht[lp[j]] = b + hb;
81 			j += nrow + 2;
82 		}
83 	}
84 	j = p1;
85 	for( i=0; i<ncol; i++ ) {
86 		lpile(lp[j+lp[j]+1], j+1, j+lp[j]+1);
87 		val[i] = yyval.token;
88 		j += nrow + 2;
89 	}
90 	yyval.token = oalloc();
91 	eht[yyval.token] = eht[val[0]];
92 	ebase[yyval.token] = ebase[val[0]];
93 	lfont[yyval.token] = rfont[yyval.token] = 0;
94 #ifndef	NEQN
95 	if(dbg)printf(".\tmatrix S%d: r=%d, c=%d, h=%g, b=%g\n",
96 		yyval.token,nrow,ncol,eht[yyval.token],ebase[yyval.token]);
97 #else	/* NEQN */
98 	if(dbg)printf(".\tmatrix S%d: r=%d, c=%d, h=%d, b=%d\n",
99 		yyval.token,nrow,ncol,eht[yyval.token],ebase[yyval.token]);
100 #endif	/* NEQN */
101 	printf(".ds %d \"", yyval.token);
102 	for( i=0; i<ncol; i++ )  {
103 		printf("\\*(%d%s", val[i], i==ncol-1 ? "" : space);
104 		ofree(val[i]);
105 	}
106 	printf("\n");
107 	ct = p1;
108 }
109