You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
291 lines
8.4 KiB
291 lines
8.4 KiB
/*
|
|
* $Id: pi-macros.h,v 1.17 2006/10/17 13:24:07 desrod Exp $
|
|
*
|
|
* pi-macros.h: pilot-link specific macro defintions
|
|
*
|
|
* This library is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU Library General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or (at
|
|
* your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public License
|
|
* along with this library; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef _PILOT_MACROS_H_
|
|
#define _PILOT_MACROS_H_
|
|
|
|
#include <time.h>
|
|
#include "pi-args.h"
|
|
|
|
typedef unsigned long recordid_t;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
extern double get_float PI_ARGS((void *));
|
|
extern void set_float PI_ARGS((void *, double));
|
|
extern int compareTm PI_ARGS((struct tm * a, struct tm * b));
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#ifndef __cplusplus
|
|
#define get_long(ptr) \
|
|
(unsigned long) ( \
|
|
(((unsigned long)((unsigned char *)(ptr))[0]) << 24) | \
|
|
(((unsigned long)((unsigned char *)(ptr))[1]) << 16) | \
|
|
(((unsigned long)((unsigned char *)(ptr))[2]) << 8) | \
|
|
(((unsigned long)((unsigned char *)(ptr))[3]) ) )
|
|
|
|
|
|
#define get_treble(ptr) ((unsigned long)\
|
|
((((unsigned char*)(ptr))[0] << 16) | \
|
|
(((unsigned char*)(ptr))[1] << 8) | \
|
|
(((unsigned char*)(ptr))[2])))
|
|
#define get_short(ptr) ((unsigned short)\
|
|
((((unsigned char*)(ptr))[0] << 8) | \
|
|
(((unsigned char*)(ptr))[1])))
|
|
#define get_byte(ptr) (((unsigned char*)(ptr))[0])
|
|
#define get_slong(ptr) (signed long)(\
|
|
(get_long((ptr)) > 0x7FFFFFFF) ?\
|
|
(((signed long)(get_long((ptr)) & 0x7FFFFFFF)) - 0x80000000):\
|
|
((signed long)(get_long((ptr))))\
|
|
)
|
|
#define get_streble(ptr) (signed long)(\
|
|
(get_treble((ptr)) > 0x7FFFFF) ?\
|
|
(((signed long)(get_treble((ptr)) & 0x7FFFFF)) - 0x800000):\
|
|
((signed long)(get_treble((ptr))))\
|
|
)
|
|
#define get_sshort(ptr) (signed short)(\
|
|
(get_short((ptr)) > 0x7FFF) ?\
|
|
(((signed short)(get_short((ptr)) & 0x7FFF)) - 0x8000):\
|
|
((signed short)(get_short((ptr))))\
|
|
)
|
|
#define get_sbyte(ptr) (signed char)(\
|
|
(get_byte((ptr)) > 0x7F) ?\
|
|
(((signed char)(get_byte((ptr)) & 0x7F)) - 0x80):\
|
|
((signed char)(get_byte((ptr))))\
|
|
)
|
|
#define set_long(ptr,val) ((((unsigned char*)(ptr))[0] = (unsigned char)(((unsigned long)(val)) >> 24) & 0xff), \
|
|
(((unsigned char*)(ptr))[1] = (((unsigned long)(val)) >> 16) & 0xff), \
|
|
(((unsigned char*)(ptr))[2] = (((unsigned long)(val)) >> 8) & 0xff), \
|
|
(((unsigned char*)(ptr))[3] = (((unsigned long)(val)) >> 0) & 0xff))
|
|
#define set_slong(ptr,val) set_long((ptr),((unsigned long)(\
|
|
(((signed long)(val)) < 0) ?\
|
|
((unsigned long)(((signed long)(val)) + 0x80000000) | 0x80000000) :\
|
|
(val)\
|
|
)))
|
|
#define set_treble(ptr,val) ((((unsigned char*)(ptr))[0] = (unsigned char)(((unsigned long)(val)) >> 16) & 0xff), \
|
|
(((unsigned char*)(ptr))[1] = (((unsigned long)(val)) >> 8) & 0xff), \
|
|
(((unsigned char*)(ptr))[2] = (((unsigned long)(val)) >> 0) & 0xff))
|
|
#define set_streble(ptr,val) set_treble((ptr),((unsigned long)(\
|
|
(((signed long)(val)) < 0) ?\
|
|
((unsigned long)(((signed long)(val)) + 0x800000) | 0x800000) :\
|
|
(val)\
|
|
)))
|
|
#define set_short(ptr,val) ((((unsigned char*)(ptr))[0] = (((unsigned short)(val)) >> 8) & 0xff), \
|
|
(((unsigned char*)(ptr))[1] = (((unsigned short)(val)) >> 0) & 0xff))
|
|
#define set_sshort(ptr,val) set_short((ptr),((unsigned short)(\
|
|
(((signed short)(val)) < 0) ?\
|
|
((unsigned short)(((signed short)(val)) + 0x8000) | 0x8000) :\
|
|
(val)\
|
|
)))
|
|
#define set_byte(ptr,val) (((unsigned char*)(ptr))[0]=(val))
|
|
#define set_sbyte(ptr,val) set_byte((ptr),((unsigned char)(\
|
|
(((signed char)(val)) < 0) ?\
|
|
((unsigned char)(((signed char)(val)) + 0x80) | 0x80) :\
|
|
(val)\
|
|
)))
|
|
#define char4(c1,c2,c3,c4) (((c1)<<24)|((c2)<<16)|((c3)<<8)|(c4))
|
|
#else /*ifdef __cplusplus */
|
|
inline unsigned long get_long(const void *buf)
|
|
{
|
|
unsigned char *ptr = (unsigned char *) buf;
|
|
|
|
return (*ptr << 24) | (*(++ptr) << 16) | (*(++ptr) << 8) |
|
|
*(++ptr);
|
|
}
|
|
|
|
inline signed long get_slong(const void *buf)
|
|
{
|
|
unsigned long val = get_long(buf);
|
|
|
|
if (val > 0x7FFFFFFF)
|
|
return ((signed long) (val & 0x7FFFFFFF)) - 0x80000000;
|
|
else
|
|
return val;
|
|
}
|
|
|
|
inline unsigned long get_treble(const void *buf)
|
|
{
|
|
unsigned char *ptr = (unsigned char *) buf;
|
|
|
|
return (*ptr << 16) | (*(++ptr) << 8) | *(++ptr);
|
|
}
|
|
|
|
inline signed long get_streble(const void *buf)
|
|
{
|
|
unsigned long val = get_treble(buf);
|
|
|
|
if (val > 0x7FFFFF)
|
|
return ((signed long) (val & 0x7FFFFF)) - 0x800000;
|
|
else
|
|
return val;
|
|
}
|
|
|
|
inline int get_short(const void *buf)
|
|
{
|
|
unsigned char *ptr = (unsigned char *) buf;
|
|
|
|
return (*ptr << 8) | *(++ptr);
|
|
}
|
|
|
|
inline signed short get_sshort(const void *buf)
|
|
{
|
|
unsigned short val = get_short(buf);
|
|
|
|
if (val > 0x7FFF)
|
|
return ((signed short) (val & 0x7FFF)) - 0x8000;
|
|
else
|
|
return val;
|
|
}
|
|
|
|
inline int get_byte(const void *buf)
|
|
{
|
|
return *((unsigned char *) buf);
|
|
}
|
|
|
|
inline signed char get_sbyte(const void *buf)
|
|
{
|
|
unsigned char val = get_byte(buf);
|
|
|
|
if (val > 0x7F)
|
|
return ((signed char) (val & 0x7F)) - 0x80;
|
|
else
|
|
return val;
|
|
}
|
|
|
|
inline void set_long(void *buf, const unsigned long val)
|
|
{
|
|
unsigned char *ptr = (unsigned char *) buf;
|
|
|
|
*ptr = (unsigned char) ((val >> 24) & 0xff);
|
|
*(++ptr) = (unsigned char) ((val >> 16) & 0xff);
|
|
*(++ptr) = (unsigned char) ((val >> 8) & 0xff);
|
|
*(++ptr) = (unsigned char) (val & 0xff);
|
|
}
|
|
|
|
inline void set_slong(void *buf, const signed long val)
|
|
{
|
|
unsigned long uval;
|
|
|
|
if (val < 0) {
|
|
uval = (val + 0x80000000);
|
|
uval |= 0x80000000;
|
|
} else
|
|
uval = val;
|
|
set_long(buf, uval);
|
|
}
|
|
|
|
inline void set_treble(void *buf, const unsigned long val)
|
|
{
|
|
unsigned char *ptr = (unsigned char *) buf;
|
|
|
|
*ptr = (unsigned char) ((val >> 16) & 0xff);
|
|
*(++ptr) = (unsigned char) ((val >> 8) & 0xff);
|
|
*(++ptr) = (unsigned char) (val & 0xff);
|
|
}
|
|
|
|
inline void set_streble(void *buf, const signed long val)
|
|
{
|
|
unsigned long uval;
|
|
|
|
if (val < 0) {
|
|
uval = (val + 0x800000);
|
|
uval |= 0x800000;
|
|
} else
|
|
uval = val;
|
|
set_treble(buf, uval);
|
|
}
|
|
|
|
inline void set_short(void *buf, const int val)
|
|
{
|
|
unsigned char *ptr = (unsigned char *) buf;
|
|
|
|
*ptr = (val >> 8) & 0xff;
|
|
*(++ptr) = val & 0xff;
|
|
}
|
|
|
|
inline void set_sshort(void *buf, const signed short val)
|
|
{
|
|
unsigned short uval;
|
|
|
|
if (val < 0) {
|
|
uval = (val + 0x8000);
|
|
uval |= 0x8000;
|
|
} else
|
|
uval = val;
|
|
set_treble(buf, uval);
|
|
}
|
|
|
|
inline void set_byte(void *buf, const int val)
|
|
{
|
|
*((unsigned char *) buf) = val;
|
|
}
|
|
|
|
inline void set_sbyte(void *buf, const signed char val)
|
|
{
|
|
unsigned char uval;
|
|
|
|
if (val < 0) {
|
|
uval = (val + 0x80);
|
|
uval |= 0x80;
|
|
} else
|
|
uval = val;
|
|
set_byte(buf, uval);
|
|
}
|
|
|
|
inline struct tm *getBufTm(struct tm *t, const void *buf, int setTime)
|
|
{
|
|
unsigned short int d = get_short(buf);
|
|
|
|
t->tm_year = (d >> 9) + 4;
|
|
t->tm_mon = ((d >> 5) & 15) - 1;
|
|
t->tm_mday = d & 31;
|
|
|
|
if (setTime) {
|
|
t->tm_hour = 0;
|
|
t->tm_min = 0;
|
|
t->tm_sec = 0;
|
|
}
|
|
|
|
t->tm_isdst = -1;
|
|
|
|
mktime(t);
|
|
|
|
return t;
|
|
}
|
|
|
|
inline void setBufTm(void *buf, const struct tm *t)
|
|
{
|
|
set_short(buf,
|
|
((t->tm_year - 4) << 9) | ((t->tm_mon +
|
|
1) << 5) | t->tm_mday);
|
|
}
|
|
|
|
inline unsigned long char4(char c1, char c2, char c3, char c4)
|
|
{
|
|
return (c1 << 24) | (c2 << 16) | (c3 << 8) | c4;
|
|
}
|
|
|
|
#endif /*__cplusplus*/
|
|
#endif /* _PILOT_MACROS_H_ */
|