"Fossies" - the Fresh Open Source Software Archive 
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "xdr.c" see the
Fossies "Dox" file reference documentation.
1 /* Notes */ /*{{{C}}}*//*{{{*/
2 /*
3
4 xdr_enum() is unusable, because enum_t may have a different size than
5 an enum. The construction
6
7 int_value=*enum_value;
8 result=xdr_int(xdrs,&int_value);
9 *enum_value=int_value;
10 return result;
11
12 solves the problem and works for both encoding and decoding.
13 Unfortunately, I could not yet find such a solution for a variable sized
14 array terminated by a special element.
15
16 */
17 /*}}}*/
18 /* #includes */ /*{{{*/
19 #ifdef DMALLOC
20 #include "dmalloc.h"
21 #endif
22
23 #include <assert.h>
24 #include <string.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27
28 #include "sheet.h"
29 #include "xdr.h"
30 /*}}}*/
31
32 /* xdr_token */ /*{{{*/
33 static bool_t xdr_token(XDR *xdrs, Token *t)
34 {
35 int x,result;
36
37 if (xdrs->x_op==XDR_DECODE) (void)memset(t,0,sizeof(Token));
38 x=t->type;
39 if (t->type==OPERATOR) x|=t->u.op<<8;
40 result=xdr_int(xdrs,&x);
41 if ((x&0xff)==OPERATOR) t->u.op=(x>>8)&0xff;
42 t->type=x&0xff;
43 if (result==0) return result;
44 switch (t->type)
45 {
46 /* EMPTY */ /*{{{*/
47 case EMPTY:
48 {
49 return 1;
50 }
51 /*}}}*/
52 /* STRING */ /*{{{*/
53 case STRING:
54 {
55 return xdr_wrapstring(xdrs,&(t->u.string));
56 }
57 /*}}}*/
58 /* FLOAT */ /*{{{*/
59 case FLOAT:
60 {
61 return xdr_double(xdrs,&(t->u.flt));
62 }
63 /*}}}*/
64 /* INT */ /*{{{*/
65 case INT:
66 {
67 return xdr_long(xdrs,&(t->u.integer));
68 }
69 /*}}}*/
70 /* OPERATOR */ /*{{{*/
71 case OPERATOR:
72 {
73 return 1; /* since op is encoded in type */
74 }
75 /*}}}*/
76 /* LIDENT */ /*{{{*/
77 case LIDENT:
78 {
79 return xdr_wrapstring(xdrs,&(t->u.lident));
80 }
81 /*}}}*/
82 /* FIDENT */ /*{{{*/
83 case FIDENT:
84 {
85 return xdr_int(xdrs,&(t->u.fident));
86 }
87 /*}}}*/
88 /* LOCATION */ /*{{{*/
89 case LOCATION:
90 {
91 return (xdr_int(xdrs,&(t->u.location[0])) && xdr_int(xdrs,&(t->u.location[1])) && xdr_int(xdrs,&(t->u.location[2])));
92 }
93 /*}}}*/
94 /* EEK */ /*{{{*/
95 case EEK:
96 {
97 return xdr_wrapstring(xdrs,&(t->u.err));
98 }
99 /*}}}*/
100 /* default -- should not happen */ /*{{{*/
101 default: assert(0);
102 /*}}}*/
103 }
104 return 0;
105 }
106 /*}}}*/
107 /* xdr_tokenptr */ /*{{{*/
108 static bool_t xdr_tokenptr(XDR *xdrs, Token **t)
109 {
110 return xdr_pointer(xdrs,(char**)t,sizeof(Token),(xdrproc_t)xdr_token);
111 }
112 /*}}}*/
113 /* xdr_tokenptrvec */ /*{{{*/
114 static bool_t xdr_tokenptrvec(XDR *xdrs, Token ***t)
115 {
116 unsigned int len;
117 int result;
118
119 assert(t!=(Token***)0);
120 if (xdrs->x_op!=XDR_DECODE)
121 {
122 Token **run;
123
124 if (*t==(Token**)0) len=0;
125 else for (len=1,run=*t; *run!=(Token*)0; ++len,++run);
126 }
127 result=xdr_array(xdrs,(char**)t,&len,65536,sizeof(Token*),(xdrproc_t)xdr_tokenptr);
128 if (len==0) *t=(Token**)0;
129 return result;
130 }
131 /*}}}*/
132 /* xdr_mystring */ /*{{{*/
133 static bool_t xdr_mystring(XDR *xdrs, char **str)
134 {
135 static struct xdr_discrim arms[3]=
136 {
137 { 0, (xdrproc_t)xdr_void },
138 { 1, (xdrproc_t)xdr_wrapstring },
139 { -1, (xdrproc_t)0 }
140 };
141 enum_t x;
142 int res;
143
144 x=(*str!=(char*)0);
145 res=xdr_union(xdrs, &x, (char*)str, arms, (xdrproc_t)0);
146 if (!x) *str=(char*)0;
147 return res;
148 }
149 /*}}}*/
150
151 /* Notes */ /*{{{*/
152 /*
153
154 The saved sheet consists of three xdr_int()s which specify x, y and z
155 position of the cell saved with xdr_cell(). Perhaps xdr_cell could be
156 given those as parameters, which would be more correct concerning the
157 purpose of the xdr_functions. Then again, reading the position may
158 fail (eof), whereas after the position has been read, xdr_cell() must
159 not fail when loading a sheet.
160
161 */
162 /*}}}*/
163 /* xdr_cell */ /*{{{*/
164 bool_t xdr_cell(XDR *xdrs, Cell *cell)
165 {
166 int result,x;
167
168 assert(cell!=(Cell*)0);
169 if (!(xdr_tokenptrvec(xdrs, &(cell->contents)) && xdr_tokenptrvec(xdrs, &(cell->ccontents)) /* && xdr_token(xdrs, &(cell->value)) */ )) return 0;
170 if (xdr_mystring(xdrs, &(cell->label))==0) return 0;
171 x=cell->adjust;
172 result=xdr_int(xdrs, &x);
173 cell->adjust=x;
174 if (result==0) return 0;
175 if (xdr_int(xdrs, &(cell->precision))==0) return 0;
176 x=(cell->updated&1)|((cell->shadowed&1)<<1)|((cell->scientific&1)<<2)|((cell->locked&1)<<3)|((cell->transparent&1)<<4)|((cell->ignored&1)<<5)|((cell->bold&1)<<6)|((cell->underline&1)<<7);
177 result=xdr_int(xdrs, &x);
178 cell->updated=((x&(1))!=0);
179 cell->shadowed=((x&(1<<1))!=0);
180 cell->scientific=((x&(1<<2))!=0);
181 cell->locked=((x&(1<<3))!=0);
182 cell->transparent=((x&(1<<4))!=0);
183 cell->ignored=((x&(1<<5))!=0);
184 cell->bold=((x&(1<<6))!=0);
185 cell->underline=((x&(1<<7))!=0);
186 return result;
187 }
188 /*}}}*/
189 /* xdr_column */ /*{{{*/
190 bool_t xdr_column(XDR *xdrs, int *x, int *z, int *width)
191 {
192 return (xdr_int(xdrs, x) && xdr_int(xdrs, z) && xdr_int(xdrs, width));
193 }
194 /*}}}*/
195 /* xdr_magic */ /*{{{*/
196 #define MAGIC0 (('#'<<24)|('!'<<16)|('t'<<8)|'e')
197 #define MAGIC1 (('a'<<24)|('p'<<16)|('o'<<8)|'t')
198 #define MAGIC2 (('\n'<<24)|('x'<<16)|('d'<<8)|'r')
199
200 bool_t xdr_magic(XDR *xdrs)
201 {
202 long m0,m1,m2;
203
204 m0=MAGIC0;
205 m1=MAGIC1;
206 m2=MAGIC2;
207 return (xdr_long(xdrs,&m0) && m0==MAGIC0 && xdr_long(xdrs,&m1) && m1==MAGIC1 && xdr_long(xdrs,&m2) && m2==MAGIC2);
208 }
209 /*}}}*/