X-Git-Url: https://git.distorted.org.uk/~mdw/anag/blobdiff_plain/a10122de085ddf5c8bec6fc12c7164ad1dc1459c..7c2b74abc8bbc3b009a233b65d4f8aa23219892d:/anag.h diff --git a/anag.h b/anag.h index 97c4bef..6763d0f 100644 --- a/anag.h +++ b/anag.h @@ -1,13 +1,11 @@ /* -*-c-*- * - * $Id: anag.h,v 1.2 2002/08/11 12:58:09 mdw Exp $ - * * External definitions for Anag * * (c) 2001 Mark Wooding */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of Anag: a simple wordgame helper. * @@ -15,29 +13,17 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * Anag 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 General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with Anag; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: anag.h,v $ - * Revision 1.2 2002/08/11 12:58:09 mdw - * Added support for regular expression matching, if supported by the C - * library. - * - * Revision 1.1 2001/02/04 17:14:42 mdw - * Initial checkin - * - */ - #ifndef ANAG_H #define ANAG_H @@ -58,6 +44,36 @@ #include #include +/*----- Preliminaries -----------------------------------------------------*/ + +#if defined(__GNUC__) +# define GCC_VERSION_P(maj, min) \ + (__GNUC__ > (maj) || (__GNUC__ == (maj) && __GNUC_MINOR__ >= (min))) +#else +# define GCC_VERSION_P(maj, min) 0 +#endif + +#ifdef __clang__ +# define CLANG_VERSION_P(maj, min) \ + (__clang_major__ > (maj) || (__clang_major__ == (maj) && \ + __clang_minor__ >= (min))) +#else +# define CLANG_VERSION_P(maj, min) 0 +#endif + +#if GCC_VERSION_P(2, 5) || CLANG_VERSION_P(3, 3) +# define NORETURN __attribute__((noreturn)) +# define PRINTF_LIKE(fix, aix) __attribute__((format(printf, fix, aix))) +#endif + +#ifndef NORETURN +# define NORETURN +#endif + +#ifndef PRINTF_LIKE +# define PRINTF_LIKE +#endif + /*----- Data structures ---------------------------------------------------*/ typedef struct node { @@ -78,7 +94,21 @@ extern node *anagram(const char *const */*av*/); extern node *subgram(const char *const */*av*/); extern node *wildcard(const char *const */*av*/); extern node *trackword(const char *const */*av*/); -extern node *regexp(const char *const */*av*/); +extern node *mono(const char *const */*av*/); +#ifdef HAVE_REGCOMP + extern node *regexp(const char *const */*av*/); +#endif +#ifdef HAVE_PCRE + extern node *pcrenode(const char *const */*av*/); +#endif +extern node *longest(const char *const */*av*/); +extern node *shortest(const char *const */*av*/); + +/*----- Exit codes --------------------------------------------------------*/ + +#define EX_OK 0 +#define EX_NONE 1 +#define EX_FAIL 127 /*----- Error reporting ---------------------------------------------------*/ @@ -118,7 +148,7 @@ extern int pquis(FILE */*fp*/, const char */*p*/); * Use: Reports an error and exits. */ -extern void die(const char */*f*/, ...); +extern PRINTF_LIKE(1, 2) NORETURN void die(const char */*f*/, ...); /*----- Memory allocation -------------------------------------------------*/ @@ -199,6 +229,22 @@ extern void dstr_ensure(dstr */*d*/, size_t /*sz*/); extern int dstr_putline(dstr */*d*/, FILE */*fp*/); +/*----- Infrastructure ----------------------------------------------------*/ + +/* --- @atend_register@ --- * + * + * Arguments: @int (*func)(void *)@ = function to call + * @void *p@ = handle to pass to it + * + * Returns: --- + * + * Use: Adds a function to the list of things to do at the end of the + * program. The function should return nonzero if it produced + * any output. + */ + +extern void atend_register(int (*/*func*/)(void */*p*/), void */*p*/); + /*----- That's all, folks -------------------------------------------------*/ #ifdef __cplusplus