|
|
1.1 ! root 1: /* fax.c - facsimileTelephoneNumber attribute */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/fax.c,v 7.0 89/11/23 21:42:12 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/dsap/common/RCS/fax.c,v 7.0 89/11/23 21:42:12 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: fax.c,v $ ! 12: * Revision 7.0 89/11/23 21:42:12 mrose ! 13: * Release 6.0 ! 14: * ! 15: */ ! 16: ! 17: /* ! 18: * NOTICE ! 19: * ! 20: * Acquisition, use, and distribution of this module and related ! 21: * materials are subject to the restrictions of a license agreement. ! 22: * Consult the Preface in the User's Manual for the full terms of ! 23: * this agreement. ! 24: * ! 25: */ ! 26: ! 27: ! 28: /* ! 29: SYNTAX ! 30: fax ::= <printablestring> [ <parameters> ] ! 31: parameters ::= <parm> | <parm> $ <parameters> ! 32: <parm> ::= "twoDimensional" | "fineResolution" | "unlimitedLength" | ! 33: "b4Length" | "a3Width" | "b4Width" | "uncompressed" ! 34: ! 35: EXAMPLE ! 36: 123-4567 $ twoDimensional ! 37: */ ! 38: ! 39: /* LINTLIBRARY */ ! 40: ! 41: #include "quipu/util.h" ! 42: #include "quipu/entry.h" ! 43: ! 44: /* */ ! 45: ! 46: struct pair { ! 47: char *p_name; ! 48: int p_value; ! 49: }; ! 50: ! 51: static struct pair pairs[] = { ! 52: "twoDimensional", 8, ! 53: "fineResolution", 9, ! 54: "unlimitedLength", 20, ! 55: "b4Length", 21, ! 56: "a3Width", 22, ! 57: "b4Width", 23, ! 58: "uncompressed", 30, ! 59: ! 60: NULL ! 61: }; ! 62: ! 63: /* */ ! 64: ! 65: static fax_free (f) ! 66: register struct fax *f; ! 67: { ! 68: free (f -> number); ! 69: ! 70: if (f -> bits) ! 71: pe_free (f -> bits); ! 72: ! 73: free ((char *) f); ! 74: } ! 75: ! 76: /* */ ! 77: ! 78: static struct fax *fax_cpy (a) ! 79: register struct fax *a; ! 80: { ! 81: register struct fax *f; ! 82: ! 83: f = (struct fax *) smalloc (sizeof *f); ! 84: ! 85: f -> number = strdup (a -> number); ! 86: f -> bits = a -> bits ? pe_cpy (a -> bits) : NULLPE; ! 87: ! 88: return f; ! 89: } ! 90: ! 91: /* */ ! 92: ! 93: static int fax_cmp (a, b) ! 94: register struct fax *a; ! 95: register struct fax *b; ! 96: { ! 97: int i; ! 98: ! 99: if (a == (struct fax *) NULL) ! 100: return (b ? -1 : 0); ! 101: else ! 102: if (b == (struct fax *) NULL) ! 103: return 1; ! 104: ! 105: if (i = telcmp (a -> number, b -> number)) ! 106: return i; ! 107: ! 108: return pe_cmp (a -> bits, b -> bits); ! 109: } ! 110: ! 111: /* */ ! 112: ! 113: static fax_print (ps, f, format) ! 114: register PS ps; ! 115: register struct fax *f; ! 116: int format; ! 117: { ! 118: register int i; ! 119: register struct pair *p; ! 120: register PE pe; ! 121: ! 122: if (format == READOUT) { ! 123: ps_printf (ps, "%s", f -> number); ! 124: ! 125: if ((pe = f -> bits) && (i = pe -> pe_nbits) > 0) { ! 126: char *cp = " {"; ! 127: ! 128: while (i-- >= 0) ! 129: if (bit_test (pe, i) > OK) { ! 130: for (p = pairs; p -> p_name; p++) ! 131: if (p -> p_value == i) ! 132: break; ! 133: if (p -> p_name) ! 134: ps_printf (ps, "%s %s", cp, p -> p_name); ! 135: else ! 136: ps_printf (ps, "%s %d", cp, i); ! 137: cp = ","; ! 138: } ! 139: ! 140: if (*cp == ',') ! 141: ps_print (ps, " }"); ! 142: } ! 143: } ! 144: else { ! 145: ps_printf (ps, "%s", f -> number); ! 146: ! 147: if ((pe = f -> bits) && (i = pe -> pe_nbits) > 0) { ! 148: char *cp = " $"; ! 149: ! 150: while (i-- >= 0) ! 151: if (bit_test (pe, i) > OK) { ! 152: for (p = pairs; p -> p_name; p++) ! 153: if (p -> p_value == i) ! 154: break; ! 155: if (p -> p_name) ! 156: ps_printf (ps, "%s %s", cp, p -> p_name); ! 157: else ! 158: ps_printf (ps, "%s %d", cp, i); ! 159: cp = ""; ! 160: } ! 161: } ! 162: } ! 163: } ! 164: ! 165: /* */ ! 166: ! 167: char *TidyString (); ! 168: ! 169: static struct fax *str2fax (str) ! 170: register char *str; ! 171: { ! 172: int value; ! 173: register char *ptr, ! 174: **ap; ! 175: char *vec[NVEC + 1]; ! 176: register struct fax *f; ! 177: register struct pair *p; ! 178: ! 179: f = (struct fax *) smalloc (sizeof *f); ! 180: ! 181: if (ptr = index (str, '$')) ! 182: *ptr = NULL; ! 183: if (strlen (str) > UB_TELEPHONE_NUMBER) { ! 184: parse_error ("fax phone number too big",NULLCP); ! 185: free ((char *) f); ! 186: return ((struct fax *) NULL); ! 187: } ! 188: f -> number = TidyString (strdup (str)); ! 189: f -> bits = NULLPE; ! 190: ! 191: if (!ptr) ! 192: return f; ! 193: ! 194: *ptr++ = '$'; ! 195: ptr = strdup (ptr); ! 196: ! 197: bzero ((char *) vec, sizeof vec); ! 198: (void) str2vec (ptr, vec); ! 199: ! 200: for (ap = vec; *ap; ap++) { ! 201: if (sscanf (*ap, "%d", &value) == 1 && value >= 0) ! 202: goto got_value; ! 203: ! 204: for (p = pairs; p -> p_name; p++) ! 205: if (lexequ (p -> p_name, *ap) == 0) ! 206: break; ! 207: if (! p -> p_name) { ! 208: parse_error ("unknown G3fax non-basic parameter: '%s'", *ap); ! 209: ! 210: you_lose: ; ! 211: free (ptr); ! 212: free (f -> number); ! 213: if (f -> bits) ! 214: pe_free (f -> bits); ! 215: free ((char *) f); ! 216: ! 217: return ((struct fax *) NULL); ! 218: } ! 219: value = p -> p_value; ! 220: ! 221: got_value: ; ! 222: if ((f -> bits == NULLPE ! 223: && (f -> bits = prim2bit (pe_alloc (PE_CLASS_UNIV, ! 224: PE_FORM_PRIM, ! 225: PE_PRIM_BITS))) ! 226: == NULLPE) ! 227: || bit_on (f -> bits, value) == NOTOK) { ! 228: no_allocate: ; ! 229: parse_error ("unable to allocate G3fax non-basic parameter",NULLCP); ! 230: goto you_lose; ! 231: } ! 232: } ! 233: ! 234: if (bit2prim (f -> bits) == NULLPE) ! 235: goto no_allocate; ! 236: ! 237: free (ptr); ! 238: ! 239: return f; ! 240: } ! 241: ! 242: /* */ ! 243: ! 244: static PE fax_enc (f) ! 245: struct fax *f; ! 246: { ! 247: PE pe = NULLPE; ! 248: ! 249: (void) encode_SA_FacsimileTelephoneNumber (&pe, 0, 0, NULLCP, f); ! 250: ! 251: return pe; ! 252: } ! 253: ! 254: /* */ ! 255: ! 256: static struct fax *fax_dec (pe) ! 257: PE pe; ! 258: { ! 259: struct fax *f; ! 260: ! 261: f = (struct fax *) smalloc (sizeof *f); ! 262: ! 263: if (decode_SA_FacsimileTelephoneNumber (pe, 1, NULLIP, NULLVP, f) ! 264: == NOTOK) { ! 265: free ((char *) f); ! 266: return ((struct fax *) NULL); ! 267: } ! 268: ! 269: return f; ! 270: } ! 271: ! 272: /* */ ! 273: ! 274: fax_syntax () { ! 275: (void) add_attribute_syntax ("FacsimileTelephoneNumber", ! 276: (IFP) fax_enc, (IFP) fax_dec, ! 277: (IFP) str2fax, fax_print, ! 278: (IFP) fax_cpy, fax_cmp, ! 279: fax_free, NULLCP, ! 280: NULLIFP, TRUE); ! 281: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.