|
|
1.1 ! root 1: /* str2ps.c - string-backed abstraction for PStreams */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/psap/RCS/str2ps.c,v 7.0 89/11/23 22:13:48 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/psap/RCS/str2ps.c,v 7.0 89/11/23 22:13:48 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: str2ps.c,v $ ! 12: * Revision 7.0 89/11/23 22:13:48 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: /* LINTLIBRARY */ ! 29: ! 30: #include <stdio.h> ! 31: #include "psap.h" ! 32: ! 33: /* */ ! 34: ! 35: /* ARGSUSED */ ! 36: ! 37: static int str_read (ps, data, n, in_line) ! 38: register PS ps; ! 39: PElementData data; ! 40: PElementLen n; ! 41: int in_line; ! 42: { ! 43: register int cc; ! 44: ! 45: if (ps -> ps_base == NULLCP || (cc = ps -> ps_cnt) <= 0) ! 46: return 0; ! 47: if (cc > n) ! 48: cc = n; ! 49: ! 50: bcopy (ps -> ps_ptr, (char *) data, cc); ! 51: ps -> ps_ptr += cc, ps -> ps_cnt -= cc; ! 52: ! 53: return cc; ! 54: } ! 55: ! 56: ! 57: /* ARGSUSED */ ! 58: ! 59: static int str_write (ps, data, n, in_line) ! 60: register PS ps; ! 61: PElementData data; ! 62: PElementLen n; ! 63: int in_line; ! 64: { ! 65: register int cc; ! 66: register char *cp; ! 67: ! 68: if (ps -> ps_base == NULLCP) { ! 69: if ((cp = malloc ((unsigned) (cc = n + BUFSIZ))) == NULLCP) ! 70: return ps_seterr (ps, PS_ERR_NMEM, NOTOK); ! 71: ps -> ps_base = ps -> ps_ptr = cp; ! 72: ps -> ps_bufsiz = ps -> ps_cnt = cc; ! 73: } ! 74: else ! 75: if (ps -> ps_cnt < n) { ! 76: register int curlen = ps -> ps_ptr - ps -> ps_base; ! 77: ! 78: if (ps -> ps_inline) ! 79: return 0; ! 80: if ((cp = realloc (ps -> ps_base, ! 81: (unsigned) (ps -> ps_bufsiz ! 82: + (cc = n + BUFSIZ)))) ! 83: == NULLCP) ! 84: return ps_seterr (ps, PS_ERR_NMEM, NOTOK); ! 85: ps -> ps_ptr = (ps -> ps_base = cp) + curlen; ! 86: ps -> ps_bufsiz += cc, ps -> ps_cnt += cc; ! 87: } ! 88: ! 89: bcopy ((char *) data, ps -> ps_ptr, n); ! 90: ps -> ps_ptr += n, ps -> ps_cnt -= n; ! 91: ! 92: return n; ! 93: } ! 94: ! 95: ! 96: static int str_close (ps) ! 97: register PS ps; ! 98: { ! 99: if (ps -> ps_base && !ps -> ps_inline) ! 100: free (ps -> ps_base); ! 101: ! 102: return OK; ! 103: } ! 104: ! 105: /* */ ! 106: ! 107: int str_open (ps) ! 108: register PS ps; ! 109: { ! 110: ps -> ps_readP = str_read; ! 111: ps -> ps_writeP = str_write; ! 112: ps -> ps_closeP = str_close; ! 113: ! 114: return OK; ! 115: } ! 116: ! 117: ! 118: int str_setup (ps, cp, cc, in_line) ! 119: register PS ps; ! 120: register char *cp; ! 121: register int cc; ! 122: int in_line; ! 123: { ! 124: register char *dp; ! 125: ! 126: if (in_line) { ! 127: ps -> ps_inline = 1; ! 128: ps -> ps_base = ps -> ps_ptr = cp; ! 129: ps -> ps_bufsiz = ps -> ps_cnt = cc; ! 130: } ! 131: else ! 132: if (cc > 0) { ! 133: if ((dp = malloc ((unsigned) (cc))) == NULLCP) ! 134: return ps_seterr (ps, PS_ERR_NMEM, NOTOK); ! 135: ps -> ps_base = ps -> ps_ptr = dp; ! 136: if (cp != NULLCP) ! 137: bcopy (cp, dp, cc); ! 138: ps -> ps_bufsiz = ps -> ps_cnt = cc; ! 139: } ! 140: ! 141: return OK; ! 142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.