adding zephyr-im master branch
This commit is contained in:
80
lib/ZMakeZcode.c
Normal file
80
lib/ZMakeZcode.c
Normal file
@ -0,0 +1,80 @@
|
||||
/* This file is part of the Project Athena Zephyr Notification System.
|
||||
* It contains source for the ZMakeZcode function.
|
||||
*
|
||||
* Created by: Jeffrey Hutzelman
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (c) 1987, 2002 by the Massachusetts Institute of Technology.
|
||||
* For copying and distribution information, see the file
|
||||
* "mit-copyright.h".
|
||||
*/
|
||||
|
||||
#include <internal.h>
|
||||
#include <assert.h>
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid_ZMakeZcode_c[] = "$Id$";
|
||||
#endif
|
||||
|
||||
Code_t
|
||||
ZMakeZcode32(char *ptr,
|
||||
int len,
|
||||
unsigned long val)
|
||||
{
|
||||
unsigned char buf[4];
|
||||
buf[0] = (val >> 24) & 0xff;
|
||||
buf[1] = (val >> 16) & 0xff;
|
||||
buf[2] = (val >> 8) & 0xff;
|
||||
buf[3] = val & 0xff;
|
||||
return ZMakeZcode(ptr, len, buf, 4);
|
||||
}
|
||||
|
||||
Code_t
|
||||
ZMakeZcode(register char *ptr,
|
||||
int len,
|
||||
unsigned char *field,
|
||||
int num)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
* This optimistic check lets us discover quickly if the buffer
|
||||
* is not even large enough to hold the field without escapes.
|
||||
* It also insures we'll have space for the leading 'Z' and the
|
||||
* trailing NUL. Note that this does _not_ remove the need for
|
||||
* checking length as we encode.
|
||||
*/
|
||||
if (len < num + 2)
|
||||
return ZERR_FIELDLEN;
|
||||
*ptr++ = 'Z';
|
||||
--len;
|
||||
for (i=0;i<num;i++) {
|
||||
switch (field[i]) {
|
||||
case 0x00:
|
||||
if (len < 3)
|
||||
return ZERR_FIELDLEN;
|
||||
*(unsigned char *)ptr++ = 0xff;
|
||||
*(unsigned char *)ptr++ = 0xf0;
|
||||
len -= 2;
|
||||
continue;
|
||||
|
||||
case 0xff:
|
||||
if (len < 3)
|
||||
return ZERR_FIELDLEN;
|
||||
*(unsigned char *)ptr++ = 0xff;
|
||||
*(unsigned char *)ptr++ = 0xf1;
|
||||
len -= 2;
|
||||
continue;
|
||||
|
||||
default:
|
||||
if (len < 2)
|
||||
return ZERR_FIELDLEN;
|
||||
*ptr++ = field[i];
|
||||
len--;
|
||||
}
|
||||
}
|
||||
|
||||
*ptr = '\0';
|
||||
return ZERR_NONE;
|
||||
}
|
Reference in New Issue
Block a user