Introduction
Introduction Statistics Contact Development Disclaimer Help
buffer.h - abc2ps - A powerful sheet setting tool using the simple abc notation
git clone git://vernunftzentrum.de/abc2ps.git
Log
Files
Refs
---
buffer.h (4232B)
---
1 /*
2 * This file is part of abc2ps,
3 * Copyright (C) 1996,1997,1998 Michael Methfessel
4 * See file abc2ps.c for details.
5 */
6
7 /* subroutines to handle output buffer */
8
9 /* PUTn: add to buffer with n arguments */
10
11 #define PUT0(f) {sprintf(mbf,f); a2b(mbf); }
12 #define PUT1(f,a) {sprintf(mbf,f,a); a2b(mbf); }
13 #define PUT2(f,a,b) {sprintf(mbf,f,a,b); a2b(mbf); }
14 #define PUT3(f,a,b,c) {sprintf(mbf,f,a,b,c); a2b(mbf); }
15 #define PUT4(f,a,b,c,d) {sprintf(mbf,f,a,b,c,d); a2b(mbf); }
16 #define PUT5(f,a,b,c,d,e) {sprintf(mbf,f,a,b,c,d,e); a2b(mbf); }
17
18
19 /* ----- a2b: appends string to output buffer ----- */
20 void a2b (t)
21 char *t;
22 {
23 size_t l,i;
24
25 l=strlen(t);
26 /* printf ("Append %d <%s>\n", l, t); */
27
28 if (nbuf+l>BUFFSZ) {
29 printf("+++ a2b: buffer full, BUFFSZ=%d\n", BUFFSZ);
30 exit (1);
31 }
32
33 for (i=0;i<l;i++) buf[nbuf+i]=t[i];
34 nbuf += l;
35
36 }
37
38
39 /* ----- bskip(h): translate down by h points in output buffer ---- */
40 void bskip(h)
41 float h;
42 {
43 if (h*h>0.0001) {
44 PUT1("0 %.2f T\n", -h)
45 bposy=bposy-h;
46 }
47 }
48
49 /* ----- init_pdims: initialize page dimensions ----- */
50 void init_pdims ()
51 {
52 if (in_page) return;
53 posx=cfmt.leftmargin;
54 posy=cfmt.pageheight-cfmt.topmargin;
55
56 }
57
58 /* ----- clear_buffer ------- */
59 void clear_buffer ()
60 {
61 nbuf = 0;
62 bposy = 0.0;
63 ln_num = 0;
64 }
65
66 /* ----- write_index_entry ------- */
67 void write_index_entry ()
68 {
69 char s[801];
70 float w,dx1,dx2;
71
72 if (!index_initialized) init_index_file ();
73
74 if (vb>=8) printf("Write index entry: %5d <%s>\n",
75 pagenum, info.title);
76
77 /* spacing determined here */
78 index_posy = index_posy-1.2*cfmt.indexfont.size;
79
80 if (index_posy-cfmt.indexfont.size < cfmt.botmargin) {
81 close_index_page (findex);
82 init_index_page (findex);
83 }
84
85 dx1 = 1.8*cfmt.indexfont.size;
86 dx2 = dx1+cfmt.indexfont.size;
87
88 tex_str (info.title,s,&w);
89 if (strlen(s)==0) strcpy (s, "No title");
90 fprintf (findex, "%.2f %.2f M (%d) lshow\n",
91 index_posx+dx1, index_posy, pagenum);
92
93 fprintf (findex, "%.2f %.2f M (%s) S\n",
94 index_posx+dx2, index_posy, s);
95
96 if (strlen(info.rhyth) || strlen(info.orig)) {
97 fprintf (findex, "( (");
98 if (strlen(info.rhyth)) fprintf (findex, "%s", info.rhyth);
99 if (strlen(info.rhyth) && strlen(info.orig))
100 fprintf (findex, ", ");
101 if (strlen(info.orig)) fprintf (findex, "%s", info.orig);
102 fprintf (findex, ")) S\n");
103 }
104
105
106 if (strlen(info.comp[0])) fprintf (findex, "( - %s) S\n", info.comp);
107
108 if (cfmt.withxrefs) fprintf (findex, "( [%s]) S\n", info.xref);
109
110 }
111
112
113
114
115 /* ----- write_buffer: write buffer contents, break at full pages ---- */
116 void write_buffer (fp)
117 FILE *fp;
118 {
119 int i,l,b1,b2,nb;
120 float p1,dp;
121
122 if (nbuf==0) return;
123
124 writenum++;
125
126 if ((writenum==1) && make_index) write_index_entry();
127
128 nb=0;
129 for (l=0;l<ln_num;l++) {
130 b1=0;
131 p1=0;
132 if (l>0) {
133 b1=ln_buf[l-1];
134 p1=ln_pos[l-1];
135 }
136 b2=ln_buf[l];
137 dp=ln_pos[l]-p1;
138 if ((posy+dp<cfmt.botmargin) && (!epsf)) {
139 write_pagebreak (fp);
140 }
141 for (i=b1;i<b2;i++) putc(buf[i],fp);
142 posy=posy+dp;
143 nb=ln_buf[l];
144 }
145
146 if (nb<nbuf) {
147 for (i=nb;i<nbuf;i++) putc(buf[i],fp);
148 }
149
150 clear_buffer();
151 return;
152 }
153
154 /* ----- buffer_eob: handle completed block in buffer ------- */
155 /* if the added stuff does not fit on current page, write it out
156 after page break and change buffer handling mode to pass though */
157 void buffer_eob (fp)
158 FILE *fp;
159 {
160 int do_break;
161
162 if (ln_num>=BUFFLN)
163 rx("max number off buffer lines exceeded"," -- check BUFFLN");
164
165 ln_buf[ln_num]=nbuf;
166 ln_pos[ln_num]=bposy;
167 ln_num++;
168
169 if (!use_buffer) {
170 write_buffer (fp);
171 return;
172 }
173
174 do_break=0;
175 if (posy+bposy<cfmt.botmargin) do_break=1;
176 if (cfmt.oneperpage) do_break=1;
177
178 if (do_break && (!epsf)) {
179 if (tunenum != 1 ) write_pagebreak (fp);
180 write_buffer (fp);
181 use_buffer=0;
182 }
183
184 return;
185 }
186
187 /* ----- check_buffer: dump buffer if less than nb bytes avilable --- */
188 void check_buffer (fp, nb)
189 FILE *fp;
190 int nb;
191 {
192 char mm[81];
193
194 if (nbuf+nb>BUFFSZ) {
195 sprintf (mm, "BUFFSZ exceeded at line %d", ln_num);
196 wng("possibly bad page breaks, ", mm);
197 write_buffer (fp);
198 use_buffer=0;
199 }
200 }
201
202
You are viewing proxied material from vernunftzentrum.de. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.