From 620f13b0612810324592ab2d2b4e5a5dab27f981 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 16 Aug 2012 14:58:44 -0700 Subject: [PATCH] Use ASCII tests for character types. * admin/merge-gnulib (GNULIB_MODULES): Add c-ctype. * lwlib/lwlib-Xaw.c, lwlib/lwlib.c, lwlib/xlwmenu.c: Don't include ; no longer needed. * lwlib/lwlib-Xaw.c (openFont): * lwlib/xlwmenu.c (openXftFont): Test just for ASCII digits. * src/category.c, src/dispnew.c, src/doprnt.c, src/editfns.c, src/syntax.c * src/term.c, src/xfns.c, src/xterm.c: Don't include ; was not needed. * src/charset.c, src/doc.c, src/fileio.c, src/font.c, src/frame.c: * src/gtkutil.c, src/image.c, src/sysdep.c, src/xfaces.c: Include instead of . * src/nsterm.m: Include . * src/charset.c (read_hex): * src/doc.c (Fsnarf_documentation): * src/fileio.c (IS_DRIVE) [WINDOWSNT]: (DRIVE_LETTER) [DOS_NT]: (Ffile_name_directory, Fexpand_file_name) (Fsubstitute_in_file_name): * src/font.c (font_parse_xlfd, font_parse_fcname): * src/frame.c (x_set_font_backend): * src/gtkutil.c (xg_get_font): * src/image.c (xbm_scan, xpm_scan, pbm_scan_number): * src/nsimage.m (hexchar): * src/nsterm.m (ns_xlfd_to_fontname): * src/sysdep.c (system_process_attributes): * src/xfaces.c (hash_string_case_insensitive): Use C-locale tests instead of locale-specific tests for character types, since we want the ASCII interpretation here, not the interpretation suitable for whatever happens to be the current locale. --- admin/ChangeLog | 7 +++++++ admin/merge-gnulib | 2 +- lwlib/ChangeLog | 8 ++++++++ lwlib/lwlib-Xaw.c | 3 +-- lwlib/lwlib.c | 1 - lwlib/xlwmenu.c | 3 +-- src/ChangeLog | 28 ++++++++++++++++++++++++++++ src/category.c | 1 - src/charset.c | 4 ++-- src/dispnew.c | 1 - src/doc.c | 7 ++++--- src/doprnt.c | 1 - src/editfns.c | 1 - src/fileio.c | 17 +++++++++-------- src/font.c | 9 +++++---- src/frame.c | 8 +++++--- src/gtkutil.c | 6 ++++-- src/image.c | 34 ++++++++++++++++++---------------- src/nsimage.m | 3 +-- src/nsterm.m | 8 +++++--- src/syntax.c | 1 - src/sysdep.c | 6 +++--- src/term.c | 1 - src/xfaces.c | 4 ++-- src/xfns.c | 1 - src/xterm.c | 1 - 26 files changed, 104 insertions(+), 62 deletions(-) diff --git a/admin/ChangeLog b/admin/ChangeLog index c579930d2bf..ea977e80cfa 100644 --- a/admin/ChangeLog +++ b/admin/ChangeLog @@ -1,3 +1,10 @@ +2012-08-16 Paul Eggert + + Use ASCII tests for character types. + * merge-gnulib (GNULIB_MODULES): Add c-ctype. This documents a + new direct dependency; c-ctype was already being used indirectly + via other gnulib modules. + 2012-08-14 Paul Eggert Use bool for Emacs Lisp booleans. diff --git a/admin/merge-gnulib b/admin/merge-gnulib index c5b9eba5ee6..63865edf3ce 100755 --- a/admin/merge-gnulib +++ b/admin/merge-gnulib @@ -26,7 +26,7 @@ GNULIB_URL=git://git.savannah.gnu.org/gnulib.git GNULIB_MODULES=' - alloca-opt c-strcase + alloca-opt c-ctype c-strcase careadlinkat crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dtotimespec dup2 environ filemode getloadavg getopt-gnu gettime gettimeofday diff --git a/lwlib/ChangeLog b/lwlib/ChangeLog index 8d36e2e22d7..7d49d9b531b 100644 --- a/lwlib/ChangeLog +++ b/lwlib/ChangeLog @@ -1,3 +1,11 @@ +2012-08-16 Paul Eggert + + Use ASCII tests for character types. + * lwlib-Xaw.c, lwlib.c, xlwmenu.c: + Don't include ; no longer needed. + * lwlib-Xaw.c (openFont): + * xlwmenu.c (openXftFont): Test just for ASCII digits. + 2012-08-01 Glenn Morris * Makefile.in (config_h): Add conf_post.h. diff --git a/lwlib/lwlib-Xaw.c b/lwlib/lwlib-Xaw.c index 7f834df1aad..d37fb70fdb8 100644 --- a/lwlib/lwlib-Xaw.c +++ b/lwlib/lwlib-Xaw.c @@ -24,7 +24,6 @@ Boston, MA 02110-1301, USA. */ #include #include -#include #include @@ -125,7 +124,7 @@ openFont (Widget widget, char *name) XftFont *fn; /* Try to convert Gtk-syntax (Sans 9) to Xft syntax Sans-9. */ - while (i > 0 && isdigit (fname[i])) + while (i > 0 && '0' <= fname[i] && fname[i] <= '9') --i; if (fname[i] == ' ') { diff --git a/lwlib/lwlib.c b/lwlib/lwlib.c index 5820be8d7a4..ad3792dd59d 100644 --- a/lwlib/lwlib.c +++ b/lwlib/lwlib.c @@ -28,7 +28,6 @@ Boston, MA 02110-1301, USA. */ #include #include -#include #include "lwlib-int.h" #include "lwlib-utils.h" #include diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c index e8831c37f8f..c76cb1a3f38 100644 --- a/lwlib/xlwmenu.c +++ b/lwlib/xlwmenu.c @@ -28,7 +28,6 @@ Boston, MA 02110-1301, USA. */ #include #include -#include #include #if (defined __sun) && !(defined SUNOS41) @@ -1858,7 +1857,7 @@ openXftFont (XlwMenuWidget mw) int screen = XScreenNumberOfScreen (mw->core.screen); int len = strlen (fname), i = len-1; /* Try to convert Gtk-syntax (Sans 9) to Xft syntax Sans-9. */ - while (i > 0 && isdigit (fname[i])) + while (i > 0 && '0' <= fname[i] && fname[i] <= '9') --i; if (fname[i] == ' ') { diff --git a/src/ChangeLog b/src/ChangeLog index 95140401eb2..874088bb782 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,31 @@ +2012-08-16 Paul Eggert + + Use ASCII tests for character types. + * category.c, dispnew.c, doprnt.c, editfns.c, syntax.c, term.c: + * xfns.c, xterm.c: + Don't include ; was not needed. + * charset.c, doc.c, fileio.c, font.c, frame.c, gtkutil.c, image.c: + * sysdep.c, xfaces.c: + Include instead of . + * nsterm.m: Include . + * charset.c (read_hex): + * doc.c (Fsnarf_documentation): + * fileio.c (IS_DRIVE) [WINDOWSNT]: + (DRIVE_LETTER) [DOS_NT]: + (Ffile_name_directory, Fexpand_file_name) + (Fsubstitute_in_file_name): + * font.c (font_parse_xlfd, font_parse_fcname): + * frame.c (x_set_font_backend): + * gtkutil.c (xg_get_font): + * image.c (xbm_scan, xpm_scan, pbm_scan_number): + * nsimage.m (hexchar): + * nsterm.m (ns_xlfd_to_fontname): + * sysdep.c (system_process_attributes): + * xfaces.c (hash_string_case_insensitive): + Use C-locale tests instead of locale-specific tests for character + types, since we want the ASCII interpretation here, not the + interpretation suitable for whatever happens to be the current locale. + 2012-08-16 Martin Rudalics Consistently check windows for validity/liveness diff --git a/src/category.c b/src/category.c index 3d5b3cff04a..246a7d35a6d 100644 --- a/src/category.c +++ b/src/category.c @@ -32,7 +32,6 @@ along with GNU Emacs. If not, see . */ #define CATEGORY_INLINE EXTERN_INLINE -#include #include #include "lisp.h" #include "character.h" diff --git a/src/charset.c b/src/charset.c index fbbcefc4915..87c16e12008 100644 --- a/src/charset.c +++ b/src/charset.c @@ -30,10 +30,10 @@ along with GNU Emacs. If not, see . */ #include #include -#include #include #include #include +#include #include "lisp.h" #include "character.h" #include "charset.h" @@ -446,7 +446,7 @@ read_hex (FILE *fp, int *eof, int *overflow) return 0; } n = 0; - while (isxdigit (c = getc (fp))) + while (c_isxdigit (c = getc (fp))) { if (UINT_MAX >> 4 < n) *overflow = 1; diff --git a/src/dispnew.c b/src/dispnew.c index b82761f8cad..3288faba61b 100644 --- a/src/dispnew.c +++ b/src/dispnew.c @@ -23,7 +23,6 @@ along with GNU Emacs. If not, see . */ #include #include -#include #include #include diff --git a/src/doc.c b/src/doc.c index d17e90f11c0..ed311d918d7 100644 --- a/src/doc.c +++ b/src/doc.c @@ -22,11 +22,12 @@ along with GNU Emacs. If not, see . */ #include #include /* Must be after sys/types.h for USG*/ -#include #include #include #include +#include + #include "lisp.h" #include "character.h" #include "buffer.h" @@ -597,9 +598,9 @@ the same file name is found in the `doc-directory'. */) { ptrdiff_t len; - while (*beg && isspace (*beg)) ++beg; + while (*beg && c_isspace (*beg)) ++beg; - for (end = beg; *end && ! isspace (*end); ++end) + for (end = beg; *end && ! c_isspace (*end); ++end) if (*end == '/') beg = end+1; /* skip directory part */ len = end - beg; diff --git a/src/doprnt.c b/src/doprnt.c index 63f05cb74e2..b36e946005d 100644 --- a/src/doprnt.c +++ b/src/doprnt.c @@ -102,7 +102,6 @@ along with GNU Emacs. If not, see . */ #include #include -#include #include #include #include diff --git a/src/editfns.c b/src/editfns.c index 5ac012c8378..b7feb733782 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -44,7 +44,6 @@ along with GNU Emacs. If not, see . */ #include #endif -#include #include #include #include diff --git a/src/fileio.c b/src/fileio.c index eba157ea042..5991a238ffc 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -30,7 +30,6 @@ along with GNU Emacs. If not, see . */ #include #endif -#include #include #ifdef HAVE_LIBSELINUX @@ -38,6 +37,8 @@ along with GNU Emacs. If not, see . */ #include #endif +#include + #include "lisp.h" #include "intervals.h" #include "character.h" @@ -67,12 +68,12 @@ along with GNU Emacs. If not, see . */ #define IS_DRIVE(x) ((x) >= 'A' && (x) <= 'z') #endif #ifdef WINDOWSNT -#define IS_DRIVE(x) isalpha ((unsigned char) (x)) +#define IS_DRIVE(x) c_isalpha (x) #endif /* Need to lower-case the drive letter, or else expanded filenames will sometimes compare unequal, because `expand-file-name' doesn't always down-case the drive letter. */ -#define DRIVE_LETTER(x) (tolower ((unsigned char) (x))) +#define DRIVE_LETTER(x) c_tolower (x) #endif #include "systime.h" @@ -364,7 +365,7 @@ Given a Unix syntax file name, returns a string ending in slash. */) r += 2; } - if (getdefdir (toupper ((unsigned char) *beg) - 'A' + 1, r)) + if (getdefdir (c_toupper (*beg) - 'A' + 1, r)) { if (!IS_DIRECTORY_SEP (res[strlen (res) - 1])) strcat (res, "/"); @@ -1053,7 +1054,7 @@ filesystem tree, not (expand-file-name ".." dirname). */) if (!IS_DIRECTORY_SEP (nm[0])) { adir = alloca (MAXPATHLEN + 1); - if (!getdefdir (toupper (drive) - 'A' + 1, adir)) + if (!getdefdir (c_toupper (drive) - 'A' + 1, adir)) adir = NULL; } if (!adir) @@ -1129,7 +1130,7 @@ filesystem tree, not (expand-file-name ".." dirname). */) adir = alloca (MAXPATHLEN + 1); if (drive) { - if (!getdefdir (toupper (drive) - 'A' + 1, adir)) + if (!getdefdir (c_toupper (drive) - 'A' + 1, adir)) newdir = "/"; } else @@ -1635,7 +1636,7 @@ those `/' is discarded. */) else { o = p; - while (p != endp && (isalnum (*p) || *p == '_')) p++; + while (p != endp && (c_isalnum (*p) || *p == '_')) p++; s = p; } @@ -1698,7 +1699,7 @@ those `/' is discarded. */) else { o = p; - while (p != endp && (isalnum (*p) || *p == '_')) p++; + while (p != endp && (c_isalnum (*p) || *p == '_')) p++; s = p; } diff --git a/src/font.c b/src/font.c index c3040b8aa3f..5b9e4f1cfcf 100644 --- a/src/font.c +++ b/src/font.c @@ -23,9 +23,10 @@ along with GNU Emacs. If not, see . */ #include #include #include -#include #include +#include + #include "lisp.h" #include "character.h" #include "buffer.h" @@ -1079,7 +1080,7 @@ font_parse_xlfd (char *name, ptrdiff_t len, Lisp_Object font) p = f[XLFD_POINT_INDEX]; if (*p == '[') point_size = parse_matrix (p); - else if (isdigit (*p)) + else if (c_isdigit (*p)) point_size = atoi (p), point_size /= 10; if (point_size >= 0) ASET (font, FONT_SIZE_INDEX, make_float (point_size)); @@ -1346,7 +1347,7 @@ font_parse_fcname (char *name, ptrdiff_t len, Lisp_Object font) { int decimal = 0, size_found = 1; for (q = p + 1; *q && *q != ':'; q++) - if (! isdigit (*q)) + if (! c_isdigit (*q)) { if (*q != '.' || decimal) { @@ -1474,7 +1475,7 @@ font_parse_fcname (char *name, ptrdiff_t len, Lisp_Object font) /* Scan backwards from the end, looking for a size. */ for (p = name + len - 1; p >= name; p--) - if (!isdigit (*p)) + if (!c_isdigit (*p)) break; if ((p < name + len - 1) && ((p + 1 == name) || *p == ' ')) diff --git a/src/frame.c b/src/frame.c index ea682835a87..9dabae55abc 100644 --- a/src/frame.c +++ b/src/frame.c @@ -20,10 +20,12 @@ along with GNU Emacs. If not, see . */ #include #include -#include #include #include #include + +#include + #include "lisp.h" #include "character.h" #ifdef HAVE_X_WINDOWS @@ -3271,7 +3273,7 @@ x_set_font_backend (struct frame *f, Lisp_Object new_value, Lisp_Object old_valu new_value = Qnil; while (*p0) { - while (*p1 && ! isspace (*p1) && *p1 != ',') p1++; + while (*p1 && ! c_isspace (*p1) && *p1 != ',') p1++; if (p0 < p1) new_value = Fcons (Fintern (make_string (p0, p1 - p0), Qnil), new_value); @@ -3279,7 +3281,7 @@ x_set_font_backend (struct frame *f, Lisp_Object new_value, Lisp_Object old_valu { int c; - while ((c = *++p1) && isspace (c)); + while ((c = *++p1) && c_isspace (c)); } p0 = p1; } diff --git a/src/gtkutil.c b/src/gtkutil.c index a4de47f073c..2941605d448 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -24,7 +24,9 @@ along with GNU Emacs. If not, see . */ #include #include #include -#include + +#include + #include "lisp.h" #include "xterm.h" #include "blockinput.h" @@ -2072,7 +2074,7 @@ xg_get_font (FRAME_PTR f, const char *default_name) if (p) { char *ep = p+1; - while (isdigit (*ep)) + while (c_isdigit (*ep)) ++ep; if (*ep == '\0') *p = ' '; } diff --git a/src/image.c b/src/image.c index 8a318c2f6ec..f2778165ece 100644 --- a/src/image.c +++ b/src/image.c @@ -20,7 +20,6 @@ along with GNU Emacs. If not, see . */ #include #include #include -#include #include #ifdef HAVE_PNG @@ -33,6 +32,8 @@ along with GNU Emacs. If not, see . */ #include +#include + /* This makes the fields of a Display accessible, in Xlib header files. */ #define XLIB_ILLEGAL_ACCESS @@ -2405,12 +2406,12 @@ xbm_scan (unsigned char **s, unsigned char *end, char *sval, int *ival) loop: /* Skip white space. */ - while (*s < end && (c = *(*s)++, isspace (c))) + while (*s < end && (c = *(*s)++, c_isspace (c))) ; if (*s >= end) c = 0; - else if (isdigit (c)) + else if (c_isdigit (c)) { int value = 0, digit; @@ -2422,7 +2423,7 @@ xbm_scan (unsigned char **s, unsigned char *end, char *sval, int *ival) while (*s < end) { c = *(*s)++; - if (isdigit (c)) + if (c_isdigit (c)) digit = c - '0'; else if (c >= 'a' && c <= 'f') digit = c - 'a' + 10; @@ -2433,11 +2434,11 @@ xbm_scan (unsigned char **s, unsigned char *end, char *sval, int *ival) value = 16 * value + digit; } } - else if (isdigit (c)) + else if (c_isdigit (c)) { value = c - '0'; while (*s < end - && (c = *(*s)++, isdigit (c))) + && (c = *(*s)++, c_isdigit (c))) value = 8 * value + c - '0'; } } @@ -2445,7 +2446,7 @@ xbm_scan (unsigned char **s, unsigned char *end, char *sval, int *ival) { value = c - '0'; while (*s < end - && (c = *(*s)++, isdigit (c))) + && (c = *(*s)++, c_isdigit (c))) value = 10 * value + c - '0'; } @@ -2454,11 +2455,11 @@ xbm_scan (unsigned char **s, unsigned char *end, char *sval, int *ival) *ival = value; c = XBM_TK_NUMBER; } - else if (isalpha (c) || c == '_') + else if (c_isalpha (c) || c == '_') { *sval++ = c; while (*s < end - && (c = *(*s)++, (isalnum (c) || c == '_'))) + && (c = *(*s)++, (c_isalnum (c) || c == '_'))) *sval++ = c; *sval = 0; if (*s < end) @@ -3661,16 +3662,17 @@ xpm_scan (const unsigned char **s, while (*s < end) { /* Skip white-space. */ - while (*s < end && (c = *(*s)++, isspace (c))) + while (*s < end && (c = *(*s)++, c_isspace (c))) ; /* gnus-pointer.xpm uses '-' in its identifier. sb-dir-plus.xpm uses '+' in its identifier. */ - if (isalpha (c) || c == '_' || c == '-' || c == '+') + if (c_isalpha (c) || c == '_' || c == '-' || c == '+') { *beg = *s - 1; while (*s < end - && (c = **s, isalnum (c) || c == '_' || c == '-' || c == '+')) + && (c = **s, c_isalnum (c) + || c == '_' || c == '-' || c == '+')) ++*s; *len = *s - *beg; return XPM_TK_IDENT; @@ -5014,7 +5016,7 @@ pbm_scan_number (unsigned char **s, unsigned char *end) while (*s < end) { /* Skip white-space. */ - while (*s < end && (c = *(*s)++, isspace (c))) + while (*s < end && (c = *(*s)++, c_isspace (c))) ; if (c == '#') @@ -5023,11 +5025,11 @@ pbm_scan_number (unsigned char **s, unsigned char *end) while (*s < end && (c = *(*s)++, c != '\n')) ; } - else if (isdigit (c)) + else if (c_isdigit (c)) { /* Read decimal number. */ val = c - '0'; - while (*s < end && (c = *(*s)++, isdigit (c))) + while (*s < end && (c = *(*s)++, c_isdigit (c))) val = 10 * val + c - '0'; break; } @@ -8554,7 +8556,7 @@ gs_load (struct frame *f, struct image *img) don't either. Let the Lisp loader use `unwind-protect' instead. */ printnum1 = FRAME_X_WINDOW (f); printnum2 = img->pixmap; - window_and_pixmap_id + window_and_pixmap_id = make_formatted_string (buffer, "%"pMu" %"pMu, printnum1, printnum2); printnum1 = FRAME_FOREGROUND_PIXEL (f); diff --git a/src/nsimage.m b/src/nsimage.m index 1479294948b..8a8a3ddaae4 100644 --- a/src/nsimage.m +++ b/src/nsimage.m @@ -302,7 +302,7 @@ static EmacsImage *ImageList = nil; [bmRep release]; return nil; } -#define hexchar(x) (isdigit (x) ? x - '0' : x - 'a' + 10) +#define hexchar(x) ('0' <= (x) && (x) <= '9' ? (x) - '0' : (x) - 'a' + 10) s1 = *s++; s2 = *s++; c = hexchar (s1) * 0x10 + hexchar (s2); @@ -501,4 +501,3 @@ static EmacsImage *ImageList = nil; } @end - diff --git a/src/nsterm.m b/src/nsterm.m index 76e6ee8fb40..a628a248c77 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -36,6 +36,8 @@ GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu) #include #include #include + +#include #include #include @@ -6785,20 +6787,20 @@ ns_xlfd_to_fontname (const char *xlfd) /* undo hack in ns_fontname_to_xlfd, converting '$' to '-', '_' to ' ' also uppercase after '-' or ' ' */ - name[0] = toupper (name[0]); + name[0] = c_toupper (name[0]); for (len =strlen (name), i =0; i. */ #include -#include #include #include #include "lisp.h" diff --git a/src/sysdep.c b/src/sysdep.c index 01ca905a987..1dbe8938e46 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -21,7 +21,6 @@ along with GNU Emacs. If not, see . */ #define SYSTIME_INLINE EXTERN_INLINE -#include #include #include #include @@ -33,6 +32,7 @@ along with GNU Emacs. If not, see . */ #include #include +#include #include #include #include @@ -2733,7 +2733,7 @@ system_process_attributes (Lisp_Object pid) if (emacs_read (fd, &ch, 1) != 1) break; c = ch; - if (isspace (c) || c == '\\') + if (c_isspace (c) || c == '\\') cmdline_size++; /* for later quoting, see below */ } if (cmdline_size) @@ -2757,7 +2757,7 @@ system_process_attributes (Lisp_Object pid) for (p = cmdline; p < cmdline + nread; p++) { /* Escape-quote whitespace and backslashes. */ - if (isspace (*p) || *p == '\\') + if (c_isspace (*p) || *p == '\\') { memmove (p + 1, p, nread - (p - cmdline)); nread++; diff --git a/src/term.c b/src/term.c index 514c7ad11ec..c5cec3062e3 100644 --- a/src/term.c +++ b/src/term.c @@ -21,7 +21,6 @@ along with GNU Emacs. If not, see . */ #include #include -#include #include #include #include diff --git a/src/xfaces.c b/src/xfaces.c index ed372c6b419..7491802466d 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -279,7 +279,7 @@ along with GNU Emacs. If not, see . */ #endif /* HAVE_X_WINDOWS */ -#include +#include /* Number of pt per inch (from the TeXbook). */ @@ -4059,7 +4059,7 @@ hash_string_case_insensitive (Lisp_Object string) unsigned hash = 0; eassert (STRINGP (string)); for (s = SDATA (string); *s; ++s) - hash = (hash << 1) ^ tolower (*s); + hash = (hash << 1) ^ c_tolower (*s); return hash; } diff --git a/src/xfns.c b/src/xfns.c index 2e7334b7d71..a9d22e7d3c6 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -49,7 +49,6 @@ along with GNU Emacs. If not, see . */ #ifdef HAVE_X_WINDOWS -#include #include #include diff --git a/src/xterm.c b/src/xterm.c index 1b746f87d53..b1a73d07998 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -50,7 +50,6 @@ along with GNU Emacs. If not, see . */ #include "systime.h" #include -#include #include #include #include -- 2.11.4.GIT