1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 1997 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 28 /* All Rights Reserved */ 29 30 /* EMACS_MODES: !fill, lnumb, !overwrite, !nodelete, !picture */ 31 32 #include "sys/types.h" 33 #include "sys/stat.h" 34 #include "stdio.h" 35 #include "string.h" 36 #include "errno.h" 37 #include "stdlib.h" 38 39 #include "lp.h" 40 #include "form.h" 41 42 extern struct { 43 char *v; 44 short len; 45 short infile; 46 } formheadings[]; 47 48 int _search_fheading ( char * ); 49 50 static void print_sdn(int, char *, SCALED); 51 static void print_str(int, char *, char *); 52 53 /** 54 ** wrform() 55 **/ 56 57 int 58 wrform(char *name, FORM *formp, int fd, int (*error_handler)( int , int , int ), 59 int *which_set) 60 { 61 int fld; 62 63 char * cp; 64 65 66 errno = 0; 67 for (fld = 0; fld < FO_MAX; fld++) 68 if ((!which_set || which_set[fld]) && 69 (formheadings[fld].infile || error_handler)) 70 switch (fld) { 71 72 #define HEAD formheadings[fld].v 73 74 case FO_PLEN: 75 print_sdn(fd, HEAD, formp->plen); 76 break; 77 78 case FO_PWID: 79 print_sdn(fd, HEAD, formp->pwid); 80 break; 81 82 case FO_LPI: 83 print_sdn(fd, HEAD, formp->lpi); 84 break; 85 86 case FO_CPI: 87 if (formp->cpi.val == N_COMPRESSED) 88 print_str(fd, HEAD, NAME_COMPRESSED); 89 else 90 print_sdn(fd, HEAD, formp->cpi); 91 break; 92 93 case FO_NP: 94 fdprintf(fd, "%s %d\n", HEAD, formp->np); 95 break; 96 97 case FO_CHSET: 98 fdprintf(fd, "%s %s", HEAD, formp->chset); 99 if (formp->mandatory == 1) 100 fdprintf(fd, ",%s", MANSTR); 101 fdprintf(fd, "\n"); 102 break; 103 104 case FO_RCOLOR: 105 print_str(fd, HEAD, formp->rcolor); 106 break; 107 108 case FO_CMT: 109 if ((cp = formp->comment) && *cp) { 110 fdprintf(fd, "%s\n", HEAD); 111 do { 112 char * nl = strchr(cp, '\n'); 113 114 if (nl) 115 *nl = 0; 116 if (_search_fheading(cp) < FO_MAX) 117 fdputc ('>', fd); 118 fdprintf(fd, "%s\n", cp); 119 if (nl) 120 *nl = '\n'; 121 cp = nl; 122 } while (cp++); /* NOT *cp++ */ 123 } 124 break; 125 126 case FO_ALIGN: 127 /* this must always be the last field in the file 128 it is done outside of this loop */ 129 break; 130 131 case FO_PAPER: 132 if (formp->paper) { 133 fdprintf(fd, "%s %s", HEAD, formp->paper); 134 if (formp->isDefault == 1) 135 fdprintf(fd, ",%s", DFTSTR); 136 fdprintf(fd, "\n"); 137 } 138 break; 139 140 } 141 142 if ((!which_set || which_set[FO_ALIGN]) && 143 (formheadings[FO_ALIGN].infile || error_handler)) { 144 print_str(fd, formheadings[FO_ALIGN].v, formp->conttype); 145 /* 146 * Actual alignment pattern has to be written 147 * out by caller; we leave the file pointer ready. 148 */ 149 } 150 151 if (errno != 0) 152 return (-1); 153 154 /* 155 * Write out comment to a separate file (?) 156 */ 157 if (!error_handler) { 158 159 char * path; 160 161 162 if (!(path = getformfile(name, COMMENT))) 163 return (-1); 164 165 if (formp->comment) { 166 if (dumpstring(path, formp->comment) == -1) { 167 Free (path); 168 return (-1); 169 } 170 171 } else 172 Unlink (path); 173 174 Free (path); 175 176 } 177 178 return (0); 179 } 180 181 /** 182 ** print_sdn() - PRINT SCALED DECIMAL NUMBER WITH HEADER 183 ** print_str() - PRINT STRING WITH HEADER 184 **/ 185 186 static void 187 print_sdn(int fd, char *head, SCALED sdn) 188 { 189 if (sdn.val <= 0) 190 return; 191 192 (void)fdprintf(fd, "%s ", head); 193 fdprintsdn(fd, sdn); 194 195 return; 196 } 197 198 static void 199 print_str(int fd, char *head, char *str) 200 { 201 if (!str || !*str) 202 return; 203 204 (void)fdprintf(fd, "%s %s\n", head, str); 205 206 return; 207 } 208