1: /*
   2:  * This file implements functions used by both client and servers in the
   3:  * XNS courier library
   4:  */
   5: 
   6: /*
   7:  $Log:	misc.c,v $
   8:  * Revision 2.0  85/11/21  07:22:12  jqj
   9:  * 4.3BSD standard release
  10:  *
  11:  * Revision 1.2  85/10/21  12:55:26  root
  12:  * Gould version:  added MoveLong routine.
  13:  *
  14:  * Revision 1.4  85/03/26  06:08:42  jqj
  15:  * Revised public alpha-test version, released 26 March 1985
  16:  *
  17:  * Revision 1.3  85/03/11  16:37:08  jqj
  18:  * Public alpha-test version, released 11 March 1985
  19:  *
  20:  * Revision 1.2  85/01/27  07:37:27  jqj
  21:  * finished but undebugged version
  22:  *
  23:  */
  24: 
  25: #ifndef lint
  26: static char rcsid[] = "$Header: misc.c,v 2.0 85/11/21 07:22:12 jqj Exp $";
  27: #endif
  28: 
  29: #include <stdio.h>
  30: #include "courier.h"
  31: 
  32: 
  33: Unspecified *
  34: Allocate(n)
  35:     LongInteger n;
  36: {
  37:     Unspecified *p;
  38:     extern char *malloc();
  39: 
  40:     if (n > 100000 || n < 0) {
  41:         fprintf(stderr,
  42:             "Ridiculous request to memory allocator (%d words).\n",
  43:             n);
  44:         exit(1);
  45:         /* NOTREACHED */
  46:     }
  47:     if (n == 0)
  48:         return (0);
  49:     p = (Unspecified *) malloc((unsigned) n*sizeof(Unspecified));
  50:     if (p == 0) {
  51:         fprintf(stderr, "Out of memory.\n");
  52:         exit(1);
  53:     }
  54:     return (p);
  55: }
  56: 
  57: Deallocate(p)
  58:     Unspecified *p;
  59: {
  60:     if (p != 0)
  61:         free((char *) p);
  62: }
  63: 
  64: 
  65: /*
  66:  * Unfortunately, Courier strings are 8 bits and frequently contain
  67:  * NULs ('\000').  Hence we use an encoding scheme in which '\0200'
  68:  * is used as a substitute for '\000'.
  69:  * Note that 0200 is not routinely used in Xerox character encodings.
  70:  * If it does happen to appear in an incoming Courier string, it will
  71:  * be confusing!  More importantly, there is no way to generate a
  72:  * Courier string containing a '\200'.
  73:  */
  74: 
  75: 
  76: int
  77: sizeof_String(p)
  78: /* the size in 16-bit words of the serialized data structure */
  79:     String *p;
  80: {
  81:     return ((strlen(*p)+3)/2);
  82: }
  83: 
  84: clear_String(p)
  85:     String *p;
  86: {
  87:     Deallocate((Unspecified*) *p);
  88:     *p = (String) 0;
  89:     return;
  90: }
  91: 
  92: int
  93: externalize_String(p, buf)
  94: /* convert to counted-sequence format, translating \0200 to \000 */
  95:     String *p;
  96:     Unspecified *buf;
  97: {
  98:     Cardinal len;
  99:     register int n;
 100:     register int ch;
 101:     register String from, to;
 102: 
 103:     if (*p == (String) 0) n = 0;
 104:     else {
 105:         n = strlen(*p);
 106:         if (n > 65535) n = 0;
 107:     }
 108:     len = n;
 109:     buf += externalize_Cardinal(&len, buf);
 110:     to = (String) buf;
 111:     from = *p;
 112:     while (--n >= 0) {
 113:         if ((ch = *from++) == '\0200') *to++ = '\000';
 114:         else *to++ = ch;
 115:     }
 116:     return ((len+3)/2);
 117: }
 118: 
 119: int
 120: internalize_String(p, buf)
 121: /* convert to C format, translating \000 to \0200 and terminating on count */
 122:     String *p;
 123:     Unspecified *buf;
 124: {
 125:     Cardinal len;
 126:     register int n, ch;
 127:     register String from, to;
 128: 
 129:     buf += internalize_Cardinal(&len, buf);
 130:     *p = to = (String) Allocate(len/2 + 1);
 131:     from = (String) buf;
 132:     for (n = len; n > 0; --n) {
 133:         if ((ch = *from++) == '\000') *to++ = '\0200';
 134:         else *to++ = ch;
 135:     }
 136:     *to = '\000';       /* tie off with a null, finally */
 137:     return ((len+3)/2);
 138: }
 139: 
 140: int
 141: sizeof_enumeration(p)
 142:     unsigned int *p;
 143: {
 144:     return(sizeof_Cardinal(p));
 145: }
 146: 
 147: clear_enumeration(p)
 148:     unsigned int *p;
 149: {
 150:     return;             /* no-op */
 151: }
 152: 
 153: int
 154: externalize_enumeration(p, buf)
 155:     unsigned int *p;        /* enums are same size as int */
 156:     Unspecified *buf;
 157: {
 158:     Cardinal c;
 159: 
 160:     /*
 161: 	 * If this truncates, and it will on a Vax or a Sun,
 162: 	 * that's because Courier Enumerations are  defined to be
 163: 	 * "in the closed interval [0, 65535]."  So, if the value
 164: 	 * of the C enum is too big, there's nothing we can do here ...
 165: 	 * except possibly to raise an exception.
 166: 	 */
 167:     c = *p;
 168:     return(externalize_Cardinal(&c, buf));
 169: }
 170: 
 171: int
 172: internalize_enumeration(p, buf)
 173:     unsigned int *p;
 174:     Unspecified *buf;
 175: {
 176:     Cardinal c;
 177:     register int s;
 178: 
 179:     s = internalize_Cardinal(&c, buf);
 180:     *p = c;         /* (possibly) expand from short to long */
 181: 
 182:     return(s);
 183: }
 184: 
 185: 
 186: #if sel
 187: int MoveLong(a, b)
 188:     Unspecified *a, *b;
 189: {
 190:     *b++ = *a++;
 191:     *b = *a;
 192:     return(2);
 193: }
 194: #endif

Defined functions

Allocate defined in line 33; used 2 times
Deallocate defined in line 57; used 4 times
MoveLong defined in line 187; never used
clear_String defined in line 84; never used
clear_enumeration defined in line 147; never used
externalize_String defined in line 92; never used
externalize_enumeration defined in line 153; never used
internalize_String defined in line 119; never used
internalize_enumeration defined in line 171; used 1 times
sizeof_String defined in line 76; never used
sizeof_enumeration defined in line 140; never used

Defined variables

rcsid defined in line 26; never used
Last modified: 1986-03-13
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 842
Valid CSS Valid XHTML 1.0 Strict