1 /*%% (c) Copyright 1993, 1994 Hewlett-Packard Company */
2 /*%% (c) Copyright 1993, 1994 International Business Machines Corp. */
3 /*%% (c) Copyright 1993, 1994 Sun Microsystems, Inc. */
4 /*%% (c) Copyright 1993, 1994 Novell, Inc. */
5 /*%% $XConsortium: isdatconv.c /main/3 1995/10/23 11:37:16 rswiston $ */
7 static char sccsid[] = "@(#)isdatconv.c 1.5 89/07/17 Copyr 1988 Sun Micro";
10 * Copyright (c) 1988 by Sun Microsystems, Inc.
17 * Conversion function between machine dependent and the X/OPEN
18 * machine independent formats.
20 * Some pieces of code may not be very "structured", but they result in
21 * optimized code with the -O compiler option.
25 #include "isam_impl.h"
29 /* conversion functions for sparc architecture */
31 /* ldlong() - Load a long integer from a potentially unaligned address */
39 register unsigned long val;
41 register unsigned int val;
45 for (i=0; i<LONGSIZE ; i++)
46 val = (val << 8) + *((unsigned char *)p++);
51 /* stlong() - Store a long integer at a potentially unaligned address */
61 for (i=0; i<LONGSIZE ; i++)
62 *--p = (val >> 8*i) & 255;
67 /* ldint() - Load a short integer from a potentially unaligned address */
73 register unsigned int val;
75 val = *((unsigned char *)p++);
76 val = (val << 8) + *((unsigned char *)p++);
82 /* ldunshort - load a unshort integer : for 64K record length */
88 register unsigned int val;
90 val = *((unsigned char *)p++);
91 val = (val << 8) + *((unsigned char *)p++);
93 return ((u_short)val);
96 /* stint() - Store a short integer at a potentially unaligned address */
105 *--p = (val >> 8) & 255;
110 /* ldchar() - Load character field */
113 ldchar(src, len, dst)
123 /* Load the entire string. */
124 memcpy((void *) dst, (const void *) src, len);
126 /* Remove trailing blanks. */
138 stchar(src, dst, len)
148 /* Copy up to NULL character. */
150 if ((c = *src++) == '\0')
155 /* Pad with blanks. */
157 (void) memset((void *) dst, BLANK, len);
160 /* ldchar2() - Load character field (C style, NULL padded) */
163 ldchar2(src, len, dst)
173 /* Load the entire string. */
174 memcpy((void *) dst, (const void *) src, len);
179 stchar2(src, dst, len)
189 /* Copy up to a NULL character. */
191 if ((c = *src++) == '\0')
196 /* Pad with NULLs. */
201 /* ldfloat() - Load a float number from a potentially unaligned address */
211 register unsigned int val;
213 val = *((unsigned char *)p++);
214 val = (val << 8) + *((unsigned char *)p++);
215 val = (val << 8) + *((unsigned char *)p++);
216 val = (val << 8) + *((unsigned char *)p++);
222 /* stfloat() - Store a float number at a potentially unaligned address */
226 float f; /* Bug - it is passed as double */
229 register unsigned val;
235 uval.fval = f; /* This fixes compiler bug */
240 *--p = (val >> 8) & 255;
241 *--p = (val >> 16) & 255;
242 *--p = (val >> 24) & 255;
247 #if sparc | mc68000 /* MRJ */
249 /* ldbld() - Load a double float number from a potentially unaligned address */
257 memcpy((void *)&val, (const void *) p, DOUBLESIZE);
261 /* stdbl() - Store a double float number at a potentially unaligned address */
268 memcpy ( p,(char *)&val, DOUBLESIZE);
271 #else /* 386i -- do it the long way round.... */
273 /* ldbld() - Load a double float number from a potentially unaligned address */
281 char sval[DOUBLESIZE];
290 for (i=0; i<DOUBLESIZE; i++)
295 /* stdbl() - Store a double float number at a potentially unaligned address */
304 char sval[DOUBLESIZE];
314 for (i=0; i<DOUBLESIZE; i++)