diff --git a/inc/locfile.h b/inc/locfile.h index 7587aa1..706962a 100644 --- a/inc/locfile.h +++ b/inc/locfile.h @@ -12,6 +12,7 @@ #include /* for NAME_MAX */ #include /* for MAXNAMLEN */ #include "lispemul.h" /* for DLword */ +#include "commondefs.h" /* for error */ #define FDEV_PAGE_SIZE 512 /* 1 page == 512 byte */ @@ -63,6 +64,10 @@ else {return(NIL);}} while (0) +#ifndef min +#define min(a, b) (((a) <= (b))?(a):(b)) +#endif /* min */ + /************************************************************************/ /* */ /* L i s p S t r i n g T o C S t r i n g */ @@ -78,58 +83,52 @@ /* */ /************************************************************************/ #ifndef BYTESWAP -#define LispStringToCString(Lisp, C, MaxLen) \ - do { \ - OneDArray *lf_arrayp; \ - char *lf_base, *lf_dp; \ - short *lf_sbase; \ - size_t lf_length; \ - lf_arrayp = (OneDArray *)NativeAligned4FromLAddr(Lisp); \ - lf_length = min(MaxLen - 1, lf_arrayp->fillpointer); \ - lf_dp = (C); \ - switch (lf_arrayp->typenumber) { \ - case THIN_CHAR_TYPENUMBER: \ - lf_base = \ - ((char *)(NativeAligned2FromLAddr(lf_arrayp->base))) + ((int)(lf_arrayp->offset)); \ - strncpy(lf_dp, lf_base, lf_length); \ - lf_dp[lf_length] = '\0'; \ - break; \ - \ - case FAT_CHAR_TYPENUMBER: \ - lf_sbase = \ - ((short *)(NativeAligned2FromLAddr(lf_arrayp->base))) + ((int)(lf_arrayp->offset)); \ - for (size_t lf_i = 0; lf_i < (lf_length); lf_i++) *lf_dp++ = (char)(*lf_sbase++); \ - *lf_dp = '\0'; \ - break; \ - default: error("LispStringToCString: Not a character array.\n"); \ - } \ - } while (0) +static void LispStringToCString(LispPTR Lisp, char *C, size_t MaxLen) { + OneDArray *lf_arrayp; + char *lf_base, *lf_dp; + short *lf_sbase; + size_t lf_length; + lf_arrayp = (OneDArray *)NativeAligned4FromLAddr(Lisp); + lf_length = min(MaxLen - 1, lf_arrayp->fillpointer); + lf_dp = (C); + switch (lf_arrayp->typenumber) { + case THIN_CHAR_TYPENUMBER: + lf_base = ((char *)(NativeAligned2FromLAddr(lf_arrayp->base))) + ((int)(lf_arrayp->offset)); + strncpy(lf_dp, lf_base, lf_length); + lf_dp[lf_length] = '\0'; + break; + + case FAT_CHAR_TYPENUMBER: + lf_sbase = ((short *)(NativeAligned2FromLAddr(lf_arrayp->base))) + ((int)(lf_arrayp->offset)); + for (size_t lf_i = 0; lf_i < (lf_length); lf_i++) *lf_dp++ = (char)(*lf_sbase++); + *lf_dp = '\0'; + break; + default: error("LispStringToCString: Not a character array.\n"); + } +} #else /* BYTESWAP == T CHANGED-BY-TAKE */ -#define LispStringToCString(Lisp, C, MaxLen) \ - do { \ - OneDArray *lf_arrayp; \ - char *lf_base, *lf_dp; \ - short *lf_sbase; \ - size_t lf_length; \ - lf_arrayp = (OneDArray *)(NativeAligned4FromLAddr(Lisp)); \ - lf_length = min(MaxLen - 1, lf_arrayp->fillpointer); \ - lf_dp = (C); \ - switch (lf_arrayp->typenumber) { \ - case THIN_CHAR_TYPENUMBER: \ - lf_base = \ - ((char *)(NativeAligned2FromLAddr(lf_arrayp->base))) + ((int)(lf_arrayp->offset)); \ - for (size_t lf_i = 0; lf_i < lf_length; lf_i++) *lf_dp++ = GETBYTE(lf_base++); \ - break; \ - \ - case FAT_CHAR_TYPENUMBER: \ - lf_sbase = \ - ((short *)(NativeAligned2FromLAddr(lf_arrayp->base))) + ((int)(lf_arrayp->offset)); \ - for (size_t lf_ii = 0; lf_ii < lf_length; lf_ii++) *lf_dp++ = (char)(GETWORD(lf_sbase++)); \ - break; \ - default: error("LispStringToCString: Not a character array.\n"); \ - } \ - *lf_dp = '\0'; \ - } while (0) +static void LispStringToCString(LispPTR Lisp, char *C, size_t MaxLen) { + OneDArray *lf_arrayp; + char *lf_base, *lf_dp; + short *lf_sbase; + size_t lf_length; + lf_arrayp = (OneDArray *)(NativeAligned4FromLAddr(Lisp)); + lf_length = min(MaxLen - 1, lf_arrayp->fillpointer); + lf_dp = (C); + switch (lf_arrayp->typenumber) { + case THIN_CHAR_TYPENUMBER: + lf_base = ((char *)(NativeAligned2FromLAddr(lf_arrayp->base))) + ((int)(lf_arrayp->offset)); + for (size_t lf_i = 0; lf_i < lf_length; lf_i++) *lf_dp++ = GETBYTE(lf_base++); + break; + + case FAT_CHAR_TYPENUMBER: + lf_sbase = ((short *)(NativeAligned2FromLAddr(lf_arrayp->base))) + ((int)(lf_arrayp->offset)); + for (size_t lf_ii = 0; lf_ii < lf_length; lf_ii++) *lf_dp++ = (char)(GETWORD(lf_sbase++)); + break; + default: error("LispStringToCString: Not a character array.\n"); + } + *lf_dp = '\0'; +} #endif /* BYTESWAP */ @@ -181,10 +180,6 @@ do { \ (cstringp) = (char *)(NativeAligned2FromLAddr(((OneDArray *)lf_naddress)->base)); \ } while (0) -#ifndef min -#define min(a, b) (((a) <= (b))?(a):(b)) -#endif /* min */ - #define LispNumToCInt(Lisp) \ ( (((Lisp) & SEGMASK) == S_POSITIVE) ? ((Lisp) & 0xFFFF) : \ (((Lisp) & SEGMASK) == S_NEGATIVE) ? ((Lisp) | 0xFFFF0000) : \