Introduction
Introduction Statistics Contact Development Disclaimer Help
util.h - abc2ps - A powerful sheet setting tool using the simple abc notation
git clone git://vernunftzentrum.de/abc2ps.git
Log
Files
Refs
---
util.h (10221B)
---
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 /* low-level utilities */
8
9
10 /* ----- error warning ----- */
11 void wng (msg, str)
12 char msg[],str[];
13 {
14 printf ("+++ %s%s\n", msg, str);
15 }
16
17 /* ----- error exit ----- */
18 void rx (msg, str)
19 char msg[],str[];
20 {
21 printf ("\n+++ %s%s\n", msg, str);
22 exit (1);
23 }
24
25 void rx1 (msg, c)
26 char msg[];
27 char c;
28 {
29 printf ("\n+++ %s%c\n", msg, c);
30 exit (1);
31 }
32
33 void rxi (msg, i)
34 char msg[];
35 int i;
36 {
37 printf ("\n+++ %s%d\n", msg, i);
38 exit (1);
39 }
40
41 /* ----- bug: print message for internal error and maybe stop ----- */
42 void bug (msg,fatal)
43 char msg[];
44 int fatal;
45 {
46 printf ("\n\nThis cannot happen!");
47 if (strlen(msg)>0) printf ("\nInternal error: %s.\n", msg);
48 if (fatal) {
49 printf ("Emergency stop.\n\n");
50 exit (1);
51 }
52 else {
53 printf ("Trying to continue...\n\n");
54 }
55 }
56
57 /* ----- ranf(x1,x2): return random float between x1 and x2 --- */
58 float ranf(x1,x2)
59 float x1,x2;
60 {
61 static int m=259200; /* generator constants */
62 static int a=421;
63 static int c=54773;
64 static int j=1; /* seed */
65 float r;
66
67 j=(j*a+c)%m;
68 r=x1+(x2-x1)*(double)j/(double)m;
69 return r;
70 }
71
72
73 /* ----- getline ----- */
74 /*
75 * Added by jc:
76 * This routine reads a line from fp into buf, and trims away any
77 * trailing whitespace. We are paranoid about whether isspace(c)
78 * returns true for CR, so this routine should work even if the input
79 * came from a DOS system.
80 */
81 char * abc2ps_getline(buf,len,fp)
82 char* buf;
83 int len;
84 FILE* fp;
85 { char* rp;
86 int c, l;
87 if (rp = fgets(buf,len,fp)) {
88 l = strlen(buf);
89 while ((l > 0) && ((c = buf[l-1]) && isspace(c) || (c ==…
90 buf[--l] = 0;
91 }
92 return rp;
93 }
94
95
96 /* ----- strip: remove leading and trailing blanks ----- */
97 void strip (str1,str)
98 char str[],str1[];
99 {
100 int l,i,i1,i2;
101 l=strlen(str);
102
103 i1=0;
104 for (i=0; i<l; i++)
105 if ((str[i]!=' ') && (str[i]!='\n')) { i1=i; break; }
106 i2=0;
107 for (i=l-1; i>=0; i--)
108 if ((str[i]!=' ') && (str[i]!='\n')) { i2=i+1; break; }
109 for (i=i1;i<i2;i++) str1[i-i1]=str[i];
110 str1[i2-i1]=0;
111 /* printf (" l=%d i1=%d i2=%d <%s> <%s>\n", l, i1, i2, str, str1);*/
112 }
113
114
115 /* ----- nwords: count words in string ----- */
116 int nwords (str)
117 char *str;
118 {
119 int w,k;
120 char *c;
121 c=str;
122 w=0;
123 for(k=0;k<=50;k++) {
124 while (*c==' ') c++;
125 if (*c=='\0') break;
126 w++;
127 while ((*c!=' ') && (*c!='\0')) c++;
128 if (*c=='\0') break;
129 }
130 return w;
131 }
132
133
134
135 /* ----- getword: return n-th word from string ---- */
136 int getword (iw,str,str1)
137 int iw;
138 char *str,*str1;
139 {
140 int w,k;
141 char *c,*cc;
142 if (iw<0) { *str1='\0'; return 0;}
143 c=str;
144 w=0;
145 for(k=0;k<=50;k++) {
146 while (*c==' ') c++;
147 if (*c=='\0') break;
148 if (w==iw) {
149 cc=str1;
150 while ((*c!=' ')&&(*c!='\0')) { *cc=*c; c++; cc++; }
151 *cc='\0';
152 return 1;
153 }
154 w++;
155 while ((*c!=' ') && (*c!='\0')) c++;
156 if (*c=='\0') break;
157 }
158 *str1='\0';
159 return 0;
160 }
161
162
163 /* ----- abbrev: check for valid abbreviation ----- */
164 int abbrev (str,ab,nchar)
165 char str[],ab[];
166 int nchar;
167 {
168 int i,nc;
169 if (strlen(str) > strlen(ab)) return 0;
170 nc=strlen(str);
171 if (nc<nchar) nc=nchar;
172 for (i=0;i<nc;i++) if (str[i] != ab[i]) return 0;
173 return 1;
174 }
175
176 /* ----- isdig: checks char for digit ----- */
177 int isdig (c)
178 char c;
179 {
180 if (c == '\0') return 0;
181 if (strchr("0123456789",c)) return 1;
182 return 0;
183 }
184
185 /* ----- strext: set extension on a file identifier ----- */
186 /* force=1 forces change even if fid already has an extension */
187 /* force=0 does not change the extension if there already is one */
188 void strext (fid1, fid, ext, force)
189 char fid[],ext[],fid1[];
190 int force;
191 {
192 int i,l;
193 char *p,*q;
194
195 strcpy (fid1, fid);
196 l=strlen(fid1);
197 p=fid1;
198 for (i=0;i<l;i++)
199 if (fid1[i]=='/') p=fid1+i;
200
201 if (!force) {
202 q=strchr(p,'.');
203 if (q && (q!=fid1+strlen(fid1)-1)) return;
204 }
205 if (!strchr(p,'.')) strcat (fid1,".");
206 q=strchr(p,'.');
207 if (strlen(ext)>0) q++;
208 *q = 0;
209 strcat(fid1,ext);
210
211 }
212
213 /* ----- cutext: cut off extension on a file identifier ----- */
214 void cutext (fid)
215 char fid[];
216 {
217 int i,l;
218
219 l=strlen(fid);
220 for (i=0;i<l;i++)
221 if (fid[i]=='.') fid[i]='\0';
222 }
223
224 /* ----- getext: get extension on a file identifier ----- */
225 void getext (fid,ext)
226 char fid[],ext[];
227 {
228 int i,l,k;
229
230 l=strlen(fid);
231 k=l-1;
232 for (i=0;i<l;i++)
233 if (fid[i]=='.') k=i;
234
235 for (i=k+1;i<l;i++)
236 ext[i-k-1]=fid[i];
237 ext[l-k-1]='\0';
238
239 }
240
241
242 /* ----- sscanu ----- */
243 float scan_u(str)
244 char str[];
245 {
246 char unit[81];
247 float a,b;
248
249 strcpy(unit,"pt");
250 sscanf(str,"%f%s", &a, unit);
251
252 if (!strcmp(unit,"cm")) b=a*CM;
253 else if (!strcmp(unit,"in")) b=a*IN;
254 else if (!strcmp(unit,"pt")) b=a*PT;
255 else {
256 printf ("+++ Unknown unit \"%s\" in: %s\n",unit,str);
257 exit (3);
258 }
259 return b;
260 }
261
262
263 /* ----- match ------- */
264 int match (str, pat)
265 char str[], pat[];
266 {
267 char *p,*s;
268 p=pat;
269 s=str;
270
271 if (strlen(pat)==0) return 1;
272
273 while (*p != 0) {
274
275 if (*p == '*') { /* found wildcard '*' in pattern */
276 p++;
277 while (*p == '*') p++;
278 if (*p == 0) return 1; /* trailing '*' matches all */
279 for (;;) { /* find match to char after '*' */
280 if (*s == 0) return 0;
281 if ((*s == *p) || (*p == '+'))
282 if (match(s+1,p+1)) return 1; /* ok if rest matches */
283 s++;
284 }
285 }
286
287 else { /* no wildcard -- char must match */
288 if (*s == 0) return 0;
289 if ((*p != *s) && (*p != '+')) return 0;
290 s++;
291 }
292 p++;
293 }
294
295 if (*s != 0) return 0; /* pattern but not string exhausted */
296 return 1;
297 }
298
299 /* ----- str_isblank: check for blank string ---- */
300 int str_isblank (str)
301 char str[];
302 {
303 int i;
304 for (i=0;i<strlen(str);i++) if (str[i] != ' ') return 0;
305 return 1;
306 }
307
308 /* ----- cap_str: capitalize a string ----- */
309 void cap_str(str)
310 char str[];
311 {
312 char *c;
313 c=str;
314 while (*c!='\0') {
315 if (*c=='a') *c='A';
316 else if (*c=='b') *c='B';
317 else if (*c=='c') *c='C';
318 else if (*c=='d') *c='D';
319 else if (*c=='e') *c='E';
320 else if (*c=='f') *c='F';
321 else if (*c=='g') *c='G';
322 else if (*c=='h') *c='H';
323 else if (*c=='i') *c='I';
324 else if (*c=='j') *c='J';
325 else if (*c=='k') *c='K';
326 else if (*c=='l') *c='L';
327 else if (*c=='m') *c='M';
328 else if (*c=='n') *c='N';
329 else if (*c=='o') *c='O';
330 else if (*c=='p') *c='P';
331 else if (*c=='q') *c='Q';
332 else if (*c=='r') *c='R';
333 else if (*c=='s') *c='S';
334 else if (*c=='t') *c='T';
335 else if (*c=='u') *c='U';
336 else if (*c=='v') *c='V';
337 else if (*c=='w') *c='W';
338 else if (*c=='x') *c='X';
339 else if (*c=='y') *c='Y';
340 else if (*c=='z') *c='Z';
341 c++;
342 }
343 }
344
345
346 /* ----- cwid ----- */
347 /* These are char widths for Times-Roman */
348 float cwid(c)
349 char c;
350 {
351 float w;
352 if (c=='a') w=44.4;
353 else if (c=='b') w=50.0;
354 else if (c=='c') w=44.4;
355 else if (c=='d') w=50.0;
356 else if (c=='e') w=44.4;
357 else if (c=='f') w=33.3;
358 else if (c=='g') w=50.0;
359 else if (c=='h') w=50.0;
360 else if (c=='i') w=27.8;
361 else if (c=='j') w=27.8;
362 else if (c=='k') w=50.0;
363 else if (c=='l') w=27.8;
364 else if (c=='m') w=77.8;
365 else if (c=='n') w=50.0;
366 else if (c=='o') w=50.0;
367 else if (c=='p') w=50.0;
368 else if (c=='q') w=50.0;
369 else if (c=='r') w=33.3;
370 else if (c=='s') w=38.9;
371 else if (c=='t') w=27.8;
372 else if (c=='u') w=50.0;
373 else if (c=='v') w=50.0;
374 else if (c=='w') w=72.2;
375 else if (c=='x') w=50.0;
376 else if (c=='y') w=50.0;
377 else if (c=='z') w=44.4;
378
379 else if (c=='A') w=72.2;
380 else if (c=='B') w=66.7;
381 else if (c=='C') w=66.7;
382 else if (c=='D') w=72.2;
383 else if (c=='E') w=61.1;
384 else if (c=='F') w=55.6;
385 else if (c=='G') w=72.2;
386 else if (c=='H') w=72.2;
387 else if (c=='I') w=33.3;
388 else if (c=='J') w=38.9;
389 else if (c=='K') w=72.2;
390 else if (c=='L') w=61.1;
391 else if (c=='M') w=88.9;
392 else if (c=='N') w=72.2;
393 else if (c=='O') w=72.2;
394 else if (c=='P') w=55.6;
395 else if (c=='Q') w=72.2;
396 else if (c=='R') w=66.7;
397 else if (c=='S') w=55.6;
398 else if (c=='T') w=61.1;
399 else if (c=='U') w=72.2;
400 else if (c=='V') w=72.2;
401 else if (c=='W') w=94.4;
402 else if (c=='X') w=72.2;
403 else if (c=='Y') w=72.2;
404 else if (c=='Z') w=61.1;
405
406 else if (c=='0') w=50.0;
407 else if (c=='1') w=50.0;
408 else if (c=='2') w=50.0;
409 else if (c=='3') w=50.0;
410 else if (c=='4') w=50.0;
411 else if (c=='5') w=50.0;
412 else if (c=='6') w=50.0;
413 else if (c=='7') w=50.0;
414 else if (c=='8') w=50.0;
415 else if (c=='9') w=50.0;
416
417 else if (c=='~') w=54.1;
418 else if (c=='!') w=33.3;
419 else if (c=='@') w=92.1;
420 else if (c=='#') w=50.0;
421 else if (c=='$') w=50.0;
422 else if (c=='%') w=83.3;
423 else if (c=='^') w=46.9;
424 else if (c=='&') w=77.8;
425 else if (c=='*') w=50.0;
426 else if (c=='(') w=33.3;
427 else if (c==')') w=33.3;
428 /*| else if (c=='-') w=33.3; |*/
429 else if (c=='-') w=40.0;
430 else if (c=='_') w=50.0;
431 else if (c=='+') w=56.4;
432 else if (c=='=') w=55.0;
433 else if (c=='[') w=33.3;
434 else if (c==']') w=33.3;
435 else if (c=='{') w=48.0;
436 else if (c=='}') w=48.0;
437 else if (c=='|') w=20.0;
438 else if (c==':') w=27.8;
439 else if (c==';') w=27.8;
440 else if (c=='.') w=27.8;
441 else if (c==',') w=27.8;
442 else if (c=='\\') w=27.8;
443 else if (c=='\'') w=33.3;
444 else if (c=='\"') w=40.8;
445 else if (c=='<') w=56.4;
446 else if (c=='>') w=56.4;
447 else if (c=='?') w=44.4;
448 else if (c=='/') w=27.8;
449 else if (c=='`') w=33.3;
450 else if (c==' ') w=25.0;
451 else w=50.0;
452 return w/100.0;
453 }
454
455
456 /* ----- get_file_size ------- */
457 /* version using standard function stat */
458 #include <sys/stat.h>
459 int get_file_size (fname)
460 char fname[];
461 {
462 int m,rc;
463 struct stat statbuf;
464 rc = stat(fname,&statbuf);
465 if (rc == -1) {
466 printf ("Unsuccessful call to stat for file %s\n", fname);
467 return -1;
468 }
469 m=statbuf.st_size;
470 return m;
471 }
472
473 /* version which counts bytes by hand */
474 int get_file_size1 (fname)
475 char fname[];
476 {
477 int m,i;
478 FILE *fp;
479
480 if ((fp = fopen (fname,"r")) == NULL) {
481 printf ("Cannot open file to determine size: %s", fname);
482 return -1;
483 }
484
485 m=0;
486 i=getc(fp);
487 while (i != EOF) {
488 m++;
489 i=getc(fp);
490 }
491 fclose (fp);
492 return m;
493 }
494
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.