/*************************************************************************
* TinyFugue - programmable mud client
* Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2002, 2003, 2004, 2005, 2006-2007 Ken Keys
*
* TinyFugue (aka "tf") is protected under the terms of the GNU
* General Public License. See the file "COPYING" for details.
************************************************************************/
/* $Id: util.h,v 35004.63 2007/01/13 23:12:39 kkeys Exp $ */
#ifndef UTIL_H
#define UTIL_H
struct feature {
const char *name;
const int *flag;
};
#undef CTRL
/* convert to or from ctrl character */
#define CTRL(c) (ucase(c) ^ '@')
/* map char to or from "safe" character set */
#define mapchar(c) ((c) ? (c) & 0xFF : 0x80)
#define unmapchar(c) ((char)(((c) == (char)0x80) ? 0x0 : (c)))
/* Map character into set allowed by locale */
#define localize(c) ((is_print(c) || is_cntrl(c)) ? (c) : (c) & 0x7F)
/* Note STRNDUP works only if src[len] == '\0', ie. len == strlen(src) */
#define STRNDUP(src, len) \
(strcpy(xmalloc(NULL, (len) + 1, __FILE__, __LINE__), (src)))
#define STRDUP(src) STRNDUP((src), strlen(src))
#define IS_QUOTE 0x01
#define IS_STATMETA 0x02
#define IS_STATEND 0x04
#define IS_KEYSTART 0x08
#define IS_UNARY 0x10
#define IS_MULT 0x20
#define IS_ADDITIVE 0x40
#define IS_ASSIGNPFX 0x80
extern const struct timeval tvzero;
extern struct timeval mail_update;
extern int mail_count;
extern struct mail_info_s *maillist;
extern char tf_ctype[];
extern Stringp featurestr;
extern struct feature features[];
extern const int feature_256colors;
extern const int feature_core;
extern const int feature_float;
extern const int feature_ftime;
extern const int feature_history;
extern const int feature_IPv6;
extern const int feature_locale;
extern const int feature_MCCPv1;
extern const int feature_MCCPv2;
extern const int feature_process;
extern const int feature_SOCKS;
extern const int feature_ssl;
extern const int feature_subsecond;
extern const int feature_TZ;
#define is_quote(c) (tf_ctype[(unsigned char)c] & IS_QUOTE)
#define is_statmeta(c) (tf_ctype[(unsigned char)c] & IS_STATMETA)
#define is_statend(c) (tf_ctype[(unsigned char)c] & IS_STATEND)
#define is_keystart(c) (tf_ctype[(unsigned char)c] & IS_KEYSTART)
#define is_unary(c) (tf_ctype[(unsigned char)c] & IS_UNARY)
#define is_mult(c) (tf_ctype[(unsigned char)c] & IS_MULT)
#define is_additive(c) (tf_ctype[(unsigned char)c] & IS_ADDITIVE)
#define is_assignpfx(c) (tf_ctype[(unsigned char)c] & IS_ASSIGNPFX)
#define tvcmp(a, b) \
(((a)->tv_sec != (b)->tv_sec) ? \
((a)->tv_sec - (b)->tv_sec) : \
((a)->tv_usec - (b)->tv_usec))
#if HAVE_GETTIMEOFDAY
# define gettime(p) (gettimeofday(p, NULL))
#else
# define gettime(p) ((p)->tv_usec = 0, time(&(p)->tv_sec))
#endif
#define strtochr(s, ep) ((char)(strtol((s), (char**)ep, 0) % 0x100))
#define strtoint(s, ep) ((int)strtol((s), (char**)ep, 10))
#define strtolong(s, ep) (strtol((s), (char**)ep, 10))
extern int enum2int(const char *str, long val, conString *vec, const char *msg);
extern void init_util1(void);
extern void init_util2(void);
extern const conString* print_to_ascii(String *buf, const char *str);
extern const conString* ascii_to_print(const char *str);
extern char *cstrchr(const char *s, int c);
extern char *estrchr(const char *s, int c, int e);
extern int numarg(const char **str);
extern int nullstrcmp(const char *s, const char *t);
extern int nullcstrcmp(const char *s, const char *t);
extern int cstrncmp(const char *s, const char *t, size_t n);
extern char *stringarg(char **str, const char **end);
extern int stringliteral(struct String *dest, const char **str);
extern char *stripstr(char *s);
extern void startopt(const conString *args, const char *opts);
extern char nextopt(const char **arg, ValueUnion *u, int *type, int *offp);
#if HAVE_TZSET
extern int ch_timezone(Var *var);
#else
# define ch_timezone NULL
#endif
extern int ch_locale(Var *var);
extern int ch_mailfile(Var *var);
extern int ch_maildelay(Var *var);
extern void check_mail(void);
extern type_t string_arithmetic_type(const char *str, int typeset);
extern Value *parsenumber(const char *str, const char **caller_endp,
int typeset, Value *val);
extern long parsetime(const char *str, char **endp, int *istime);
extern void abstime(struct timeval *tv);
extern void append_usec(String *buf, long usec, int truncflag);
extern void tftime(String *buf, const conString *fmt,
const struct timeval *tv);
extern void tvsub(struct timeval *a, const struct timeval *b,
const struct timeval *c);
extern void tvadd(struct timeval *a, const struct timeval *b,
const struct timeval *c);
extern void die(const char *why, int err) NORET;
#if USE_DMALLOC
extern void free_util(void);
#endif
#endif /* UTIL_H */