changeset 10667:678640901735

Move the isnanf(), isnand(), isnanl() declarations to <math.h>.
author Bruno Haible <bruno@clisp.org>
date Sun, 19 Oct 2008 14:05:30 +0200
parents d162e4057aa8
children 26ed9785f377
files ChangeLog NEWS lib/atanl.c lib/cosl.c lib/isnand.h lib/isnanf.h lib/isnanl.h lib/ldexpl.c lib/logl.c lib/math.in.h lib/sinl.c lib/sqrtl.c lib/tanl.c m4/isnand.m4 m4/isnanf.m4 m4/isnanl.m4 m4/math_h.m4 modules/isnand modules/isnanf modules/isnanl modules/math tests/test-isnand.c tests/test-isnanf.c tests/test-isnanl.c
diffstat 24 files changed, 160 insertions(+), 136 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,47 @@
+2008-10-18  Bruno Haible  <bruno@clisp.org>
+
+	* lib/atanl.c: Don't include isnanl.h.
+	* lib/cosl.c: Likewise.
+	* lib/ldexpl.c: Likewise.
+	* lib/logl.c: Likewise.
+	* lib/sinl.c: Likewise.
+	* lib/sqrtl.c: Likewise.
+	* lib/tanl.c: Likewise.
+
+	Move the isnanf(), isnand(), isnanl() declarations to <math.h>.
+	* lib/isnanf.h: Remove file.
+	* lib/isnand.h: Remove file.
+	* lib/isnanl.h: Remove file.
+	* lib/math.in.h: Include the contents of lib/isnanf.h, lib/isnand.h,
+	lib/isnanl.h. Use HAVE_ISNANF, HAVE_ISNAND, HAVE_ISNANL as substituted
+	macros.
+	* m4/isnanf.m4 (gl_FUNC_ISNANF): Require gl_MATH_H_DEFAULTS. Set
+	HAVE_ISNANF, don't define it as a C macro.
+	* m4/isnand.m4 (gl_FUNC_ISNAND): Require gl_MATH_H_DEFAULTS. Set
+	HAVE_ISNAND, don't define it as a C macro.
+	* m4/isnanl.m4 (gl_FUNC_ISNANL): Require gl_MATH_H_DEFAULTS. Set
+	HAVE_ISNANL, don't define it as a C macro.
+	* m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize GNULIB_ISNAN[FDL] and
+	HAVE_ISNAN[FDL].
+	* modules/isnanf (Files): Remove lib/isnanf.h.
+	(Depends-on): Add math.
+	(configure.ac): Invoke gl_MATH_MODULE_INDICATOR.
+	(Include): Specify <math.h> instead of isnanf.h.
+	* modules/isnand (Files): Remove lib/isnand.h.
+	(Depends-on): Add math.
+	(configure.ac): Invoke gl_MATH_MODULE_INDICATOR.
+	(Include): Specify <math.h> instead of isnand.h.
+	* modules/isnanl (Files): Remove lib/isnanl.h.
+	(Depends-on): Add math.
+	(configure.ac): Invoke gl_MATH_MODULE_INDICATOR.
+	(Include): Specify <math.h> instead of isnanl.h.
+	* modules/math (Makefile.am): Substitute GNULIB_ISNAN[FDL] and
+	HAVE_ISNAN[FDL].
+	* tests/test-isnanf.c: Include <math.h> instead of isnanf.h.
+	* tests/test-isnand.c: Include <math.h> instead of isnand.h.
+	* tests/test-isnanl.c: Include <math.h> instead of isnanl.h.
+	* NEWS: Mention the change.
+
 2008-10-18  Bruno Haible  <bruno@clisp.org>
 
 	Add getusershell(), setusershell(), endusershell() declarations to
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,13 @@
 
 Date        Modules         Changes
 
+2008-10-19  isnanf          The include file is changed from "isnanf.h" to
+                            <math.h>.
+            isnand          The include file is changed from "isnand.h" to
+                            <math.h>.
+            isnanl          The include file is changed from "isnanl.h" to
+                            <math.h>.
+
 2008-10-18  lchmod          The include file is changed from "lchmod.h" to
                             <sys/stat.h>.
 
--- a/lib/atanl.c
+++ b/lib/atanl.c
@@ -62,8 +62,6 @@
  *
  */
 
-#include "isnanl.h"
-
 /* arctan(k/8), k = 0, ..., 82 */
 static const long double atantbl[84] = {
   0.0000000000000000000000000000000000000000E0L,
--- a/lib/cosl.c
+++ b/lib/cosl.c
@@ -54,7 +54,6 @@
 #include "trigl.c"
 #include "sincosl.c"
 #endif
-#include "isnanl.h"
 
 long double cosl(long double x)
 {
deleted file mode 100644
--- a/lib/isnand.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Test for NaN.
-   Copyright (C) 2007-2008 Free Software Foundation, Inc.
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#if HAVE_ISNAND
-/* Get declaration of isnan macro.  */
-# include <math.h>
-# if __GNUC__ >= 4
-   /* GCC 4.0 and newer provides three built-ins for isnan.  */
-#  undef isnand
-#  define isnand(x) __builtin_isnan ((double)(x))
-# else
-#  undef isnand
-#  define isnand(x) isnan ((double)(x))
-# endif
-#else
-/* Test whether X is a NaN.  */
-# undef isnand
-# define isnand rpl_isnand
-extern int isnand (double x);
-#endif
deleted file mode 100644
--- a/lib/isnanf.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Test for NaN.
-   Copyright (C) 2007-2008 Free Software Foundation, Inc.
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#if HAVE_ISNANF
-/* Get declaration of isnan macro or (older) isnanf function.  */
-# include <math.h>
-# if __GNUC__ >= 4
-   /* GCC 4.0 and newer provides three built-ins for isnan.  */
-#  undef isnanf
-#  define isnanf(x) __builtin_isnanf ((float)(x))
-# elif defined isnan
-#  undef isnanf
-#  define isnanf(x) isnan ((float)(x))
-# endif
-#else
-/* Test whether X is a NaN.  */
-# undef isnanf
-# define isnanf rpl_isnanf
-extern int isnanf (float x);
-#endif
deleted file mode 100644
--- a/lib/isnanl.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Test for NaN.
-   Copyright (C) 2007-2008 Free Software Foundation, Inc.
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#if HAVE_ISNANL
-/* Get declaration of isnan macro or (older) isnanl function.  */
-# include <math.h>
-# if __GNUC__ >= 4
-   /* GCC 4.0 and newer provides three built-ins for isnan.  */
-#  undef isnanl
-#  define isnanl(x) __builtin_isnanl ((long double)(x))
-# elif defined isnan
-#  undef isnanl
-#  define isnanl(x) isnan ((long double)(x))
-# endif
-#else
-/* Test whether X is a NaN.  */
-# undef isnanl
-# define isnanl rpl_isnanl
-extern int isnanl (long double x);
-#endif
--- a/lib/ldexpl.c
+++ b/lib/ldexpl.c
@@ -1,7 +1,7 @@
 /* Emulation for ldexpl.
    Contributed by Paolo Bonzini
 
-   Copyright 2002, 2003, 2007 Free Software Foundation, Inc.
+   Copyright 2002, 2003, 2007, 2008 Free Software Foundation, Inc.
 
    This file is part of gnulib.
 
@@ -25,7 +25,6 @@
 
 #include <float.h>
 #include "fpucw.h"
-#include "isnanl.h"
 
 long double
 ldexpl(long double x, int exp)
--- a/lib/logl.c
+++ b/lib/logl.c
@@ -62,8 +62,6 @@
  *
  */
 
-#include "isnanl.h"
-
 /* log(1+x) = x - .5 x^2 + x^3 l(x)
    -.0078125 <= x <= +.0078125
    peak relative error 1.2e-37 */
--- a/lib/math.in.h
+++ b/lib/math.in.h
@@ -401,25 +401,92 @@
 #endif
 
 
+#if @GNULIB_ISNANF@
+/* Test for NaN for 'float' numbers.  */
+# if @HAVE_ISNANF@
+/* The original <math.h> included above provides a declaration of isnan macro
+   or (older) isnanf function.  */
+#  include <math.h>
+#  if __GNUC__ >= 4
+    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#   undef isnanf
+#   define isnanf(x) __builtin_isnanf ((float)(x))
+#  elif defined isnan
+#   undef isnanf
+#   define isnanf(x) isnan ((float)(x))
+#  endif
+# else
+/* Test whether X is a NaN.  */
+#  undef isnanf
+#  define isnanf rpl_isnanf
+extern int isnanf (float x);
+# endif
+#endif
+
+#if @GNULIB_ISNAND@
+/* Test for NaN for 'double' numbers.
+   This function is a gnulib extension, unlike isnan() which applied only
+   to 'double' numbers earlier but now is a type-generic macro.  */
+# if @HAVE_ISNAND@
+/* The original <math.h> included above provides a declaration of isnan macro.  */
+#  include <math.h>
+#  if __GNUC__ >= 4
+    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#   undef isnand
+#   define isnand(x) __builtin_isnan ((double)(x))
+#  else
+#   undef isnand
+#   define isnand(x) isnan ((double)(x))
+#  endif
+# else
+/* Test whether X is a NaN.  */
+#  undef isnand
+#  define isnand rpl_isnand
+extern int isnand (double x);
+# endif
+#endif
+
+#if @GNULIB_ISNANL@
+/* Test for NaN for 'long double' numbers.  */
+# if @HAVE_ISNANL@
+/* The original <math.h> included above provides a declaration of isnan macro or (older) isnanl function.  */
+#  include <math.h>
+#  if __GNUC__ >= 4
+    /* GCC 4.0 and newer provides three built-ins for isnan.  */
+#   undef isnanl
+#   define isnanl(x) __builtin_isnanl ((long double)(x))
+#  elif defined isnan
+#   undef isnanl
+#   define isnanl(x) isnan ((long double)(x))
+#  endif
+# else
+/* Test whether X is a NaN.  */
+#  undef isnanl
+#  define isnanl rpl_isnanl
+extern int isnanl (long double x);
+# endif
+#endif
+
+/* This must come *after* the snippets for GNULIB_ISNANF and GNULIB_ISNANL!  */
 #if @GNULIB_ISNAN@
 # if @REPLACE_ISNAN@
 /* We can't just use the isnanf macro (e.g.) as exposed by
    isnanf.h (e.g.) here, because those may end up being macros
    that recursively expand back to isnan.  So use the gnulib
    replacements for them directly. */
-#  if HAVE_ISNANF && __GNUC__ >= 4
+#  if @HAVE_ISNANF@ && __GNUC__ >= 4
 #   define gl_isnan_f(x) __builtin_isnan ((float)(x))
 #  else
 extern int rpl_isnanf (float x);
 #   define gl_isnan_f(x) rpl_isnanf (x)
 #  endif
-#  if HAVE_ISNAND && __GNUC__ >= 4
+#  if @HAVE_ISNAND@ && __GNUC__ >= 4
 #   define gl_isnan_d(x) __builtin_isnan ((double)(x))
 #  else
 extern int rpl_isnand (double x);
 #   define gl_isnan_d(x) rpl_isnand (x)
 #  endif
-#  if HAVE_ISNANL && __GNUC__ >= 4
+#  if @HAVE_ISNANL@ && __GNUC__ >= 4
 #   define gl_isnan_l(x) __builtin_isnan ((long double)(x))
 #  else
 extern int rpl_isnanl (long double x);
--- a/lib/sinl.c
+++ b/lib/sinl.c
@@ -52,7 +52,6 @@
 #include "trigl.h"
 #include "trigl.c"
 #include "sincosl.c"
-#include "isnanl.h"
 
 long double
 sinl (long double x)
--- a/lib/sqrtl.c
+++ b/lib/sqrtl.c
@@ -24,7 +24,6 @@
 #include <math.h>
 
 #include <float.h>
-#include "isnanl.h"
 
 /* A simple Newton-Raphson method. */
 long double
--- a/lib/tanl.c
+++ b/lib/tanl.c
@@ -55,7 +55,6 @@
 #include "trigl.c"
 #endif
 #endif
-#include "isnanl.h"
 
 /*
  * ====================================================
--- a/m4/isnand.m4
+++ b/m4/isnand.m4
@@ -1,12 +1,14 @@
-# isnand.m4 serial 4
+# isnand.m4 serial 5
 dnl Copyright (C) 2007-2008 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl Check how to get or define isnand().
+
 AC_DEFUN([gl_FUNC_ISNAND],
 [
+  AC_REQUIRE([gl_MATH_H_DEFAULTS])
   ISNAND_LIBM=
   gl_HAVE_ISNAND_NO_LIBM
   if test $gl_cv_func_isnand_no_libm = no; then
@@ -19,10 +21,9 @@
   if test $gl_cv_func_isnand_no_libm = yes \
      || test $gl_cv_func_isnand_in_libm = yes; then
     gl_func_isnand=yes
-    AC_DEFINE([HAVE_ISNAND], 1,
-      [Define if the isnan(double) function is available.])
   else
     gl_func_isnand=no
+    HAVE_ISNAND=0
     gl_BUILD_ISNAND
   fi
   AC_SUBST([ISNAND_LIBM])
--- a/m4/isnanf.m4
+++ b/m4/isnanf.m4
@@ -1,4 +1,4 @@
-# isnanf.m4 serial 8
+# isnanf.m4 serial 9
 dnl Copyright (C) 2007-2008 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -8,6 +8,7 @@
 
 AC_DEFUN([gl_FUNC_ISNANF],
 [
+  AC_REQUIRE([gl_MATH_H_DEFAULTS])
   ISNANF_LIBM=
   gl_HAVE_ISNANF_NO_LIBM
   if test $gl_cv_func_isnanf_no_libm = no; then
@@ -29,10 +30,8 @@
   else
     gl_func_isnanf=no
   fi
-  if test $gl_func_isnanf = yes; then
-    AC_DEFINE([HAVE_ISNANF], 1,
-      [Define if the isnan(float) function is available.])
-  else
+  if test $gl_func_isnanf != yes; then
+    HAVE_ISNANF=0
     gl_BUILD_ISNANF
   fi
   AC_SUBST([ISNANF_LIBM])
--- a/m4/isnanl.m4
+++ b/m4/isnanl.m4
@@ -1,4 +1,4 @@
-# isnanl.m4 serial 8
+# isnanl.m4 serial 9
 dnl Copyright (C) 2007-2008 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -6,6 +6,7 @@
 
 AC_DEFUN([gl_FUNC_ISNANL],
 [
+  AC_REQUIRE([gl_MATH_H_DEFAULTS])
   ISNANL_LIBM=
   gl_HAVE_ISNANL_NO_LIBM
   if test $gl_cv_func_isnanl_no_libm = no; then
@@ -27,10 +28,8 @@
   else
     gl_func_isnanl=no
   fi
-  if test $gl_func_isnanl = yes; then
-    AC_DEFINE([HAVE_ISNANL], 1,
-      [Define if the isnan(long double) function is available.])
-  else
+  if test $gl_func_isnanl != yes; then
+    HAVE_ISNANL=0
     gl_BUILD_ISNANL
   fi
   AC_SUBST([ISNANL_LIBM])
--- a/m4/math_h.m4
+++ b/m4/math_h.m4
@@ -1,4 +1,4 @@
-# math_h.m4 serial 13
+# math_h.m4 serial 14
 dnl Copyright (C) 2007-2008 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -53,6 +53,9 @@
   GNULIB_ISFINITE=0; AC_SUBST([GNULIB_ISFINITE])
   GNULIB_ISINF=0;    AC_SUBST([GNULIB_ISINF])
   GNULIB_ISNAN=0;    AC_SUBST([GNULIB_ISNAN])
+  GNULIB_ISNANF=0;   AC_SUBST([GNULIB_ISNANF])
+  GNULIB_ISNAND=0;   AC_SUBST([GNULIB_ISNAND])
+  GNULIB_ISNANL=0;   AC_SUBST([GNULIB_ISNANL])
   GNULIB_LDEXPL=0;   AC_SUBST([GNULIB_LDEXPL])
   GNULIB_MATHL=0;    AC_SUBST([GNULIB_MATHL])
   GNULIB_ROUND=0;    AC_SUBST([GNULIB_ROUND])
@@ -63,6 +66,9 @@
   GNULIB_TRUNCF=0;   AC_SUBST([GNULIB_TRUNCF])
   GNULIB_TRUNCL=0;   AC_SUBST([GNULIB_TRUNCL])
   dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_ISNANF=1;               AC_SUBST([HAVE_ISNANF])
+  HAVE_ISNAND=1;               AC_SUBST([HAVE_ISNAND])
+  HAVE_ISNANL=1;               AC_SUBST([HAVE_ISNANL])
   HAVE_DECL_ACOSL=1;           AC_SUBST([HAVE_DECL_ACOSL])
   HAVE_DECL_ASINL=1;           AC_SUBST([HAVE_DECL_ASINL])
   HAVE_DECL_ATANL=1;           AC_SUBST([HAVE_DECL_ATANL])
--- a/modules/isnand
+++ b/modules/isnand
@@ -2,7 +2,6 @@
 isnand() function: test for NaN.
 
 Files:
-lib/isnand.h
 lib/isnand.c
 lib/isnan.c
 lib/float+.h
@@ -10,15 +9,17 @@
 m4/isnand.m4
 
 Depends-on:
+math
 fpieee
 
 configure.ac:
 gl_FUNC_ISNAND
+gl_MATH_MODULE_INDICATOR([isnand])
 
 Makefile.am:
 
 Include:
-#include "isnand.h"
+<math.h>
 
 Link:
 $(ISNAND_LIBM)
--- a/modules/isnanf
+++ b/modules/isnanf
@@ -2,7 +2,6 @@
 isnanf() function: test for NaN.
 
 Files:
-lib/isnanf.h
 lib/isnanf.c
 lib/isnan.c
 lib/float+.h
@@ -10,15 +9,17 @@
 m4/isnanf.m4
 
 Depends-on:
+math
 fpieee
 
 configure.ac:
 gl_FUNC_ISNANF
+gl_MATH_MODULE_INDICATOR([isnanf])
 
 Makefile.am:
 
 Include:
-#include "isnanf.h"
+<math.h>
 
 Link:
 $(ISNANF_LIBM)
--- a/modules/isnanl
+++ b/modules/isnanl
@@ -2,7 +2,6 @@
 isnanl() function: test for NaN.
 
 Files:
-lib/isnanl.h
 lib/isnanl.c
 lib/isnan.c
 lib/float+.h
@@ -10,16 +9,18 @@
 m4/isnanl.m4
 
 Depends-on:
+math
 float
 fpieee
 
 configure.ac:
 gl_FUNC_ISNANL
+gl_MATH_MODULE_INDICATOR([isnanl])
 
 Makefile.am:
 
 Include:
-"isnanl.h"
+<math.h>
 
 Link:
 $(ISNANL_LIBM)
--- a/modules/math
+++ b/modules/math
@@ -32,6 +32,9 @@
 	      -e 's|@''GNULIB_ISFINITE''@|$(GNULIB_ISFINITE)|g' \
 	      -e 's|@''GNULIB_ISINF''@|$(GNULIB_ISINF)|g' \
 	      -e 's|@''GNULIB_ISNAN''@|$(GNULIB_ISNAN)|g' \
+	      -e 's|@''GNULIB_ISNANF''@|$(GNULIB_ISNANF)|g' \
+	      -e 's|@''GNULIB_ISNAND''@|$(GNULIB_ISNAND)|g' \
+	      -e 's|@''GNULIB_ISNANL''@|$(GNULIB_ISNANL)|g' \
 	      -e 's|@''GNULIB_LDEXPL''@|$(GNULIB_LDEXPL)|g' \
 	      -e 's|@''GNULIB_MATHL''@|$(GNULIB_MATHL)|g' \
 	      -e 's|@''GNULIB_ROUND''@|$(GNULIB_ROUND)|g' \
@@ -41,6 +44,9 @@
 	      -e 's|@''GNULIB_TRUNC''@|$(GNULIB_TRUNC)|g' \
 	      -e 's|@''GNULIB_TRUNCF''@|$(GNULIB_TRUNCF)|g' \
 	      -e 's|@''GNULIB_TRUNCL''@|$(GNULIB_TRUNCL)|g' \
+	      -e 's|@''HAVE_ISNANF''@|$(HAVE_ISNANF)|g' \
+	      -e 's|@''HAVE_ISNAND''@|$(HAVE_ISNAND)|g' \
+	      -e 's|@''HAVE_ISNANL''@|$(HAVE_ISNANL)|g' \
 	      -e 's|@''HAVE_DECL_ACOSL''@|$(HAVE_DECL_ACOSL)|g' \
 	      -e 's|@''HAVE_DECL_ASINL''@|$(HAVE_DECL_ASINL)|g' \
 	      -e 's|@''HAVE_DECL_ATANL''@|$(HAVE_DECL_ATANL)|g' \
--- a/tests/test-isnand.c
+++ b/tests/test-isnand.c
@@ -16,7 +16,7 @@
 
 #include <config.h>
 
-#include "isnand.h"
+#include <math.h>
 
 #include "test-isnand.h"
 
--- a/tests/test-isnanf.c
+++ b/tests/test-isnanf.c
@@ -16,6 +16,6 @@
 
 #include <config.h>
 
-#include "isnanf.h"
+#include <math.h>
 
 #include "test-isnanf.h"
--- a/tests/test-isnanl.c
+++ b/tests/test-isnanl.c
@@ -1,5 +1,5 @@
 /* Test of isnanl() substitute.
-   Copyright (C) 2007 Free Software Foundation, Inc.
+   Copyright (C) 2007-2008 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -18,6 +18,6 @@
 
 #include <config.h>
 
-#include "isnanl.h"
+#include <math.h>
 
 #include "test-isnanl.h"