massive utils refactoring, renames, avr libc utils cleaning
This commit is contained in:
@@ -1,35 +0,0 @@
|
||||
/* Copyright (c) 2002, Marek Michalkiewicz
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "avrlibc.h"
|
||||
|
||||
int
|
||||
avr_atoi(const char *p)
|
||||
{
|
||||
return (int) avr_atol(p);
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
/* Copyright (c) 2002, Marek Michalkiewicz
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "avrlibc.h"
|
||||
|
||||
long
|
||||
avr_atol(const char *p)
|
||||
{
|
||||
return avr_strtol(p, (char **) NULL, 10);
|
||||
}
|
||||
+11
-11
@@ -37,10 +37,10 @@
|
||||
#include <stdint.h>
|
||||
#include "avrlibc.h"
|
||||
|
||||
/* Only GCC 4.2 calls the library function to convert an unsigned long
|
||||
/* Only GCC 4.2 calls the library function to convert an uint32_t
|
||||
to float. Other GCC-es (including 4.3) use a signed long to float
|
||||
conversion along with a large inline code to correct the result. */
|
||||
extern double __floatunsisf (unsigned long);
|
||||
extern double __floatunsisf (uint32_t);
|
||||
|
||||
static const float pwr_p10 [6] = {
|
||||
1e+1, 1e+2, 1e+4, 1e+8, 1e+16, 1e+32
|
||||
@@ -84,13 +84,13 @@ double
|
||||
avr_strtod (const char * nptr, char ** endptr)
|
||||
{
|
||||
union {
|
||||
unsigned long u32;
|
||||
float flt;
|
||||
uint32_t u32;
|
||||
float flt;
|
||||
} x;
|
||||
unsigned char c;
|
||||
int exp;
|
||||
char c;
|
||||
int32_t exp;
|
||||
|
||||
unsigned char flag;
|
||||
uint8_t flag;
|
||||
#define FL_MINUS 0x01 /* number is negative */
|
||||
#define FL_ANY 0x02 /* any digit was readed */
|
||||
#define FL_OVFL 0x04 /* overflow was */
|
||||
@@ -178,7 +178,7 @@ avr_strtod (const char * nptr, char ** endptr)
|
||||
do {
|
||||
if (i < 3200)
|
||||
i = (((i << 2) + i) << 1) + c; /* i = 10*i + c */
|
||||
c = *nptr++ - '0';
|
||||
c = (char) (*nptr++ - '0');
|
||||
} while (c <= 9);
|
||||
if (flag & FL_MEXP)
|
||||
i = -i;
|
||||
@@ -189,7 +189,7 @@ avr_strtod (const char * nptr, char ** endptr)
|
||||
if ((flag & FL_ANY) && endptr)
|
||||
*endptr = (char *)nptr - 1;
|
||||
|
||||
x.flt = __floatunsisf (x.u32); /* manually */
|
||||
x.flt = (float) __floatunsisf (x.u32); /* manually */
|
||||
if ((flag & FL_MINUS) && (flag & FL_ANY))
|
||||
x.flt = -x.flt;
|
||||
|
||||
@@ -204,7 +204,7 @@ avr_strtod (const char * nptr, char ** endptr)
|
||||
for (pwr = 32; pwr; pwr >>= 1) {
|
||||
for (; exp >= pwr; exp -= pwr) {
|
||||
union {
|
||||
unsigned long u32;
|
||||
uint32_t u32;
|
||||
float flt;
|
||||
} y;
|
||||
y.u32 = (uint32_t) *((float *)nptr);
|
||||
@@ -213,7 +213,7 @@ avr_strtod (const char * nptr, char ** endptr)
|
||||
nptr -= sizeof(float);
|
||||
}
|
||||
if (!isfinite(x.flt) || x.flt == 0)
|
||||
errno = ERANGE;
|
||||
avrlibc_errno = ERANGE;
|
||||
}
|
||||
|
||||
return x.flt;
|
||||
|
||||
+19
-18
@@ -32,6 +32,7 @@
|
||||
|
||||
#include <limits.h>
|
||||
#include <errno.h>
|
||||
#include "avrlibc.h"
|
||||
|
||||
/*
|
||||
* Convert a string to a long integer.
|
||||
@@ -39,14 +40,14 @@
|
||||
* Ignores `locale' stuff. Assumes that the upper and lower case
|
||||
* alphabets and digits are each contiguous.
|
||||
*/
|
||||
long
|
||||
avr_strtol(const char *nptr, char **endptr, register int base)
|
||||
int32_t
|
||||
avr_strtol(const char *nptr, char **endptr, register int32_t base)
|
||||
{
|
||||
register unsigned long acc;
|
||||
register unsigned char c;
|
||||
register unsigned long cutoff;
|
||||
register signed char any;
|
||||
unsigned char flag = 0;
|
||||
register uint32_t acc;
|
||||
register char c;
|
||||
register uint32_t cutoff;
|
||||
register int8_t any;
|
||||
uint8_t flag = 0;
|
||||
#define FL_NEG 0x01 /* number is negative */
|
||||
#define FL_0X 0x02 /* number has a 0x prefix */
|
||||
|
||||
@@ -105,24 +106,24 @@ avr_strtol(const char *nptr, char **endptr, register int base)
|
||||
* Set any if any `digits' consumed; make it negative to indicate
|
||||
* overflow.
|
||||
*/
|
||||
#if LONG_MIN != -LONG_MAX - 1
|
||||
#if INT32_MIN != -INT32_MAX - 1
|
||||
# error "This implementation of strtol() does not work on this platform."
|
||||
#endif
|
||||
switch (base) {
|
||||
case 10:
|
||||
cutoff = ((unsigned long)LONG_MAX + 1) / 10;
|
||||
cutoff = ((uint32_t)INT32_MAX + 1) / 10;
|
||||
break;
|
||||
case 16:
|
||||
cutoff = ((unsigned long)LONG_MAX + 1) / 16;
|
||||
cutoff = ((uint32_t)INT32_MAX + 1) / 16;
|
||||
break;
|
||||
case 8:
|
||||
cutoff = ((unsigned long)LONG_MAX + 1) / 8;
|
||||
cutoff = ((uint32_t)INT32_MAX + 1) / 8;
|
||||
break;
|
||||
case 2:
|
||||
cutoff = ((unsigned long)LONG_MAX + 1) / 2;
|
||||
cutoff = ((uint32_t)INT32_MAX + 1) / 2;
|
||||
break;
|
||||
default:
|
||||
cutoff = ((unsigned long)LONG_MAX + 1) / base;
|
||||
cutoff = ((uint32_t)INT32_MAX + 1) / base;
|
||||
}
|
||||
|
||||
for (acc = 0, any = 0;; c = *nptr++) {
|
||||
@@ -143,7 +144,7 @@ avr_strtol(const char *nptr, char **endptr, register int base)
|
||||
continue;
|
||||
}
|
||||
acc = acc * base + c;
|
||||
if (acc > (unsigned long)LONG_MAX + 1)
|
||||
if (acc > (uint32_t)INT32_MAX + 1)
|
||||
any = -1;
|
||||
else
|
||||
any = 1;
|
||||
@@ -155,13 +156,13 @@ avr_strtol(const char *nptr, char **endptr, register int base)
|
||||
*endptr = (char *)nptr - 2;
|
||||
}
|
||||
if (any < 0) {
|
||||
acc = (flag & FL_NEG) ? LONG_MIN : LONG_MAX;
|
||||
errno = ERANGE;
|
||||
acc = (flag & FL_NEG) ? INT32_MIN : INT32_MAX;
|
||||
avrlibc_errno = ERANGE;
|
||||
} else if (flag & FL_NEG) {
|
||||
acc = -acc;
|
||||
} else if ((signed long)acc < 0) {
|
||||
acc = LONG_MAX;
|
||||
errno = ERANGE;
|
||||
acc = INT32_MAX;
|
||||
avrlibc_errno = ERANGE;
|
||||
}
|
||||
return (acc);
|
||||
}
|
||||
|
||||
+15
-15
@@ -35,18 +35,18 @@
|
||||
#include "avrlibc.h"
|
||||
|
||||
/*
|
||||
* Convert a string to an unsigned long integer.
|
||||
* Convert a string to an uint32_t integer.
|
||||
*
|
||||
* Ignores `locale' stuff. Assumes that the upper and lower case
|
||||
* alphabets and digits are each contiguous.
|
||||
*/
|
||||
unsigned long
|
||||
avr_strtoul(const char *nptr, char **endptr, register int base)
|
||||
uint32_t
|
||||
avr_strtoul(const char *nptr, char **endptr, register int32_t base)
|
||||
{
|
||||
register unsigned long acc;
|
||||
register unsigned char c;
|
||||
register unsigned long cutoff;
|
||||
register signed char any;
|
||||
register uint32_t acc;
|
||||
register char c;
|
||||
register uint32_t cutoff;
|
||||
register int8_t any;
|
||||
unsigned char flag = 0;
|
||||
#define FL_NEG 0x01 /* number is negative */
|
||||
#define FL_0X 0x02 /* number has a 0x prefix */
|
||||
@@ -102,10 +102,10 @@ avr_strtoul(const char *nptr, char **endptr, register int base)
|
||||
*
|
||||
*/
|
||||
switch (base) {
|
||||
case 16: cutoff = ULONG_MAX / 16; break;
|
||||
case 10: cutoff = ULONG_MAX / 10; break;
|
||||
case 8: cutoff = ULONG_MAX / 8; break;
|
||||
default: cutoff = ULONG_MAX / base;
|
||||
case 16: cutoff = UINT32_MAX / 16; break;
|
||||
case 10: cutoff = UINT32_MAX / 10; break;
|
||||
case 8: cutoff = UINT32_MAX / 8; break;
|
||||
default: cutoff = UINT32_MAX / base;
|
||||
}
|
||||
|
||||
for (acc = 0, any = 0;; c = *nptr++) {
|
||||
@@ -126,7 +126,7 @@ avr_strtoul(const char *nptr, char **endptr, register int base)
|
||||
continue;
|
||||
}
|
||||
acc = acc * base + c;
|
||||
any = (c > acc) ? -1 : 1;
|
||||
any = (int8_t) ((c > acc) ? -1 : 1);
|
||||
}
|
||||
|
||||
if (endptr) {
|
||||
@@ -138,8 +138,8 @@ avr_strtoul(const char *nptr, char **endptr, register int base)
|
||||
if (flag & FL_NEG)
|
||||
acc = -acc;
|
||||
if (any < 0) {
|
||||
acc = ULONG_MAX;
|
||||
errno = ERANGE;
|
||||
acc = UINT32_MAX;
|
||||
avrlibc_errno = ERANGE;
|
||||
}
|
||||
return (acc);
|
||||
return (uint32_t) (acc);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
//
|
||||
// Created by MightyPork on 2018/02/23.
|
||||
//
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
volatile int32_t avrlibc_errno = 0;
|
||||
+36
-25
@@ -8,21 +8,10 @@
|
||||
#ifndef GEX_AVRLIBC_H_H
|
||||
#define GEX_AVRLIBC_H_H
|
||||
|
||||
/**
|
||||
* atoi() - parse decimal int from ASCII
|
||||
*
|
||||
* @param p - string
|
||||
* @return int, 0 on failure
|
||||
*/
|
||||
int avr_atoi(const char *p);
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
/**
|
||||
* atol() - parse decimal long int from ASCII
|
||||
*
|
||||
* @param p - string
|
||||
* @return int, 0 on failure
|
||||
*/
|
||||
long avr_atol(const char *p);
|
||||
extern volatile int32_t avrlibc_errno;
|
||||
|
||||
/**
|
||||
* strtol() - parse integer number form string.
|
||||
@@ -35,7 +24,39 @@ long avr_atol(const char *p);
|
||||
* @param base - base 2, 10, 16.... 0 for auto
|
||||
* @return the number
|
||||
*/
|
||||
long avr_strtol(const char *nptr, char **endptr, register int base);
|
||||
int32_t avr_strtol(const char *nptr, char **endptr, register int32_t base);
|
||||
|
||||
/**
|
||||
* like strtol(), but unsigned (and hence higher max value)
|
||||
*
|
||||
* @param nptr - string to parse
|
||||
* @param endptr - NULL or pointer to string where the end will be stored (first bad char)
|
||||
* @param base - base 2, 10, 16.... 0 for auto
|
||||
* @return the number
|
||||
*/
|
||||
uint32_t avr_strtoul(const char *nptr, char **endptr, register int32_t base);
|
||||
|
||||
/**
|
||||
* atol() - parse decimal long int from ASCII
|
||||
*
|
||||
* @param p - string
|
||||
* @return int, 0 on failure
|
||||
*/
|
||||
static inline int32_t avr_atol(const char *p)
|
||||
{
|
||||
return avr_strtol(p, (char **) NULL, 10);
|
||||
}
|
||||
|
||||
/**
|
||||
* atoi() - parse decimal int from ASCII
|
||||
*
|
||||
* @param p - string
|
||||
* @return int, 0 on failure
|
||||
*/
|
||||
static inline int32_t avr_atoi(const char *p)
|
||||
{
|
||||
return avr_atol(p);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse double from ASCII
|
||||
@@ -46,14 +67,4 @@ long avr_strtol(const char *nptr, char **endptr, register int base);
|
||||
*/
|
||||
double avr_strtod (const char * nptr, char ** endptr);
|
||||
|
||||
/**
|
||||
* like strtol(), but unsigned (and hence higher max value)
|
||||
*
|
||||
* @param nptr - string to parse
|
||||
* @param endptr - NULL or pointer to string where the end will be stored (first bad char)
|
||||
* @param base - base 2, 10, 16.... 0 for auto
|
||||
* @return the number
|
||||
*/
|
||||
unsigned long avr_strtoul(const char *nptr, char **endptr, register int base);
|
||||
|
||||
#endif //GEX_AVRLIBC_H_H
|
||||
|
||||
+1
-1
@@ -190,7 +190,7 @@ static size_t dopr(char *buffer, size_t maxlen, const char *format, va_list args
|
||||
{
|
||||
char ch;
|
||||
LLONG value;
|
||||
LDOUBLE fvalue;
|
||||
LDOUBLE fvalue = 0;
|
||||
char *strvalue;
|
||||
int min;
|
||||
int max;
|
||||
|
||||
@@ -5,110 +5,3 @@
|
||||
#include "str_utils.h"
|
||||
#include "platform.h"
|
||||
#include "avrlibc.h"
|
||||
|
||||
bool str_parse_yn(const char *str, bool *suc)
|
||||
{
|
||||
// TODO implement strcasecmp without the locale crap from newlib and use it here
|
||||
if (streq(str, "Y")) return true;
|
||||
if (streq(str, "N")) return false;
|
||||
|
||||
if (streq(str, "1")) return true;
|
||||
if (streq(str, "0")) return false;
|
||||
|
||||
if (streq(str, "YES")) return true;
|
||||
if (streq(str, "NO")) return false;
|
||||
|
||||
*suc = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t str_parse_01(const char *str, const char *a, const char *b, bool *suc)
|
||||
{
|
||||
if (streq(str, a)) return 0;
|
||||
if (streq(str, b)) return 1;
|
||||
|
||||
*suc = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t str_parse_012(const char *str, const char *a, const char *b, const char *c, bool *suc)
|
||||
{
|
||||
if (streq(str, a)) return 0;
|
||||
if (streq(str, b)) return 1;
|
||||
if (streq(str, c)) return 2;
|
||||
|
||||
*suc = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Convert number to one of 2 options */
|
||||
const char *str_2(uint32_t n,
|
||||
uint32_t na, const char *a,
|
||||
uint32_t nb, const char *b)
|
||||
{
|
||||
if (n == nb) return b;
|
||||
return a;
|
||||
}
|
||||
|
||||
/** Convert number to one of 3 options */
|
||||
const char *str_3(uint32_t n,
|
||||
uint32_t na, const char *a,
|
||||
uint32_t nb, const char *b,
|
||||
uint32_t nc, const char *c)
|
||||
{
|
||||
if (n == nb) return b;
|
||||
if (n == nc) return c;
|
||||
return a;
|
||||
}
|
||||
|
||||
/** Convert number to one of 4 options */
|
||||
const char *str_4(uint32_t n,
|
||||
uint32_t na, const char *a,
|
||||
uint32_t nb, const char *b,
|
||||
uint32_t nc, const char *c,
|
||||
uint32_t nd, const char *d)
|
||||
{
|
||||
if (n == nb) return b;
|
||||
if (n == nc) return c;
|
||||
if (n == nd) return d;
|
||||
return a;
|
||||
}
|
||||
|
||||
uint32_t str_parse_2(const char *value,
|
||||
const char *a, uint32_t na,
|
||||
const char *b, uint32_t nb,
|
||||
bool *suc)
|
||||
{
|
||||
if (streq(value, a)) return na;
|
||||
if (streq(value, b)) return nb;
|
||||
*suc = false;
|
||||
return na;
|
||||
}
|
||||
|
||||
uint32_t str_parse_3(const char *value,
|
||||
const char *a, uint32_t na,
|
||||
const char *b, uint32_t nb,
|
||||
const char *c, uint32_t nc,
|
||||
bool *suc)
|
||||
{
|
||||
if (streq(value, a)) return na;
|
||||
if (streq(value, b)) return nb;
|
||||
if (streq(value, c)) return nc;
|
||||
*suc = false;
|
||||
return na;
|
||||
}
|
||||
|
||||
uint32_t str_parse_4(const char *value,
|
||||
const char *a, uint32_t na,
|
||||
const char *b, uint32_t nb,
|
||||
const char *c, uint32_t nc,
|
||||
const char *d, uint32_t nd,
|
||||
bool *suc)
|
||||
{
|
||||
if (streq(value, a)) return na;
|
||||
if (streq(value, b)) return nb;
|
||||
if (streq(value, c)) return nc;
|
||||
if (streq(value, d)) return nd;
|
||||
*suc = false;
|
||||
return na;
|
||||
}
|
||||
|
||||
@@ -103,55 +103,4 @@ last_char(const char *str)
|
||||
return str[strlen(str) - 1];
|
||||
}
|
||||
|
||||
/** Parse Y/N to bool */
|
||||
bool str_parse_yn(const char *str, bool *suc);
|
||||
|
||||
/** Compare string with two options */
|
||||
uint8_t str_parse_01(const char *str, const char *a, const char *b, bool *suc);
|
||||
|
||||
/** Compare string with three options */
|
||||
uint8_t str_parse_012(const char *str, const char *a, const char *b, const char *c, bool *suc);
|
||||
|
||||
/** Convert number to one of 4 options */
|
||||
const char *str_2(uint32_t n,
|
||||
uint32_t na, const char *a,
|
||||
uint32_t nb, const char *b);
|
||||
|
||||
/** Convert number to one of 4 options */
|
||||
const char *str_3(uint32_t n,
|
||||
uint32_t na, const char *a,
|
||||
uint32_t nb, const char *b,
|
||||
uint32_t nc, const char *c);
|
||||
|
||||
/** Convert number to one of 4 options */
|
||||
const char *str_4(uint32_t n,
|
||||
uint32_t na, const char *a,
|
||||
uint32_t nb, const char *b,
|
||||
uint32_t nc, const char *c,
|
||||
uint32_t nd, const char *d);
|
||||
|
||||
/** Convert string to one of two numeric options */
|
||||
uint32_t str_parse_2(const char *tpl,
|
||||
const char *a, uint32_t na,
|
||||
const char *b, uint32_t nb,
|
||||
bool *suc);
|
||||
|
||||
/** Convert string to one of three numeric options */
|
||||
uint32_t str_parse_3(const char *tpl,
|
||||
const char *a, uint32_t na,
|
||||
const char *b, uint32_t nb,
|
||||
const char *c, uint32_t nc,
|
||||
bool *suc);
|
||||
|
||||
/** Convert string to one of four numeric options */
|
||||
uint32_t str_parse_4(const char *tpl,
|
||||
const char *a, uint32_t na,
|
||||
const char *b, uint32_t nb,
|
||||
const char *c, uint32_t nc,
|
||||
const char *d, uint32_t nd,
|
||||
bool *suc);
|
||||
|
||||
/** Convert bool to a Y or N constant string */
|
||||
#define str_yn(cond) ((cond) ? ("Y") : ("N"))
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user