From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Paul Eggert Newsgroups: gmane.emacs.devel Subject: Re: memcmp, memcpy, memmove, memset Date: Wed, 06 Jul 2011 18:41:47 -0700 Organization: UCLA Computer Science Department Message-ID: <4E150EDB.2030707@cs.ucla.edu> References: <4E12C2BE.1050609@cs.ucla.edu> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Trace: dough.gmane.org 1310002940 17767 80.91.229.12 (7 Jul 2011 01:42:20 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Thu, 7 Jul 2011 01:42:20 +0000 (UTC) To: Emacs Development Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Jul 07 03:42:16 2011 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Qedbb-0005u9-NP for ged-emacs-devel@m.gmane.org; Thu, 07 Jul 2011 03:42:16 +0200 Original-Received: from localhost ([::1]:53827 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qedba-0007nS-Sd for ged-emacs-devel@m.gmane.org; Wed, 06 Jul 2011 21:42:15 -0400 Original-Received: from eggs.gnu.org ([140.186.70.92]:36056) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QedbI-0007nL-Qt for emacs-devel@gnu.org; Wed, 06 Jul 2011 21:41:58 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QedbH-0004WD-59 for emacs-devel@gnu.org; Wed, 06 Jul 2011 21:41:56 -0400 Original-Received: from smtp.cs.ucla.edu ([131.179.128.62]:33158) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QedbG-0004W9-Ka for emacs-devel@gnu.org; Wed, 06 Jul 2011 21:41:55 -0400 Original-Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.cs.ucla.edu (Postfix) with ESMTP id 8BAB539E8116 for ; Wed, 6 Jul 2011 18:41:53 -0700 (PDT) X-Virus-Scanned: amavisd-new at smtp.cs.ucla.edu Original-Received: from smtp.cs.ucla.edu ([127.0.0.1]) by localhost (smtp.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 64xbFxAXtYbv for ; Wed, 6 Jul 2011 18:41:52 -0700 (PDT) Original-Received: from [192.168.1.10] (pool-71-189-109-235.lsanca.fios.verizon.net [71.189.109.235]) by smtp.cs.ucla.edu (Postfix) with ESMTPSA id 8A20B39E810A for ; Wed, 6 Jul 2011 18:41:52 -0700 (PDT) User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110516 Thunderbird/3.1.10 In-Reply-To: <4E12C2BE.1050609@cs.ucla.edu> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 131.179.128.62 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:141715 Archived-At: While I'm on the subject of cleaning out old pre-C89 cruft that complicates maintenance a bit, I thought I'd also remove the old replacements for string.h, stdlib.h, stddef.h, limits.h, and float.h, as all plausible Emacs porting targets have supported these for many years. So I'd like to install the following patch after a bit more testing. This removes several lines from the Windows port, but in a way that I expect will be safe. === modified file 'ChangeLog' --- ChangeLog 2011-07-06 23:34:39 +0000 +++ ChangeLog 2011-07-07 01:32:56 +0000 @@ -1,3 +1,12 @@ +2011-07-07 Paul Eggert + + Assume freestanding C89 headers, string.h, stdlib.h. + Again, this simplifies the code, and all current platforms have these. + * configure.in (AC_CHECK_HEADERS): Don't check for limits.h. + (AC_HEADER_STDC): Remove. + (AC_CHECK_FUNCS): No need to check for strchr, strrchr. + (strchr, strrchr): Remove fallback macros. + 2011-07-06 Paul Eggert Assume support for memcmp, memcpy, memmove, memset. === modified file 'configure.in' --- configure.in 2011-07-06 23:34:39 +0000 +++ configure.in 2011-07-07 01:32:56 +0000 @@ -1211,7 +1211,7 @@ dnl checks for header files AC_CHECK_HEADERS(sys/select.h sys/time.h unistd.h utime.h \ - linux/version.h sys/systeminfo.h limits.h \ + linux/version.h sys/systeminfo.h \ stdio_ext.h fcntl.h coff.h pty.h sys/mman.h \ sys/vlimit.h sys/resource.h locale.h sys/_mbstate_t.h \ sys/utsname.h pwd.h utmp.h dirent.h util.h) @@ -1230,7 +1230,6 @@ dnl On Solaris 8 there's a compilation warning for term.h because dnl it doesn't define `bool'. AC_CHECK_HEADERS(term.h, , , -) -AC_HEADER_STDC AC_HEADER_TIME AC_CHECK_DECLS([sys_siglist]) if test $ac_cv_have_decl_sys_siglist != yes; then @@ -2702,7 +2701,7 @@ random lrand48 logb frexp fmod rint cbrt ftime setsid \ strerror fpathconf select euidaccess getpagesize tzset setlocale \ utimes getrlimit setrlimit setpgid getcwd getwd shutdown getaddrinfo \ -__fpending mblen mbrlen mbsinit strsignal setitimer ualarm strchr strrchr \ +__fpending mblen mbrlen mbsinit strsignal setitimer ualarm \ sendto recvfrom getsockopt setsockopt getsockname getpeername \ gai_strerror mkstemp getline getdelim mremap fsync sync \ difftime mempcpy mblen mbrlen posix_memalign \ @@ -3582,14 +3581,6 @@ #include #include -#ifndef HAVE_STRCHR -#define strchr(a, b) index (a, b) -#endif - -#ifndef HAVE_STRRCHR -#define strrchr(a, b) rindex (a, b) -#endif - #if defined __GNUC__ && (__GNUC__ > 2 \ || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) #define NO_RETURN __attribute__ ((__noreturn__)) === modified file 'lib-src/ChangeLog' --- lib-src/ChangeLog 2011-07-06 23:34:39 +0000 +++ lib-src/ChangeLog 2011-07-07 01:32:56 +0000 @@ -1,5 +1,13 @@ 2011-07-06 Paul Eggert + Assume freestanding C89 headers, string.h, stdlib.h. + * ebrowse.c: Include stdlib.h unconditionally. + * etags.c, update-game-score.c: + Include string.h and stdlib.h unconditionally. + * makefile.w32-in (LOCAL_CFLAGS): Don't define STDC_HEADERS. + * movemail.c, pop.c: Include string.h unconditionally. + * update-game-score.c: No need to include stdarg.h; not used. + Assume support for memcmp, memcpy, memmove, memset. * etags.c (absolute_filename): Assume memmove exists. === modified file 'lib-src/ebrowse.c' --- lib-src/ebrowse.c 2011-03-21 18:03:15 +0000 +++ lib-src/ebrowse.c 2011-07-07 01:32:56 +0000 @@ -20,11 +20,7 @@ #include #include - -#ifdef HAVE_STDLIB_H #include -#endif - #include #include #include === modified file 'lib-src/etags.c' --- lib-src/etags.c 2011-07-05 05:27:49 +0000 +++ lib-src/etags.c 2011-07-07 01:32:56 +0000 @@ -138,9 +138,7 @@ #endif /* MSDOS */ #ifdef WINDOWSNT -# include # include -# include # include # include # define MAXPATHLEN _MAX_PATH @@ -151,27 +149,6 @@ # define HAVE_GETCWD # endif /* undef HAVE_GETCWD */ #else /* not WINDOWSNT */ -# ifdef STDC_HEADERS -# include -# include -# else /* no standard C headers */ - extern char *getenv (const char *); - extern char *strcpy (char *, const char *); - extern char *strncpy (char *, const char *, unsigned long); - extern char *strcat (char *, const char *); - extern char *strncat (char *, const char *, unsigned long); - extern int strcmp (const char *, const char *); - extern int strncmp (const char *, const char *, unsigned long); - extern int system (const char *); - extern unsigned long strlen (const char *); - extern void *malloc (unsigned long); - extern void *realloc (void *, unsigned long); - extern void exit (int); - extern void free (void *); - extern void *memmove (void *, const void *, unsigned long); -# define EXIT_SUCCESS 0 -# define EXIT_FAILURE 1 -# endif #endif /* !WINDOWSNT */ #include @@ -181,6 +158,8 @@ # endif #endif /* HAVE_UNISTD_H */ +#include +#include #include #include #include === modified file 'lib-src/makefile.w32-in' --- lib-src/makefile.w32-in 2011-05-19 06:04:16 +0000 +++ lib-src/makefile.w32-in 2011-07-07 01:32:56 +0000 @@ -21,7 +21,7 @@ .PHONY: $(ALL) -LOCAL_FLAGS = -DWINDOWSNT -DDOS_NT -DSTDC_HEADERS=1 -DNO_LDAV=1 \ +LOCAL_FLAGS = -DWINDOWSNT -DDOS_NT -DNO_LDAV=1 \ -DNO_ARCHIVES=1 -DHAVE_CONFIG_H=1 -I../lib \ -I../nt/inc -I../src === modified file 'lib-src/movemail.c' --- lib-src/movemail.c 2011-06-10 17:50:07 +0000 +++ lib-src/movemail.c 2011-07-07 01:32:56 +0000 @@ -68,9 +68,7 @@ #ifdef HAVE_FCNTL_H #include #endif -#ifdef HAVE_STRING_H #include -#endif #include "syswait.h" #ifdef MAIL_USE_POP #include "pop.h" === modified file 'lib-src/pop.c' --- lib-src/pop.c 2011-04-16 22:32:35 +0000 +++ lib-src/pop.c 2011-07-07 01:32:56 +0000 @@ -65,9 +65,7 @@ #include #include #include -#ifdef STDC_HEADERS #include -#endif #include #ifdef KERBEROS === modified file 'lib-src/update-game-score.c' --- lib-src/update-game-score.c 2011-03-21 07:46:53 +0000 +++ lib-src/update-game-score.c 2011-07-07 01:32:56 +0000 @@ -35,12 +35,8 @@ #include #include -#ifdef HAVE_STRING_H #include -#endif -#ifdef HAVE_STDLIB_H #include -#endif #include #include #include @@ -48,9 +44,6 @@ #ifdef HAVE_FCNTL_H #include #endif -#ifdef STDC_HEADERS -#include -#endif #include /* Needed for SunOS4, for instance. */ === modified file 'nt/ChangeLog' --- nt/ChangeLog 2011-06-07 12:35:48 +0000 +++ nt/ChangeLog 2011-07-07 01:32:56 +0000 @@ -1,3 +1,10 @@ +2011-07-07 Paul Eggert + + Assume freestanding C89 headers, string.h, stdlib.h. + * config.nt (HAVE_LIMITS_H, HAVE_STRING_H, HAVE_STDLIB_H) + (STDC_HEADERS): Remove. + Iinclude string.h, stdlib.h unconditionally. + 2011-06-07 Eli Zaretskii * inc/stdint.h (INT32_MAX, INT64_MAX, INTPTR_MAX, PTRDIFF_MAX) === modified file 'nt/config.nt' --- nt/config.nt 2011-05-28 22:39:39 +0000 +++ nt/config.nt 2011-07-07 01:32:56 +0000 @@ -131,12 +131,8 @@ #undef HAVE_LINUX_VERSION_H #undef HAVE_SYS_SYSTEMINFO_H #undef HAVE_TERMIOS_H -#undef HAVE_LIMITS_H -#undef HAVE_STRING_H #undef HAVE_STRINGS_H -#undef HAVE_STDLIB_H #undef HAVE_PWD_H -#undef STDC_HEADERS #undef HAVE_LIBDNET #undef HAVE_LIBPTHREADS @@ -506,15 +502,11 @@ #define PROTOTYPES 1 #endif -#ifdef HAVE_STRING_H #include "string.h" -#endif #ifdef HAVE_STRINGS_H #include "strings.h" #endif -#ifdef HAVE_STDLIB_H #include -#endif #ifndef NO_RETURN #if defined __GNUC__ && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR >= 5)) === modified file 'src/ChangeLog' --- src/ChangeLog 2011-07-06 23:34:39 +0000 +++ src/ChangeLog 2011-07-07 01:32:56 +0000 @@ -1,3 +1,17 @@ +2011-07-07 Paul Eggert + + Assume freestanding C89 headers, string.h, stdlib.h. + * data.c, doprnt.c, floatfns.c, print.c: + Include float.h unconditionally. + * gmalloc.c: Assume C89-at-least behavior for preprocessor, + limits.h, stddef.h, string.h. Use memset instead of 'flood'. + * regex.c: Likewise for stddef.h, string.h. + (ISASCII): Remove; can assume it returns 1 now. All uses removed. + * s/aix4-2.h (HAVE_STRING_H): Remove obsolete undef. + * s/ms-w32.h (HAVE_LIMITS_H, HAVE_STRING_H, HAVE_STDLIB_H) + (STDC_HEADERS): Remove obsolete defines. + * sysdep.c: Include limits.h unconditionally. + 2011-07-06 Paul Eggert Assume support for memcmp, memcpy, memmove, memset. === modified file 'src/data.c' --- src/data.c 2011-06-19 18:44:58 +0000 +++ src/data.c 2011-07-07 01:32:56 +0000 @@ -35,10 +35,7 @@ #include "termhooks.h" /* For FRAME_KBOARD reference in y-or-n-p. */ #include "font.h" -#ifdef STDC_HEADERS #include -#endif - /* If IEEE_FLOATING_POINT isn't defined, default it from FLT_*. */ #ifndef IEEE_FLOATING_POINT #if (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \ === modified file 'src/doprnt.c' --- src/doprnt.c 2011-06-14 20:09:52 +0000 +++ src/doprnt.c 2011-07-07 01:32:56 +0000 @@ -102,13 +102,8 @@ #include #include #include - -#ifdef STDC_HEADERS #include -#endif - #include - #include #include "lisp.h" === modified file 'src/floatfns.c' --- src/floatfns.c 2011-06-13 02:27:16 +0000 +++ src/floatfns.c 2011-07-07 01:32:56 +0000 @@ -53,10 +53,7 @@ #include "lisp.h" #include "syssignal.h" -#if STDC_HEADERS #include -#endif - /* If IEEE_FLOATING_POINT isn't defined, default it from FLT_*. */ #ifndef IEEE_FLOATING_POINT #if (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \ === modified file 'src/gmalloc.c' --- src/gmalloc.c 2011-07-05 05:27:49 +0000 +++ src/gmalloc.c 2011-07-07 01:32:56 +0000 @@ -41,28 +41,13 @@ #define USE_PTHREAD #endif -#if ((defined __cplusplus || (defined (__STDC__) && __STDC__) \ - || defined STDC_HEADERS || defined PROTOTYPES)) #undef PP #define PP(args) args #undef __ptr_t #define __ptr_t void * -#else /* Not C++ or ANSI C. */ -#undef PP -#define PP(args) () -#undef __ptr_t -#define __ptr_t char * -#endif /* C++ or ANSI C. */ #include - -#ifdef HAVE_LIMITS_H #include -#endif -#ifndef CHAR_BIT -#define CHAR_BIT 8 -#endif - #include #ifdef USE_PTHREAD @@ -77,26 +62,9 @@ { #endif -#ifdef STDC_HEADERS #include #define __malloc_size_t size_t #define __malloc_ptrdiff_t ptrdiff_t -#else -#ifdef __GNUC__ -#include -#ifdef __SIZE_TYPE__ -#define __malloc_size_t __SIZE_TYPE__ -#endif -#endif -#ifndef __malloc_size_t -#define __malloc_size_t unsigned int -#endif -#define __malloc_ptrdiff_t int -#endif - -#ifndef NULL -#define NULL 0 -#endif /* Allocate SIZE bytes of memory. */ @@ -1881,22 +1849,6 @@ unsigned long int magic; /* Magic number to check header integrity. */ }; -#if defined(_LIBC) || defined(STDC_HEADERS) || defined(USG) -#define flood memset -#else -static void flood (__ptr_t, int, __malloc_size_t); -static void -flood (ptr, val, size) - __ptr_t ptr; - int val; - __malloc_size_t size; -{ - char *cp = ptr; - while (size--) - *cp++ = val; -} -#endif - static enum mcheck_status checkhdr (const struct hdr *); static enum mcheck_status checkhdr (hdr) @@ -1935,7 +1887,7 @@ hdr = ((struct hdr *) ptr) - 1; checkhdr (hdr); hdr->magic = MAGICFREE; - flood (ptr, FREEFLOOD, hdr->size); + memset (ptr, FREEFLOOD, hdr->size); } else hdr = NULL; @@ -1961,7 +1913,7 @@ hdr->size = size; hdr->magic = MAGICWORD; ((char *) &hdr[1])[size] = MAGICBYTE; - flood ((__ptr_t) (hdr + 1), MALLOCFLOOD, size); + memset ((__ptr_t) (hdr + 1), MALLOCFLOOD, size); return (__ptr_t) (hdr + 1); } @@ -1981,7 +1933,7 @@ checkhdr (hdr); if (size < osize) - flood ((char *) ptr + size, FREEFLOOD, osize - size); + memset ((char *) ptr + size, FREEFLOOD, osize - size); } __free_hook = old_free_hook; @@ -1998,7 +1950,7 @@ hdr->magic = MAGICWORD; ((char *) &hdr[1])[size] = MAGICBYTE; if (size > osize) - flood ((char *) (hdr + 1) + osize, MALLOCFLOOD, size - osize); + memset ((char *) (hdr + 1) + osize, MALLOCFLOOD, size - osize); return (__ptr_t) (hdr + 1); } === modified file 'src/print.c' --- src/print.c 2011-06-24 21:25:22 +0000 +++ src/print.c 2011-07-07 01:32:56 +0000 @@ -46,10 +46,7 @@ static Lisp_Object Qfloat_output_format; #include - -#if STDC_HEADERS #include -#endif #include /* Default to values appropriate for IEEE floating point. */ === modified file 'src/regex.c' --- src/regex.c 2011-07-05 05:27:49 +0000 +++ src/regex.c 2011-07-07 01:32:56 +0000 @@ -37,9 +37,9 @@ # include #endif -#if defined STDC_HEADERS && !defined emacs -# include -#else +#include + +#ifdef emacs /* We need this for `regex.h', and perhaps for the Emacs include files. */ # include #endif @@ -346,25 +346,6 @@ #else /* not emacs */ -/* Jim Meyering writes: - - "... Some ctype macros are valid only for character codes that - isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when - using /bin/cc or gcc but without giving an ansi option). So, all - ctype uses should be through macros like ISPRINT... If - STDC_HEADERS is defined, then autoconf has verified that the ctype - macros don't need to be guarded with references to isascii. ... - Defining isascii to 1 should let any compiler worth its salt - eliminate the && through constant folding." - Solaris defines some of these symbols so we must undefine them first. */ - -# undef ISASCII -# if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII) -# define ISASCII(c) 1 -# else -# define ISASCII(c) isascii(c) -# endif - /* 1 if C is an ASCII character. */ # define IS_REAL_ASCII(c) ((c) < 0200) @@ -372,27 +353,28 @@ # define ISUNIBYTE(c) 1 # ifdef isblank -# define ISBLANK(c) (ISASCII (c) && isblank (c)) +# define ISBLANK(c) isblank (c) # else # define ISBLANK(c) ((c) == ' ' || (c) == '\t') # endif # ifdef isgraph -# define ISGRAPH(c) (ISASCII (c) && isgraph (c)) +# define ISGRAPH(c) isgraph (c) # else -# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c)) +# define ISGRAPH(c) (isprint (c) && !isspace (c)) # endif +/* Solaris defines ISPRINT so we must undefine it first. */ # undef ISPRINT -# define ISPRINT(c) (ISASCII (c) && isprint (c)) -# define ISDIGIT(c) (ISASCII (c) && isdigit (c)) -# define ISALNUM(c) (ISASCII (c) && isalnum (c)) -# define ISALPHA(c) (ISASCII (c) && isalpha (c)) -# define ISCNTRL(c) (ISASCII (c) && iscntrl (c)) -# define ISLOWER(c) (ISASCII (c) && islower (c)) -# define ISPUNCT(c) (ISASCII (c) && ispunct (c)) -# define ISSPACE(c) (ISASCII (c) && isspace (c)) -# define ISUPPER(c) (ISASCII (c) && isupper (c)) -# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c)) +# define ISPRINT(c) isprint (c) +# define ISDIGIT(c) isdigit (c) +# define ISALNUM(c) isalnum (c) +# define ISALPHA(c) isalpha (c) +# define ISCNTRL(c) iscntrl (c) +# define ISLOWER(c) islower (c) +# define ISPUNCT(c) ispunct (c) +# define ISSPACE(c) isspace (c) +# define ISUPPER(c) isupper (c) +# define ISXDIGIT(c) isxdigit (c) # define ISWORD(c) ISALPHA(c) @@ -439,10 +421,6 @@ #endif /* not emacs */ -#ifndef NULL -# define NULL (void *)0 -#endif - /* We remove any previous definition of `SIGN_EXTEND_CHAR', since ours (we hope) works properly with all combinations of machines, compilers, `char' and `unsigned char' argument types. === modified file 'src/s/aix4-2.h' --- src/s/aix4-2.h 2011-03-17 05:15:08 +0000 +++ src/s/aix4-2.h 2011-07-07 01:32:56 +0000 @@ -47,11 +47,6 @@ /* AIX doesn't define this. */ #define unix 1 -/* string.h defines rindex as a macro, at least with native cc, so we - lose declaring char * rindex without this. - It is just a guess which versions of AIX need this definition. */ -#undef HAVE_STRING_H - /* Perry Smith says these are correct. */ #define SIGNALS_VIA_CHARACTERS #define CLASH_DETECTION === modified file 'src/s/ms-w32.h' --- src/s/ms-w32.h 2011-04-23 03:07:16 +0000 +++ src/s/ms-w32.h 2011-07-07 01:32:56 +0000 @@ -111,11 +111,7 @@ #undef HAVE_UTIME_H #undef HAVE_LINUX_VERSION_H #undef HAVE_SYS_SYSTEMINFO_H -#define HAVE_LIMITS_H 1 -#define HAVE_STRING_H 1 -#define HAVE_STDLIB_H 1 #define HAVE_PWD_H 1 -#define STDC_HEADERS 1 #define TIME_WITH_SYS_TIME 1 #define HAVE_GETTIMEOFDAY 1 @@ -386,4 +382,3 @@ /* ============================================================ */ - === modified file 'src/sysdep.c' --- src/sysdep.c 2011-07-05 05:27:49 +0000 +++ src/sysdep.c 2011-07-07 01:32:56 +0000 @@ -26,9 +26,7 @@ #include #include #endif /* HAVE_PWD_H */ -#ifdef HAVE_LIMITS_H #include -#endif /* HAVE_LIMITS_H */ #include #include