11.18Sriastrad/*	$NetBSD: toupper_.c,v 1.18 2025/09/15 00:11:54 riastradh Exp $	*/
21.6Scgd
31.1Sjtc/*
41.9Ssalo * Written by J.T. Conklin <jtc@NetBSD.org>.
51.7Sjtc * Public domain.
61.1Sjtc */
71.1Sjtc
81.8Schristos#include <sys/cdefs.h>
91.1Sjtc#if defined(LIBC_RCS) && !defined(lint)
101.18Sriastrad__RCSID("$NetBSD: toupper_.c,v 1.18 2025/09/15 00:11:54 riastradh Exp $");
111.1Sjtc#endif /* LIBC_RCS and not lint */
121.1Sjtc
131.13Stnozaki#include <sys/ctype_bits.h>
141.15Sriastrad#include <sys/mman.h>
151.15Sriastrad
161.1Sjtc#include <stdio.h>
171.15Sriastrad
181.15Sriastrad#include "ctype_guard.h"
191.12Stnozaki#include "ctype_local.h"
201.1Sjtc
211.1Sjtc#if EOF != -1
221.1Sjtc#error "EOF != -1"
231.1Sjtc#endif
241.1Sjtc
251.15Sriastrad__ctype_table
261.15Sriastradstatic const short _C_toupper_tab_guarded_[_C_TOUPPER_TAB_GUARD +
271.15Sriastrad    1 + _CTYPE_NUM_CHARS] = {
281.18Sriastrad	_CTYPE_GUARD_INIT(_C_TOUPPER_TAB_GUARD, EOF)
291.15Sriastrad	[_C_TOUPPER_TAB_GUARD] = EOF,
301.1Sjtc	0x00,	0x01,	0x02,	0x03,	0x04,	0x05,	0x06,	0x07,
311.1Sjtc	0x08,	0x09,	0x0a,	0x0b,	0x0c,	0x0d,	0x0e,	0x0f,
321.1Sjtc	0x10,	0x11,	0x12,	0x13,	0x14,	0x15,	0x16,	0x17,
331.1Sjtc	0x18,	0x19,	0x1a,	0x1b,	0x1c,	0x1d,	0x1e,	0x1f,
341.1Sjtc	0x20,	0x21,	0x22,	0x23,	0x24,	0x25,	0x26,	0x27,
351.1Sjtc	0x28,	0x29,	0x2a,	0x2b,	0x2c,	0x2d,	0x2e,	0x2f,
361.1Sjtc	0x30,	0x31,	0x32,	0x33,	0x34,	0x35,	0x36,	0x37,
371.1Sjtc	0x38,	0x39,	0x3a,	0x3b,	0x3c,	0x3d,	0x3e,	0x3f,
381.1Sjtc	0x40,	0x41,	0x42,	0x43,	0x44,	0x45,	0x46,	0x47,
391.1Sjtc	0x48,	0x49,	0x4a,	0x4b,	0x4c,	0x4d,	0x4e,	0x4f,
401.1Sjtc	0x50,	0x51,	0x52,	0x53,	0x54,	0x55,	0x56,	0x57,
411.1Sjtc	0x58,	0x59,	0x5a,	0x5b,	0x5c,	0x5d,	0x5e,	0x5f,
421.1Sjtc	0x60,	'A',	'B',	'C',	'D',	'E',	'F',	'G',
431.1Sjtc	'H',	'I',	'J',	'K',	'L',	'M',	'N',	'O',
441.1Sjtc	'P',	'Q',	'R',	'S',	'T',	'U',	'V',	'W',
451.1Sjtc	'X',	'Y',	'Z',	0x7b,	0x7c,	0x7d,	0x7e,	0x7f,
461.1Sjtc	0x80,	0x81,	0x82,	0x83,	0x84,	0x85,	0x86,	0x87,
471.1Sjtc	0x88,	0x89,	0x8a,	0x8b,	0x8c,	0x8d,	0x8e,	0x8f,
481.1Sjtc	0x90,	0x91,	0x92,	0x93,	0x94,	0x95,	0x96,	0x97,
491.1Sjtc	0x98,	0x99,	0x9a,	0x9b,	0x9c,	0x9d,	0x9e,	0x9f,
501.1Sjtc	0xa0,	0xa1,	0xa2,	0xa3,	0xa4,	0xa5,	0xa6,	0xa7,
511.1Sjtc	0xa8,	0xa9,	0xaa,	0xab,	0xac,	0xad,	0xae,	0xaf,
521.1Sjtc	0xb0,	0xb1,	0xb2,	0xb3,	0xb4,	0xb5,	0xb6,	0xb7,
531.1Sjtc	0xb8,	0xb9,	0xba,	0xbb,	0xbc,	0xbd,	0xbe,	0xbf,
541.1Sjtc	0xc0,	0xc1,	0xc2,	0xc3,	0xc4,	0xc5,	0xc6,	0xc7,
551.1Sjtc	0xc8,	0xc9,	0xca,	0xcb,	0xcc,	0xcd,	0xce,	0xcf,
561.1Sjtc	0xd0,	0xd1,	0xd2,	0xd3,	0xd4,	0xd5,	0xd6,	0xd7,
571.1Sjtc	0xd8,	0xd9,	0xda,	0xdb,	0xdc,	0xdd,	0xde,	0xdf,
581.1Sjtc	0xe0,	0xe1,	0xe2,	0xe3,	0xe4,	0xe5,	0xe6,	0xe7,
591.1Sjtc	0xe8,	0xe9,	0xea,	0xeb,	0xec,	0xed,	0xee,	0xef,
601.1Sjtc	0xf0,	0xf1,	0xf2,	0xf3,	0xf4,	0xf5,	0xf6,	0xf7,
611.1Sjtc	0xf8,	0xf9,	0xfa,	0xfb,	0xfc,	0xfd,	0xfe,	0xff
621.1Sjtc};
631.17Sriastrad__ctype_table_guarded(_C_toupper_tab_, _C_toupper_tab_guarded_,
641.16Sriastrad    1 + _CTYPE_NUM_CHARS, __SIZEOF_SHORT__);
651.1Sjtc
661.14Sjoerg#ifdef __BUILD_LEGACY
671.14Sjoerg#ifdef __weak_alias
681.14Sjoerg__weak_alias(_C_toupper_, _C_toupper_tab_)
691.14Sjoerg#endif
701.14Sjoerg#endif
711.14Sjoerg
721.14Sjoergconst short *_toupper_tab_ = &_C_toupper_tab_[0];
731.15Sriastrad
741.15Sriastrad#if _CTYPE_GUARD_PAGE
751.15Sriastrad__attribute__((constructor))
761.15Sriastradstatic void
771.15Sriastrad_C_toupper_tab_guard_init(void)
781.15Sriastrad{
791.15Sriastrad
801.18Sriastrad	if (constructor_allow_ctype_abuse())
811.18Sriastrad		return;
821.15Sriastrad	(void)mprotect(__UNCONST(_C_toupper_tab_guarded_), _CTYPE_GUARD_SIZE,
831.15Sriastrad	    PROT_NONE);
841.15Sriastrad}
851.15Sriastrad#endif	/* _CTYPE_GUARD_PAGE */
86