Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libcs/msgbuf.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1990-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
#pragma prototyped
21
22
/*
23
* system call message buffer support
24
*/
25
26
#include "msglib.h"
27
28
/*
29
* get encoded unsigned long from buf
30
*/
31
32
unsigned long
33
msggetu(char** buf, char* end)
34
{
35
register int c;
36
register unsigned char* s;
37
register unsigned char* e;
38
register unsigned long v;
39
40
v = 0;
41
s = (unsigned char*)*buf;
42
e = (unsigned char*)end;
43
do
44
{
45
if (s >= e) return -1L;
46
c = *s++;
47
v = (v << 7) | (c & 0177);
48
} while (c & 0200);
49
*buf = (char*)s;
50
return v;
51
}
52
53
/*
54
* encode unsigned long into buf
55
*/
56
57
int
58
msgputu(char** buf, char* end, register unsigned long v)
59
{
60
register char* s;
61
register char* t;
62
register int n;
63
char tmp[2 * sizeof(unsigned long)];
64
65
s = t = &tmp[elementsof(tmp) - 1];
66
*t = v & 0177;
67
while((v >>= 7) > 0)
68
*--t = (v & 0177) | 0200;
69
n = s - t + 1;
70
if ((s = *buf) + n >= end)
71
return 0;
72
switch (n)
73
{
74
default: for (v = n - 7; v-- > 0;) *s++ = *t++;
75
case 7: *s++ = *t++;
76
case 6: *s++ = *t++;
77
case 5: *s++ = *t++;
78
case 4: *s++ = *t++;
79
case 3: *s++ = *t++;
80
case 2: *s++ = *t++;
81
case 1: *s++ = *t++;
82
}
83
*buf = s;
84
return n;
85
}
86
87
/*
88
* copy <data,size> from buf
89
*/
90
91
size_t
92
msggetz(char** buf, char* end, void* data, size_t size)
93
{
94
register size_t n;
95
register size_t i;
96
97
i = end - *buf;
98
n = msggetu(buf, end);
99
if (n > i) n = i;
100
if (size > n) size = n;
101
if (size) memcpy(data, *buf, size);
102
*buf += n;
103
return n;
104
}
105
106
/*
107
* copy <data,size> to buf
108
*/
109
110
int
111
msgputz(char** buf, char* end, void* data, size_t size)
112
{
113
register char* s;
114
register size_t n;
115
116
s = *buf;
117
n = end - s;
118
if (n > size) n = size;
119
msgputu(buf, end, n);
120
if (n)
121
{
122
if (n > (end - *buf))
123
{
124
n = end - *buf;
125
*buf = s;
126
msgputu(buf, end, n);
127
}
128
memcpy(*buf, data, n);
129
*buf += n;
130
}
131
return *buf - s;
132
}
133
134