Annotation of mandoc/out.c, Revision 1.5
1.5 ! kristaps 1: /* $Id: out.c,v 1.4 2009/10/09 06:54:11 kristaps Exp $ */
1.1 kristaps 2: /*
3: * Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
8: *
9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16: */
17: #include <sys/types.h>
18:
19: #include <ctype.h>
1.3 kristaps 20: #include <stdio.h>
1.1 kristaps 21: #include <stdlib.h>
22:
23: #include "out.h"
24:
1.3 kristaps 25:
26: /*
27: * Convert a `scaling unit' to a consistent form, or fail. Scaling
1.5 ! kristaps 28: * units are documented in groff.7, mdoc.7, man.7.
1.3 kristaps 29: */
1.1 kristaps 30: int
1.5 ! kristaps 31: a2roffsu(const char *src, struct roffsu *dst, enum roffscale def)
1.1 kristaps 32: {
1.4 kristaps 33: char buf[BUFSIZ], hasd;
1.1 kristaps 34: int i;
1.3 kristaps 35: enum roffscale unit;
1.1 kristaps 36:
1.5 ! kristaps 37: if ('\0' == *src)
! 38: return(0);
! 39:
1.4 kristaps 40: i = hasd = 0;
41:
42: switch (*src) {
43: case ('+'):
44: src++;
45: break;
46: case ('-'):
47: buf[i++] = *src++;
48: break;
49: default:
50: break;
51: }
52:
1.5 ! kristaps 53: if ('\0' == *src)
! 54: return(0);
! 55:
1.4 kristaps 56: while (i < BUFSIZ) {
57: if ( ! isdigit((u_char)*src)) {
58: if ('.' != *src)
59: break;
60: else if (hasd)
61: break;
62: else
63: hasd = 1;
64: }
65: buf[i++] = *src++;
66: }
1.1 kristaps 67:
1.3 kristaps 68: if (BUFSIZ == i || (*src && *(src + 1)))
1.1 kristaps 69: return(0);
70:
1.4 kristaps 71: buf[i] = '\0';
1.1 kristaps 72:
1.3 kristaps 73: switch (*src) {
74: case ('c'):
75: unit = SCALE_CM;
76: break;
77: case ('i'):
78: unit = SCALE_IN;
79: break;
80: case ('P'):
81: unit = SCALE_PC;
82: break;
83: case ('p'):
84: unit = SCALE_PT;
85: break;
86: case ('f'):
87: unit = SCALE_FS;
88: break;
89: case ('v'):
90: unit = SCALE_VS;
91: break;
92: case ('m'):
93: unit = SCALE_EM;
94: break;
95: case ('\0'):
1.5 ! kristaps 96: if (SCALE_MAX == def)
! 97: return(0);
! 98: unit = SCALE_BU;
! 99: break;
1.3 kristaps 100: case ('u'):
101: unit = SCALE_BU;
102: break;
103: case ('M'):
104: unit = SCALE_MM;
105: break;
106: case ('n'):
107: unit = SCALE_EN;
108: break;
109: default:
1.1 kristaps 110: return(0);
1.3 kristaps 111: }
1.1 kristaps 112:
1.4 kristaps 113: if ((dst->scale = atof(buf)) < 0)
1.3 kristaps 114: dst->scale = 0;
115: dst->unit = unit;
1.4 kristaps 116: dst->pt = hasd;
117:
1.3 kristaps 118: return(1);
1.1 kristaps 119: }
CVSweb