7581 lines
296 KiB
Plaintext
7581 lines
296 KiB
Plaintext
This is libc.info, produced by makeinfo version 6.5 from libc.texinfo.
|
||
|
||
This file documents the GNU C Library.
|
||
|
||
This is ‘The GNU C Library Reference Manual’, for version 2.28.
|
||
|
||
Copyright © 1993–2018 Free Software Foundation, Inc.
|
||
|
||
Permission is granted to copy, distribute and/or modify this document
|
||
under the terms of the GNU Free Documentation License, Version 1.3 or
|
||
any later version published by the Free Software Foundation; with the
|
||
Invariant Sections being “Free Software Needs Free Documentation” and
|
||
“GNU Lesser General Public License”, the Front-Cover texts being “A GNU
|
||
Manual”, and with the Back-Cover Texts as in (a) below. A copy of the
|
||
license is included in the section entitled "GNU Free Documentation
|
||
License".
|
||
|
||
(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and
|
||
modify this GNU manual. Buying copies from the FSF supports it in
|
||
developing GNU and promoting software freedom.”
|
||
INFO-DIR-SECTION Software libraries
|
||
START-INFO-DIR-ENTRY
|
||
* Libc: (libc). C library.
|
||
END-INFO-DIR-ENTRY
|
||
|
||
INFO-DIR-SECTION GNU C library functions and macros
|
||
START-INFO-DIR-ENTRY
|
||
* ALTWERASE: (libc)Local Modes.
|
||
* ARGP_ERR_UNKNOWN: (libc)Argp Parser Functions.
|
||
* ARG_MAX: (libc)General Limits.
|
||
* BC_BASE_MAX: (libc)Utility Limits.
|
||
* BC_DIM_MAX: (libc)Utility Limits.
|
||
* BC_SCALE_MAX: (libc)Utility Limits.
|
||
* BC_STRING_MAX: (libc)Utility Limits.
|
||
* BRKINT: (libc)Input Modes.
|
||
* BUFSIZ: (libc)Controlling Buffering.
|
||
* CCTS_OFLOW: (libc)Control Modes.
|
||
* CHAR_BIT: (libc)Width of Type.
|
||
* CHILD_MAX: (libc)General Limits.
|
||
* CIGNORE: (libc)Control Modes.
|
||
* CLK_TCK: (libc)Processor Time.
|
||
* CLOCAL: (libc)Control Modes.
|
||
* CLOCKS_PER_SEC: (libc)CPU Time.
|
||
* COLL_WEIGHTS_MAX: (libc)Utility Limits.
|
||
* CPU_CLR: (libc)CPU Affinity.
|
||
* CPU_ISSET: (libc)CPU Affinity.
|
||
* CPU_SET: (libc)CPU Affinity.
|
||
* CPU_SETSIZE: (libc)CPU Affinity.
|
||
* CPU_ZERO: (libc)CPU Affinity.
|
||
* CREAD: (libc)Control Modes.
|
||
* CRTS_IFLOW: (libc)Control Modes.
|
||
* CS5: (libc)Control Modes.
|
||
* CS6: (libc)Control Modes.
|
||
* CS7: (libc)Control Modes.
|
||
* CS8: (libc)Control Modes.
|
||
* CSIZE: (libc)Control Modes.
|
||
* CSTOPB: (libc)Control Modes.
|
||
* DTTOIF: (libc)Directory Entries.
|
||
* E2BIG: (libc)Error Codes.
|
||
* EACCES: (libc)Error Codes.
|
||
* EADDRINUSE: (libc)Error Codes.
|
||
* EADDRNOTAVAIL: (libc)Error Codes.
|
||
* EADV: (libc)Error Codes.
|
||
* EAFNOSUPPORT: (libc)Error Codes.
|
||
* EAGAIN: (libc)Error Codes.
|
||
* EALREADY: (libc)Error Codes.
|
||
* EAUTH: (libc)Error Codes.
|
||
* EBACKGROUND: (libc)Error Codes.
|
||
* EBADE: (libc)Error Codes.
|
||
* EBADF: (libc)Error Codes.
|
||
* EBADFD: (libc)Error Codes.
|
||
* EBADMSG: (libc)Error Codes.
|
||
* EBADR: (libc)Error Codes.
|
||
* EBADRPC: (libc)Error Codes.
|
||
* EBADRQC: (libc)Error Codes.
|
||
* EBADSLT: (libc)Error Codes.
|
||
* EBFONT: (libc)Error Codes.
|
||
* EBUSY: (libc)Error Codes.
|
||
* ECANCELED: (libc)Error Codes.
|
||
* ECHILD: (libc)Error Codes.
|
||
* ECHO: (libc)Local Modes.
|
||
* ECHOCTL: (libc)Local Modes.
|
||
* ECHOE: (libc)Local Modes.
|
||
* ECHOK: (libc)Local Modes.
|
||
* ECHOKE: (libc)Local Modes.
|
||
* ECHONL: (libc)Local Modes.
|
||
* ECHOPRT: (libc)Local Modes.
|
||
* ECHRNG: (libc)Error Codes.
|
||
* ECOMM: (libc)Error Codes.
|
||
* ECONNABORTED: (libc)Error Codes.
|
||
* ECONNREFUSED: (libc)Error Codes.
|
||
* ECONNRESET: (libc)Error Codes.
|
||
* ED: (libc)Error Codes.
|
||
* EDEADLK: (libc)Error Codes.
|
||
* EDEADLOCK: (libc)Error Codes.
|
||
* EDESTADDRREQ: (libc)Error Codes.
|
||
* EDIED: (libc)Error Codes.
|
||
* EDOM: (libc)Error Codes.
|
||
* EDOTDOT: (libc)Error Codes.
|
||
* EDQUOT: (libc)Error Codes.
|
||
* EEXIST: (libc)Error Codes.
|
||
* EFAULT: (libc)Error Codes.
|
||
* EFBIG: (libc)Error Codes.
|
||
* EFTYPE: (libc)Error Codes.
|
||
* EGRATUITOUS: (libc)Error Codes.
|
||
* EGREGIOUS: (libc)Error Codes.
|
||
* EHOSTDOWN: (libc)Error Codes.
|
||
* EHOSTUNREACH: (libc)Error Codes.
|
||
* EHWPOISON: (libc)Error Codes.
|
||
* EIDRM: (libc)Error Codes.
|
||
* EIEIO: (libc)Error Codes.
|
||
* EILSEQ: (libc)Error Codes.
|
||
* EINPROGRESS: (libc)Error Codes.
|
||
* EINTR: (libc)Error Codes.
|
||
* EINVAL: (libc)Error Codes.
|
||
* EIO: (libc)Error Codes.
|
||
* EISCONN: (libc)Error Codes.
|
||
* EISDIR: (libc)Error Codes.
|
||
* EISNAM: (libc)Error Codes.
|
||
* EKEYEXPIRED: (libc)Error Codes.
|
||
* EKEYREJECTED: (libc)Error Codes.
|
||
* EKEYREVOKED: (libc)Error Codes.
|
||
* EL2HLT: (libc)Error Codes.
|
||
* EL2NSYNC: (libc)Error Codes.
|
||
* EL3HLT: (libc)Error Codes.
|
||
* EL3RST: (libc)Error Codes.
|
||
* ELIBACC: (libc)Error Codes.
|
||
* ELIBBAD: (libc)Error Codes.
|
||
* ELIBEXEC: (libc)Error Codes.
|
||
* ELIBMAX: (libc)Error Codes.
|
||
* ELIBSCN: (libc)Error Codes.
|
||
* ELNRNG: (libc)Error Codes.
|
||
* ELOOP: (libc)Error Codes.
|
||
* EMEDIUMTYPE: (libc)Error Codes.
|
||
* EMFILE: (libc)Error Codes.
|
||
* EMLINK: (libc)Error Codes.
|
||
* EMSGSIZE: (libc)Error Codes.
|
||
* EMULTIHOP: (libc)Error Codes.
|
||
* ENAMETOOLONG: (libc)Error Codes.
|
||
* ENAVAIL: (libc)Error Codes.
|
||
* ENEEDAUTH: (libc)Error Codes.
|
||
* ENETDOWN: (libc)Error Codes.
|
||
* ENETRESET: (libc)Error Codes.
|
||
* ENETUNREACH: (libc)Error Codes.
|
||
* ENFILE: (libc)Error Codes.
|
||
* ENOANO: (libc)Error Codes.
|
||
* ENOBUFS: (libc)Error Codes.
|
||
* ENOCSI: (libc)Error Codes.
|
||
* ENODATA: (libc)Error Codes.
|
||
* ENODEV: (libc)Error Codes.
|
||
* ENOENT: (libc)Error Codes.
|
||
* ENOEXEC: (libc)Error Codes.
|
||
* ENOKEY: (libc)Error Codes.
|
||
* ENOLCK: (libc)Error Codes.
|
||
* ENOLINK: (libc)Error Codes.
|
||
* ENOMEDIUM: (libc)Error Codes.
|
||
* ENOMEM: (libc)Error Codes.
|
||
* ENOMSG: (libc)Error Codes.
|
||
* ENONET: (libc)Error Codes.
|
||
* ENOPKG: (libc)Error Codes.
|
||
* ENOPROTOOPT: (libc)Error Codes.
|
||
* ENOSPC: (libc)Error Codes.
|
||
* ENOSR: (libc)Error Codes.
|
||
* ENOSTR: (libc)Error Codes.
|
||
* ENOSYS: (libc)Error Codes.
|
||
* ENOTBLK: (libc)Error Codes.
|
||
* ENOTCONN: (libc)Error Codes.
|
||
* ENOTDIR: (libc)Error Codes.
|
||
* ENOTEMPTY: (libc)Error Codes.
|
||
* ENOTNAM: (libc)Error Codes.
|
||
* ENOTRECOVERABLE: (libc)Error Codes.
|
||
* ENOTSOCK: (libc)Error Codes.
|
||
* ENOTSUP: (libc)Error Codes.
|
||
* ENOTTY: (libc)Error Codes.
|
||
* ENOTUNIQ: (libc)Error Codes.
|
||
* ENXIO: (libc)Error Codes.
|
||
* EOF: (libc)EOF and Errors.
|
||
* EOPNOTSUPP: (libc)Error Codes.
|
||
* EOVERFLOW: (libc)Error Codes.
|
||
* EOWNERDEAD: (libc)Error Codes.
|
||
* EPERM: (libc)Error Codes.
|
||
* EPFNOSUPPORT: (libc)Error Codes.
|
||
* EPIPE: (libc)Error Codes.
|
||
* EPROCLIM: (libc)Error Codes.
|
||
* EPROCUNAVAIL: (libc)Error Codes.
|
||
* EPROGMISMATCH: (libc)Error Codes.
|
||
* EPROGUNAVAIL: (libc)Error Codes.
|
||
* EPROTO: (libc)Error Codes.
|
||
* EPROTONOSUPPORT: (libc)Error Codes.
|
||
* EPROTOTYPE: (libc)Error Codes.
|
||
* EQUIV_CLASS_MAX: (libc)Utility Limits.
|
||
* ERANGE: (libc)Error Codes.
|
||
* EREMCHG: (libc)Error Codes.
|
||
* EREMOTE: (libc)Error Codes.
|
||
* EREMOTEIO: (libc)Error Codes.
|
||
* ERESTART: (libc)Error Codes.
|
||
* ERFKILL: (libc)Error Codes.
|
||
* EROFS: (libc)Error Codes.
|
||
* ERPCMISMATCH: (libc)Error Codes.
|
||
* ESHUTDOWN: (libc)Error Codes.
|
||
* ESOCKTNOSUPPORT: (libc)Error Codes.
|
||
* ESPIPE: (libc)Error Codes.
|
||
* ESRCH: (libc)Error Codes.
|
||
* ESRMNT: (libc)Error Codes.
|
||
* ESTALE: (libc)Error Codes.
|
||
* ESTRPIPE: (libc)Error Codes.
|
||
* ETIME: (libc)Error Codes.
|
||
* ETIMEDOUT: (libc)Error Codes.
|
||
* ETOOMANYREFS: (libc)Error Codes.
|
||
* ETXTBSY: (libc)Error Codes.
|
||
* EUCLEAN: (libc)Error Codes.
|
||
* EUNATCH: (libc)Error Codes.
|
||
* EUSERS: (libc)Error Codes.
|
||
* EWOULDBLOCK: (libc)Error Codes.
|
||
* EXDEV: (libc)Error Codes.
|
||
* EXFULL: (libc)Error Codes.
|
||
* EXIT_FAILURE: (libc)Exit Status.
|
||
* EXIT_SUCCESS: (libc)Exit Status.
|
||
* EXPR_NEST_MAX: (libc)Utility Limits.
|
||
* FD_CLOEXEC: (libc)Descriptor Flags.
|
||
* FD_CLR: (libc)Waiting for I/O.
|
||
* FD_ISSET: (libc)Waiting for I/O.
|
||
* FD_SET: (libc)Waiting for I/O.
|
||
* FD_SETSIZE: (libc)Waiting for I/O.
|
||
* FD_ZERO: (libc)Waiting for I/O.
|
||
* FE_SNANS_ALWAYS_SIGNAL: (libc)Infinity and NaN.
|
||
* FILENAME_MAX: (libc)Limits for Files.
|
||
* FLUSHO: (libc)Local Modes.
|
||
* FOPEN_MAX: (libc)Opening Streams.
|
||
* FP_ILOGB0: (libc)Exponents and Logarithms.
|
||
* FP_ILOGBNAN: (libc)Exponents and Logarithms.
|
||
* FP_LLOGB0: (libc)Exponents and Logarithms.
|
||
* FP_LLOGBNAN: (libc)Exponents and Logarithms.
|
||
* F_DUPFD: (libc)Duplicating Descriptors.
|
||
* F_GETFD: (libc)Descriptor Flags.
|
||
* F_GETFL: (libc)Getting File Status Flags.
|
||
* F_GETLK: (libc)File Locks.
|
||
* F_GETOWN: (libc)Interrupt Input.
|
||
* F_OFD_GETLK: (libc)Open File Description Locks.
|
||
* F_OFD_SETLK: (libc)Open File Description Locks.
|
||
* F_OFD_SETLKW: (libc)Open File Description Locks.
|
||
* F_OK: (libc)Testing File Access.
|
||
* F_SETFD: (libc)Descriptor Flags.
|
||
* F_SETFL: (libc)Getting File Status Flags.
|
||
* F_SETLK: (libc)File Locks.
|
||
* F_SETLKW: (libc)File Locks.
|
||
* F_SETOWN: (libc)Interrupt Input.
|
||
* HUGE_VAL: (libc)Math Error Reporting.
|
||
* HUGE_VALF: (libc)Math Error Reporting.
|
||
* HUGE_VALL: (libc)Math Error Reporting.
|
||
* HUGE_VAL_FN: (libc)Math Error Reporting.
|
||
* HUGE_VAL_FNx: (libc)Math Error Reporting.
|
||
* HUPCL: (libc)Control Modes.
|
||
* I: (libc)Complex Numbers.
|
||
* ICANON: (libc)Local Modes.
|
||
* ICRNL: (libc)Input Modes.
|
||
* IEXTEN: (libc)Local Modes.
|
||
* IFNAMSIZ: (libc)Interface Naming.
|
||
* IFTODT: (libc)Directory Entries.
|
||
* IGNBRK: (libc)Input Modes.
|
||
* IGNCR: (libc)Input Modes.
|
||
* IGNPAR: (libc)Input Modes.
|
||
* IMAXBEL: (libc)Input Modes.
|
||
* INADDR_ANY: (libc)Host Address Data Type.
|
||
* INADDR_BROADCAST: (libc)Host Address Data Type.
|
||
* INADDR_LOOPBACK: (libc)Host Address Data Type.
|
||
* INADDR_NONE: (libc)Host Address Data Type.
|
||
* INFINITY: (libc)Infinity and NaN.
|
||
* INLCR: (libc)Input Modes.
|
||
* INPCK: (libc)Input Modes.
|
||
* IPPORT_RESERVED: (libc)Ports.
|
||
* IPPORT_USERRESERVED: (libc)Ports.
|
||
* ISIG: (libc)Local Modes.
|
||
* ISTRIP: (libc)Input Modes.
|
||
* IXANY: (libc)Input Modes.
|
||
* IXOFF: (libc)Input Modes.
|
||
* IXON: (libc)Input Modes.
|
||
* LINE_MAX: (libc)Utility Limits.
|
||
* LINK_MAX: (libc)Limits for Files.
|
||
* L_ctermid: (libc)Identifying the Terminal.
|
||
* L_cuserid: (libc)Who Logged In.
|
||
* L_tmpnam: (libc)Temporary Files.
|
||
* MAXNAMLEN: (libc)Limits for Files.
|
||
* MAXSYMLINKS: (libc)Symbolic Links.
|
||
* MAX_CANON: (libc)Limits for Files.
|
||
* MAX_INPUT: (libc)Limits for Files.
|
||
* MB_CUR_MAX: (libc)Selecting the Conversion.
|
||
* MB_LEN_MAX: (libc)Selecting the Conversion.
|
||
* MDMBUF: (libc)Control Modes.
|
||
* MSG_DONTROUTE: (libc)Socket Data Options.
|
||
* MSG_OOB: (libc)Socket Data Options.
|
||
* MSG_PEEK: (libc)Socket Data Options.
|
||
* NAME_MAX: (libc)Limits for Files.
|
||
* NAN: (libc)Infinity and NaN.
|
||
* NCCS: (libc)Mode Data Types.
|
||
* NGROUPS_MAX: (libc)General Limits.
|
||
* NOFLSH: (libc)Local Modes.
|
||
* NOKERNINFO: (libc)Local Modes.
|
||
* NSIG: (libc)Standard Signals.
|
||
* NULL: (libc)Null Pointer Constant.
|
||
* ONLCR: (libc)Output Modes.
|
||
* ONOEOT: (libc)Output Modes.
|
||
* OPEN_MAX: (libc)General Limits.
|
||
* OPOST: (libc)Output Modes.
|
||
* OXTABS: (libc)Output Modes.
|
||
* O_ACCMODE: (libc)Access Modes.
|
||
* O_APPEND: (libc)Operating Modes.
|
||
* O_ASYNC: (libc)Operating Modes.
|
||
* O_CREAT: (libc)Open-time Flags.
|
||
* O_EXCL: (libc)Open-time Flags.
|
||
* O_EXEC: (libc)Access Modes.
|
||
* O_EXLOCK: (libc)Open-time Flags.
|
||
* O_FSYNC: (libc)Operating Modes.
|
||
* O_IGNORE_CTTY: (libc)Open-time Flags.
|
||
* O_NDELAY: (libc)Operating Modes.
|
||
* O_NOATIME: (libc)Operating Modes.
|
||
* O_NOCTTY: (libc)Open-time Flags.
|
||
* O_NOLINK: (libc)Open-time Flags.
|
||
* O_NONBLOCK: (libc)Open-time Flags.
|
||
* O_NONBLOCK: (libc)Operating Modes.
|
||
* O_NOTRANS: (libc)Open-time Flags.
|
||
* O_RDONLY: (libc)Access Modes.
|
||
* O_RDWR: (libc)Access Modes.
|
||
* O_READ: (libc)Access Modes.
|
||
* O_SHLOCK: (libc)Open-time Flags.
|
||
* O_SYNC: (libc)Operating Modes.
|
||
* O_TMPFILE: (libc)Open-time Flags.
|
||
* O_TRUNC: (libc)Open-time Flags.
|
||
* O_WRITE: (libc)Access Modes.
|
||
* O_WRONLY: (libc)Access Modes.
|
||
* PARENB: (libc)Control Modes.
|
||
* PARMRK: (libc)Input Modes.
|
||
* PARODD: (libc)Control Modes.
|
||
* PATH_MAX: (libc)Limits for Files.
|
||
* PA_FLAG_MASK: (libc)Parsing a Template String.
|
||
* PENDIN: (libc)Local Modes.
|
||
* PF_FILE: (libc)Local Namespace Details.
|
||
* PF_INET6: (libc)Internet Namespace.
|
||
* PF_INET: (libc)Internet Namespace.
|
||
* PF_LOCAL: (libc)Local Namespace Details.
|
||
* PF_UNIX: (libc)Local Namespace Details.
|
||
* PIPE_BUF: (libc)Limits for Files.
|
||
* P_tmpdir: (libc)Temporary Files.
|
||
* RAND_MAX: (libc)ISO Random.
|
||
* RE_DUP_MAX: (libc)General Limits.
|
||
* RLIM_INFINITY: (libc)Limits on Resources.
|
||
* R_OK: (libc)Testing File Access.
|
||
* SA_NOCLDSTOP: (libc)Flags for Sigaction.
|
||
* SA_ONSTACK: (libc)Flags for Sigaction.
|
||
* SA_RESTART: (libc)Flags for Sigaction.
|
||
* SEEK_CUR: (libc)File Positioning.
|
||
* SEEK_END: (libc)File Positioning.
|
||
* SEEK_SET: (libc)File Positioning.
|
||
* SIGABRT: (libc)Program Error Signals.
|
||
* SIGALRM: (libc)Alarm Signals.
|
||
* SIGBUS: (libc)Program Error Signals.
|
||
* SIGCHLD: (libc)Job Control Signals.
|
||
* SIGCLD: (libc)Job Control Signals.
|
||
* SIGCONT: (libc)Job Control Signals.
|
||
* SIGEMT: (libc)Program Error Signals.
|
||
* SIGFPE: (libc)Program Error Signals.
|
||
* SIGHUP: (libc)Termination Signals.
|
||
* SIGILL: (libc)Program Error Signals.
|
||
* SIGINFO: (libc)Miscellaneous Signals.
|
||
* SIGINT: (libc)Termination Signals.
|
||
* SIGIO: (libc)Asynchronous I/O Signals.
|
||
* SIGIOT: (libc)Program Error Signals.
|
||
* SIGKILL: (libc)Termination Signals.
|
||
* SIGLOST: (libc)Operation Error Signals.
|
||
* SIGPIPE: (libc)Operation Error Signals.
|
||
* SIGPOLL: (libc)Asynchronous I/O Signals.
|
||
* SIGPROF: (libc)Alarm Signals.
|
||
* SIGQUIT: (libc)Termination Signals.
|
||
* SIGSEGV: (libc)Program Error Signals.
|
||
* SIGSTOP: (libc)Job Control Signals.
|
||
* SIGSYS: (libc)Program Error Signals.
|
||
* SIGTERM: (libc)Termination Signals.
|
||
* SIGTRAP: (libc)Program Error Signals.
|
||
* SIGTSTP: (libc)Job Control Signals.
|
||
* SIGTTIN: (libc)Job Control Signals.
|
||
* SIGTTOU: (libc)Job Control Signals.
|
||
* SIGURG: (libc)Asynchronous I/O Signals.
|
||
* SIGUSR1: (libc)Miscellaneous Signals.
|
||
* SIGUSR2: (libc)Miscellaneous Signals.
|
||
* SIGVTALRM: (libc)Alarm Signals.
|
||
* SIGWINCH: (libc)Miscellaneous Signals.
|
||
* SIGXCPU: (libc)Operation Error Signals.
|
||
* SIGXFSZ: (libc)Operation Error Signals.
|
||
* SIG_ERR: (libc)Basic Signal Handling.
|
||
* SNAN: (libc)Infinity and NaN.
|
||
* SNANF: (libc)Infinity and NaN.
|
||
* SNANFN: (libc)Infinity and NaN.
|
||
* SNANFNx: (libc)Infinity and NaN.
|
||
* SNANL: (libc)Infinity and NaN.
|
||
* SOCK_DGRAM: (libc)Communication Styles.
|
||
* SOCK_RAW: (libc)Communication Styles.
|
||
* SOCK_RDM: (libc)Communication Styles.
|
||
* SOCK_SEQPACKET: (libc)Communication Styles.
|
||
* SOCK_STREAM: (libc)Communication Styles.
|
||
* SOL_SOCKET: (libc)Socket-Level Options.
|
||
* SSIZE_MAX: (libc)General Limits.
|
||
* STREAM_MAX: (libc)General Limits.
|
||
* SUN_LEN: (libc)Local Namespace Details.
|
||
* S_IFMT: (libc)Testing File Type.
|
||
* S_ISBLK: (libc)Testing File Type.
|
||
* S_ISCHR: (libc)Testing File Type.
|
||
* S_ISDIR: (libc)Testing File Type.
|
||
* S_ISFIFO: (libc)Testing File Type.
|
||
* S_ISLNK: (libc)Testing File Type.
|
||
* S_ISREG: (libc)Testing File Type.
|
||
* S_ISSOCK: (libc)Testing File Type.
|
||
* S_TYPEISMQ: (libc)Testing File Type.
|
||
* S_TYPEISSEM: (libc)Testing File Type.
|
||
* S_TYPEISSHM: (libc)Testing File Type.
|
||
* TMP_MAX: (libc)Temporary Files.
|
||
* TOSTOP: (libc)Local Modes.
|
||
* TZNAME_MAX: (libc)General Limits.
|
||
* VDISCARD: (libc)Other Special.
|
||
* VDSUSP: (libc)Signal Characters.
|
||
* VEOF: (libc)Editing Characters.
|
||
* VEOL2: (libc)Editing Characters.
|
||
* VEOL: (libc)Editing Characters.
|
||
* VERASE: (libc)Editing Characters.
|
||
* VINTR: (libc)Signal Characters.
|
||
* VKILL: (libc)Editing Characters.
|
||
* VLNEXT: (libc)Other Special.
|
||
* VMIN: (libc)Noncanonical Input.
|
||
* VQUIT: (libc)Signal Characters.
|
||
* VREPRINT: (libc)Editing Characters.
|
||
* VSTART: (libc)Start/Stop Characters.
|
||
* VSTATUS: (libc)Other Special.
|
||
* VSTOP: (libc)Start/Stop Characters.
|
||
* VSUSP: (libc)Signal Characters.
|
||
* VTIME: (libc)Noncanonical Input.
|
||
* VWERASE: (libc)Editing Characters.
|
||
* WCHAR_MAX: (libc)Extended Char Intro.
|
||
* WCHAR_MIN: (libc)Extended Char Intro.
|
||
* WCOREDUMP: (libc)Process Completion Status.
|
||
* WEOF: (libc)EOF and Errors.
|
||
* WEOF: (libc)Extended Char Intro.
|
||
* WEXITSTATUS: (libc)Process Completion Status.
|
||
* WIFEXITED: (libc)Process Completion Status.
|
||
* WIFSIGNALED: (libc)Process Completion Status.
|
||
* WIFSTOPPED: (libc)Process Completion Status.
|
||
* WSTOPSIG: (libc)Process Completion Status.
|
||
* WTERMSIG: (libc)Process Completion Status.
|
||
* W_OK: (libc)Testing File Access.
|
||
* X_OK: (libc)Testing File Access.
|
||
* _Complex_I: (libc)Complex Numbers.
|
||
* _Exit: (libc)Termination Internals.
|
||
* _IOFBF: (libc)Controlling Buffering.
|
||
* _IOLBF: (libc)Controlling Buffering.
|
||
* _IONBF: (libc)Controlling Buffering.
|
||
* _Imaginary_I: (libc)Complex Numbers.
|
||
* _PATH_UTMP: (libc)Manipulating the Database.
|
||
* _PATH_WTMP: (libc)Manipulating the Database.
|
||
* _POSIX2_C_DEV: (libc)System Options.
|
||
* _POSIX2_C_VERSION: (libc)Version Supported.
|
||
* _POSIX2_FORT_DEV: (libc)System Options.
|
||
* _POSIX2_FORT_RUN: (libc)System Options.
|
||
* _POSIX2_LOCALEDEF: (libc)System Options.
|
||
* _POSIX2_SW_DEV: (libc)System Options.
|
||
* _POSIX_CHOWN_RESTRICTED: (libc)Options for Files.
|
||
* _POSIX_JOB_CONTROL: (libc)System Options.
|
||
* _POSIX_NO_TRUNC: (libc)Options for Files.
|
||
* _POSIX_SAVED_IDS: (libc)System Options.
|
||
* _POSIX_VDISABLE: (libc)Options for Files.
|
||
* _POSIX_VERSION: (libc)Version Supported.
|
||
* __fbufsize: (libc)Controlling Buffering.
|
||
* __flbf: (libc)Controlling Buffering.
|
||
* __fpending: (libc)Controlling Buffering.
|
||
* __fpurge: (libc)Flushing Buffers.
|
||
* __freadable: (libc)Opening Streams.
|
||
* __freading: (libc)Opening Streams.
|
||
* __fsetlocking: (libc)Streams and Threads.
|
||
* __fwritable: (libc)Opening Streams.
|
||
* __fwriting: (libc)Opening Streams.
|
||
* __gconv_end_fct: (libc)glibc iconv Implementation.
|
||
* __gconv_fct: (libc)glibc iconv Implementation.
|
||
* __gconv_init_fct: (libc)glibc iconv Implementation.
|
||
* __ppc_get_timebase: (libc)PowerPC.
|
||
* __ppc_get_timebase_freq: (libc)PowerPC.
|
||
* __ppc_mdoio: (libc)PowerPC.
|
||
* __ppc_mdoom: (libc)PowerPC.
|
||
* __ppc_set_ppr_low: (libc)PowerPC.
|
||
* __ppc_set_ppr_med: (libc)PowerPC.
|
||
* __ppc_set_ppr_med_high: (libc)PowerPC.
|
||
* __ppc_set_ppr_med_low: (libc)PowerPC.
|
||
* __ppc_set_ppr_very_low: (libc)PowerPC.
|
||
* __ppc_yield: (libc)PowerPC.
|
||
* __riscv_flush_icache: (libc)RISC-V.
|
||
* __va_copy: (libc)Argument Macros.
|
||
* _exit: (libc)Termination Internals.
|
||
* _flushlbf: (libc)Flushing Buffers.
|
||
* _tolower: (libc)Case Conversion.
|
||
* _toupper: (libc)Case Conversion.
|
||
* a64l: (libc)Encode Binary Data.
|
||
* abort: (libc)Aborting a Program.
|
||
* abs: (libc)Absolute Value.
|
||
* accept: (libc)Accepting Connections.
|
||
* access: (libc)Testing File Access.
|
||
* acos: (libc)Inverse Trig Functions.
|
||
* acosf: (libc)Inverse Trig Functions.
|
||
* acosfN: (libc)Inverse Trig Functions.
|
||
* acosfNx: (libc)Inverse Trig Functions.
|
||
* acosh: (libc)Hyperbolic Functions.
|
||
* acoshf: (libc)Hyperbolic Functions.
|
||
* acoshfN: (libc)Hyperbolic Functions.
|
||
* acoshfNx: (libc)Hyperbolic Functions.
|
||
* acoshl: (libc)Hyperbolic Functions.
|
||
* acosl: (libc)Inverse Trig Functions.
|
||
* addmntent: (libc)mtab.
|
||
* addseverity: (libc)Adding Severity Classes.
|
||
* adjtime: (libc)High-Resolution Calendar.
|
||
* adjtimex: (libc)High-Resolution Calendar.
|
||
* aio_cancel64: (libc)Cancel AIO Operations.
|
||
* aio_cancel: (libc)Cancel AIO Operations.
|
||
* aio_error64: (libc)Status of AIO Operations.
|
||
* aio_error: (libc)Status of AIO Operations.
|
||
* aio_fsync64: (libc)Synchronizing AIO Operations.
|
||
* aio_fsync: (libc)Synchronizing AIO Operations.
|
||
* aio_init: (libc)Configuration of AIO.
|
||
* aio_read64: (libc)Asynchronous Reads/Writes.
|
||
* aio_read: (libc)Asynchronous Reads/Writes.
|
||
* aio_return64: (libc)Status of AIO Operations.
|
||
* aio_return: (libc)Status of AIO Operations.
|
||
* aio_suspend64: (libc)Synchronizing AIO Operations.
|
||
* aio_suspend: (libc)Synchronizing AIO Operations.
|
||
* aio_write64: (libc)Asynchronous Reads/Writes.
|
||
* aio_write: (libc)Asynchronous Reads/Writes.
|
||
* alarm: (libc)Setting an Alarm.
|
||
* aligned_alloc: (libc)Aligned Memory Blocks.
|
||
* alloca: (libc)Variable Size Automatic.
|
||
* alphasort64: (libc)Scanning Directory Content.
|
||
* alphasort: (libc)Scanning Directory Content.
|
||
* argp_error: (libc)Argp Helper Functions.
|
||
* argp_failure: (libc)Argp Helper Functions.
|
||
* argp_help: (libc)Argp Help.
|
||
* argp_parse: (libc)Argp.
|
||
* argp_state_help: (libc)Argp Helper Functions.
|
||
* argp_usage: (libc)Argp Helper Functions.
|
||
* argz_add: (libc)Argz Functions.
|
||
* argz_add_sep: (libc)Argz Functions.
|
||
* argz_append: (libc)Argz Functions.
|
||
* argz_count: (libc)Argz Functions.
|
||
* argz_create: (libc)Argz Functions.
|
||
* argz_create_sep: (libc)Argz Functions.
|
||
* argz_delete: (libc)Argz Functions.
|
||
* argz_extract: (libc)Argz Functions.
|
||
* argz_insert: (libc)Argz Functions.
|
||
* argz_next: (libc)Argz Functions.
|
||
* argz_replace: (libc)Argz Functions.
|
||
* argz_stringify: (libc)Argz Functions.
|
||
* asctime: (libc)Formatting Calendar Time.
|
||
* asctime_r: (libc)Formatting Calendar Time.
|
||
* asin: (libc)Inverse Trig Functions.
|
||
* asinf: (libc)Inverse Trig Functions.
|
||
* asinfN: (libc)Inverse Trig Functions.
|
||
* asinfNx: (libc)Inverse Trig Functions.
|
||
* asinh: (libc)Hyperbolic Functions.
|
||
* asinhf: (libc)Hyperbolic Functions.
|
||
* asinhfN: (libc)Hyperbolic Functions.
|
||
* asinhfNx: (libc)Hyperbolic Functions.
|
||
* asinhl: (libc)Hyperbolic Functions.
|
||
* asinl: (libc)Inverse Trig Functions.
|
||
* asprintf: (libc)Dynamic Output.
|
||
* assert: (libc)Consistency Checking.
|
||
* assert_perror: (libc)Consistency Checking.
|
||
* atan2: (libc)Inverse Trig Functions.
|
||
* atan2f: (libc)Inverse Trig Functions.
|
||
* atan2fN: (libc)Inverse Trig Functions.
|
||
* atan2fNx: (libc)Inverse Trig Functions.
|
||
* atan2l: (libc)Inverse Trig Functions.
|
||
* atan: (libc)Inverse Trig Functions.
|
||
* atanf: (libc)Inverse Trig Functions.
|
||
* atanfN: (libc)Inverse Trig Functions.
|
||
* atanfNx: (libc)Inverse Trig Functions.
|
||
* atanh: (libc)Hyperbolic Functions.
|
||
* atanhf: (libc)Hyperbolic Functions.
|
||
* atanhfN: (libc)Hyperbolic Functions.
|
||
* atanhfNx: (libc)Hyperbolic Functions.
|
||
* atanhl: (libc)Hyperbolic Functions.
|
||
* atanl: (libc)Inverse Trig Functions.
|
||
* atexit: (libc)Cleanups on Exit.
|
||
* atof: (libc)Parsing of Floats.
|
||
* atoi: (libc)Parsing of Integers.
|
||
* atol: (libc)Parsing of Integers.
|
||
* atoll: (libc)Parsing of Integers.
|
||
* backtrace: (libc)Backtraces.
|
||
* backtrace_symbols: (libc)Backtraces.
|
||
* backtrace_symbols_fd: (libc)Backtraces.
|
||
* basename: (libc)Finding Tokens in a String.
|
||
* basename: (libc)Finding Tokens in a String.
|
||
* bcmp: (libc)String/Array Comparison.
|
||
* bcopy: (libc)Copying Strings and Arrays.
|
||
* bind: (libc)Setting Address.
|
||
* bind_textdomain_codeset: (libc)Charset conversion in gettext.
|
||
* bindtextdomain: (libc)Locating gettext catalog.
|
||
* brk: (libc)Resizing the Data Segment.
|
||
* bsearch: (libc)Array Search Function.
|
||
* btowc: (libc)Converting a Character.
|
||
* bzero: (libc)Copying Strings and Arrays.
|
||
* cabs: (libc)Absolute Value.
|
||
* cabsf: (libc)Absolute Value.
|
||
* cabsfN: (libc)Absolute Value.
|
||
* cabsfNx: (libc)Absolute Value.
|
||
* cabsl: (libc)Absolute Value.
|
||
* cacos: (libc)Inverse Trig Functions.
|
||
* cacosf: (libc)Inverse Trig Functions.
|
||
* cacosfN: (libc)Inverse Trig Functions.
|
||
* cacosfNx: (libc)Inverse Trig Functions.
|
||
* cacosh: (libc)Hyperbolic Functions.
|
||
* cacoshf: (libc)Hyperbolic Functions.
|
||
* cacoshfN: (libc)Hyperbolic Functions.
|
||
* cacoshfNx: (libc)Hyperbolic Functions.
|
||
* cacoshl: (libc)Hyperbolic Functions.
|
||
* cacosl: (libc)Inverse Trig Functions.
|
||
* call_once: (libc)Call Once.
|
||
* calloc: (libc)Allocating Cleared Space.
|
||
* canonicalize: (libc)FP Bit Twiddling.
|
||
* canonicalize_file_name: (libc)Symbolic Links.
|
||
* canonicalizef: (libc)FP Bit Twiddling.
|
||
* canonicalizefN: (libc)FP Bit Twiddling.
|
||
* canonicalizefNx: (libc)FP Bit Twiddling.
|
||
* canonicalizel: (libc)FP Bit Twiddling.
|
||
* carg: (libc)Operations on Complex.
|
||
* cargf: (libc)Operations on Complex.
|
||
* cargfN: (libc)Operations on Complex.
|
||
* cargfNx: (libc)Operations on Complex.
|
||
* cargl: (libc)Operations on Complex.
|
||
* casin: (libc)Inverse Trig Functions.
|
||
* casinf: (libc)Inverse Trig Functions.
|
||
* casinfN: (libc)Inverse Trig Functions.
|
||
* casinfNx: (libc)Inverse Trig Functions.
|
||
* casinh: (libc)Hyperbolic Functions.
|
||
* casinhf: (libc)Hyperbolic Functions.
|
||
* casinhfN: (libc)Hyperbolic Functions.
|
||
* casinhfNx: (libc)Hyperbolic Functions.
|
||
* casinhl: (libc)Hyperbolic Functions.
|
||
* casinl: (libc)Inverse Trig Functions.
|
||
* catan: (libc)Inverse Trig Functions.
|
||
* catanf: (libc)Inverse Trig Functions.
|
||
* catanfN: (libc)Inverse Trig Functions.
|
||
* catanfNx: (libc)Inverse Trig Functions.
|
||
* catanh: (libc)Hyperbolic Functions.
|
||
* catanhf: (libc)Hyperbolic Functions.
|
||
* catanhfN: (libc)Hyperbolic Functions.
|
||
* catanhfNx: (libc)Hyperbolic Functions.
|
||
* catanhl: (libc)Hyperbolic Functions.
|
||
* catanl: (libc)Inverse Trig Functions.
|
||
* catclose: (libc)The catgets Functions.
|
||
* catgets: (libc)The catgets Functions.
|
||
* catopen: (libc)The catgets Functions.
|
||
* cbrt: (libc)Exponents and Logarithms.
|
||
* cbrtf: (libc)Exponents and Logarithms.
|
||
* cbrtfN: (libc)Exponents and Logarithms.
|
||
* cbrtfNx: (libc)Exponents and Logarithms.
|
||
* cbrtl: (libc)Exponents and Logarithms.
|
||
* ccos: (libc)Trig Functions.
|
||
* ccosf: (libc)Trig Functions.
|
||
* ccosfN: (libc)Trig Functions.
|
||
* ccosfNx: (libc)Trig Functions.
|
||
* ccosh: (libc)Hyperbolic Functions.
|
||
* ccoshf: (libc)Hyperbolic Functions.
|
||
* ccoshfN: (libc)Hyperbolic Functions.
|
||
* ccoshfNx: (libc)Hyperbolic Functions.
|
||
* ccoshl: (libc)Hyperbolic Functions.
|
||
* ccosl: (libc)Trig Functions.
|
||
* ceil: (libc)Rounding Functions.
|
||
* ceilf: (libc)Rounding Functions.
|
||
* ceilfN: (libc)Rounding Functions.
|
||
* ceilfNx: (libc)Rounding Functions.
|
||
* ceill: (libc)Rounding Functions.
|
||
* cexp: (libc)Exponents and Logarithms.
|
||
* cexpf: (libc)Exponents and Logarithms.
|
||
* cexpfN: (libc)Exponents and Logarithms.
|
||
* cexpfNx: (libc)Exponents and Logarithms.
|
||
* cexpl: (libc)Exponents and Logarithms.
|
||
* cfgetispeed: (libc)Line Speed.
|
||
* cfgetospeed: (libc)Line Speed.
|
||
* cfmakeraw: (libc)Noncanonical Input.
|
||
* cfsetispeed: (libc)Line Speed.
|
||
* cfsetospeed: (libc)Line Speed.
|
||
* cfsetspeed: (libc)Line Speed.
|
||
* chdir: (libc)Working Directory.
|
||
* chmod: (libc)Setting Permissions.
|
||
* chown: (libc)File Owner.
|
||
* cimag: (libc)Operations on Complex.
|
||
* cimagf: (libc)Operations on Complex.
|
||
* cimagfN: (libc)Operations on Complex.
|
||
* cimagfNx: (libc)Operations on Complex.
|
||
* cimagl: (libc)Operations on Complex.
|
||
* clearenv: (libc)Environment Access.
|
||
* clearerr: (libc)Error Recovery.
|
||
* clearerr_unlocked: (libc)Error Recovery.
|
||
* clock: (libc)CPU Time.
|
||
* clog10: (libc)Exponents and Logarithms.
|
||
* clog10f: (libc)Exponents and Logarithms.
|
||
* clog10fN: (libc)Exponents and Logarithms.
|
||
* clog10fNx: (libc)Exponents and Logarithms.
|
||
* clog10l: (libc)Exponents and Logarithms.
|
||
* clog: (libc)Exponents and Logarithms.
|
||
* clogf: (libc)Exponents and Logarithms.
|
||
* clogfN: (libc)Exponents and Logarithms.
|
||
* clogfNx: (libc)Exponents and Logarithms.
|
||
* clogl: (libc)Exponents and Logarithms.
|
||
* close: (libc)Opening and Closing Files.
|
||
* closedir: (libc)Reading/Closing Directory.
|
||
* closelog: (libc)closelog.
|
||
* cnd_broadcast: (libc)ISO C Condition Variables.
|
||
* cnd_destroy: (libc)ISO C Condition Variables.
|
||
* cnd_init: (libc)ISO C Condition Variables.
|
||
* cnd_signal: (libc)ISO C Condition Variables.
|
||
* cnd_timedwait: (libc)ISO C Condition Variables.
|
||
* cnd_wait: (libc)ISO C Condition Variables.
|
||
* confstr: (libc)String Parameters.
|
||
* conj: (libc)Operations on Complex.
|
||
* conjf: (libc)Operations on Complex.
|
||
* conjfN: (libc)Operations on Complex.
|
||
* conjfNx: (libc)Operations on Complex.
|
||
* conjl: (libc)Operations on Complex.
|
||
* connect: (libc)Connecting.
|
||
* copy_file_range: (libc)Copying File Data.
|
||
* copysign: (libc)FP Bit Twiddling.
|
||
* copysignf: (libc)FP Bit Twiddling.
|
||
* copysignfN: (libc)FP Bit Twiddling.
|
||
* copysignfNx: (libc)FP Bit Twiddling.
|
||
* copysignl: (libc)FP Bit Twiddling.
|
||
* cos: (libc)Trig Functions.
|
||
* cosf: (libc)Trig Functions.
|
||
* cosfN: (libc)Trig Functions.
|
||
* cosfNx: (libc)Trig Functions.
|
||
* cosh: (libc)Hyperbolic Functions.
|
||
* coshf: (libc)Hyperbolic Functions.
|
||
* coshfN: (libc)Hyperbolic Functions.
|
||
* coshfNx: (libc)Hyperbolic Functions.
|
||
* coshl: (libc)Hyperbolic Functions.
|
||
* cosl: (libc)Trig Functions.
|
||
* cpow: (libc)Exponents and Logarithms.
|
||
* cpowf: (libc)Exponents and Logarithms.
|
||
* cpowfN: (libc)Exponents and Logarithms.
|
||
* cpowfNx: (libc)Exponents and Logarithms.
|
||
* cpowl: (libc)Exponents and Logarithms.
|
||
* cproj: (libc)Operations on Complex.
|
||
* cprojf: (libc)Operations on Complex.
|
||
* cprojfN: (libc)Operations on Complex.
|
||
* cprojfNx: (libc)Operations on Complex.
|
||
* cprojl: (libc)Operations on Complex.
|
||
* creal: (libc)Operations on Complex.
|
||
* crealf: (libc)Operations on Complex.
|
||
* crealfN: (libc)Operations on Complex.
|
||
* crealfNx: (libc)Operations on Complex.
|
||
* creall: (libc)Operations on Complex.
|
||
* creat64: (libc)Opening and Closing Files.
|
||
* creat: (libc)Opening and Closing Files.
|
||
* crypt: (libc)Passphrase Storage.
|
||
* crypt_r: (libc)Passphrase Storage.
|
||
* csin: (libc)Trig Functions.
|
||
* csinf: (libc)Trig Functions.
|
||
* csinfN: (libc)Trig Functions.
|
||
* csinfNx: (libc)Trig Functions.
|
||
* csinh: (libc)Hyperbolic Functions.
|
||
* csinhf: (libc)Hyperbolic Functions.
|
||
* csinhfN: (libc)Hyperbolic Functions.
|
||
* csinhfNx: (libc)Hyperbolic Functions.
|
||
* csinhl: (libc)Hyperbolic Functions.
|
||
* csinl: (libc)Trig Functions.
|
||
* csqrt: (libc)Exponents and Logarithms.
|
||
* csqrtf: (libc)Exponents and Logarithms.
|
||
* csqrtfN: (libc)Exponents and Logarithms.
|
||
* csqrtfNx: (libc)Exponents and Logarithms.
|
||
* csqrtl: (libc)Exponents and Logarithms.
|
||
* ctan: (libc)Trig Functions.
|
||
* ctanf: (libc)Trig Functions.
|
||
* ctanfN: (libc)Trig Functions.
|
||
* ctanfNx: (libc)Trig Functions.
|
||
* ctanh: (libc)Hyperbolic Functions.
|
||
* ctanhf: (libc)Hyperbolic Functions.
|
||
* ctanhfN: (libc)Hyperbolic Functions.
|
||
* ctanhfNx: (libc)Hyperbolic Functions.
|
||
* ctanhl: (libc)Hyperbolic Functions.
|
||
* ctanl: (libc)Trig Functions.
|
||
* ctermid: (libc)Identifying the Terminal.
|
||
* ctime: (libc)Formatting Calendar Time.
|
||
* ctime_r: (libc)Formatting Calendar Time.
|
||
* cuserid: (libc)Who Logged In.
|
||
* daddl: (libc)Misc FP Arithmetic.
|
||
* dcgettext: (libc)Translation with gettext.
|
||
* dcngettext: (libc)Advanced gettext functions.
|
||
* ddivl: (libc)Misc FP Arithmetic.
|
||
* dgettext: (libc)Translation with gettext.
|
||
* difftime: (libc)Elapsed Time.
|
||
* dirfd: (libc)Opening a Directory.
|
||
* dirname: (libc)Finding Tokens in a String.
|
||
* div: (libc)Integer Division.
|
||
* dmull: (libc)Misc FP Arithmetic.
|
||
* dngettext: (libc)Advanced gettext functions.
|
||
* drand48: (libc)SVID Random.
|
||
* drand48_r: (libc)SVID Random.
|
||
* drem: (libc)Remainder Functions.
|
||
* dremf: (libc)Remainder Functions.
|
||
* dreml: (libc)Remainder Functions.
|
||
* dsubl: (libc)Misc FP Arithmetic.
|
||
* dup2: (libc)Duplicating Descriptors.
|
||
* dup: (libc)Duplicating Descriptors.
|
||
* ecvt: (libc)System V Number Conversion.
|
||
* ecvt_r: (libc)System V Number Conversion.
|
||
* endfsent: (libc)fstab.
|
||
* endgrent: (libc)Scanning All Groups.
|
||
* endhostent: (libc)Host Names.
|
||
* endmntent: (libc)mtab.
|
||
* endnetent: (libc)Networks Database.
|
||
* endnetgrent: (libc)Lookup Netgroup.
|
||
* endprotoent: (libc)Protocols Database.
|
||
* endpwent: (libc)Scanning All Users.
|
||
* endservent: (libc)Services Database.
|
||
* endutent: (libc)Manipulating the Database.
|
||
* endutxent: (libc)XPG Functions.
|
||
* envz_add: (libc)Envz Functions.
|
||
* envz_entry: (libc)Envz Functions.
|
||
* envz_get: (libc)Envz Functions.
|
||
* envz_merge: (libc)Envz Functions.
|
||
* envz_remove: (libc)Envz Functions.
|
||
* envz_strip: (libc)Envz Functions.
|
||
* erand48: (libc)SVID Random.
|
||
* erand48_r: (libc)SVID Random.
|
||
* erf: (libc)Special Functions.
|
||
* erfc: (libc)Special Functions.
|
||
* erfcf: (libc)Special Functions.
|
||
* erfcfN: (libc)Special Functions.
|
||
* erfcfNx: (libc)Special Functions.
|
||
* erfcl: (libc)Special Functions.
|
||
* erff: (libc)Special Functions.
|
||
* erffN: (libc)Special Functions.
|
||
* erffNx: (libc)Special Functions.
|
||
* erfl: (libc)Special Functions.
|
||
* err: (libc)Error Messages.
|
||
* errno: (libc)Checking for Errors.
|
||
* error: (libc)Error Messages.
|
||
* error_at_line: (libc)Error Messages.
|
||
* errx: (libc)Error Messages.
|
||
* execl: (libc)Executing a File.
|
||
* execle: (libc)Executing a File.
|
||
* execlp: (libc)Executing a File.
|
||
* execv: (libc)Executing a File.
|
||
* execve: (libc)Executing a File.
|
||
* execvp: (libc)Executing a File.
|
||
* exit: (libc)Normal Termination.
|
||
* exp10: (libc)Exponents and Logarithms.
|
||
* exp10f: (libc)Exponents and Logarithms.
|
||
* exp10fN: (libc)Exponents and Logarithms.
|
||
* exp10fNx: (libc)Exponents and Logarithms.
|
||
* exp10l: (libc)Exponents and Logarithms.
|
||
* exp2: (libc)Exponents and Logarithms.
|
||
* exp2f: (libc)Exponents and Logarithms.
|
||
* exp2fN: (libc)Exponents and Logarithms.
|
||
* exp2fNx: (libc)Exponents and Logarithms.
|
||
* exp2l: (libc)Exponents and Logarithms.
|
||
* exp: (libc)Exponents and Logarithms.
|
||
* expf: (libc)Exponents and Logarithms.
|
||
* expfN: (libc)Exponents and Logarithms.
|
||
* expfNx: (libc)Exponents and Logarithms.
|
||
* expl: (libc)Exponents and Logarithms.
|
||
* explicit_bzero: (libc)Erasing Sensitive Data.
|
||
* expm1: (libc)Exponents and Logarithms.
|
||
* expm1f: (libc)Exponents and Logarithms.
|
||
* expm1fN: (libc)Exponents and Logarithms.
|
||
* expm1fNx: (libc)Exponents and Logarithms.
|
||
* expm1l: (libc)Exponents and Logarithms.
|
||
* fMaddfN: (libc)Misc FP Arithmetic.
|
||
* fMaddfNx: (libc)Misc FP Arithmetic.
|
||
* fMdivfN: (libc)Misc FP Arithmetic.
|
||
* fMdivfNx: (libc)Misc FP Arithmetic.
|
||
* fMmulfN: (libc)Misc FP Arithmetic.
|
||
* fMmulfNx: (libc)Misc FP Arithmetic.
|
||
* fMsubfN: (libc)Misc FP Arithmetic.
|
||
* fMsubfNx: (libc)Misc FP Arithmetic.
|
||
* fMxaddfN: (libc)Misc FP Arithmetic.
|
||
* fMxaddfNx: (libc)Misc FP Arithmetic.
|
||
* fMxdivfN: (libc)Misc FP Arithmetic.
|
||
* fMxdivfNx: (libc)Misc FP Arithmetic.
|
||
* fMxmulfN: (libc)Misc FP Arithmetic.
|
||
* fMxmulfNx: (libc)Misc FP Arithmetic.
|
||
* fMxsubfN: (libc)Misc FP Arithmetic.
|
||
* fMxsubfNx: (libc)Misc FP Arithmetic.
|
||
* fabs: (libc)Absolute Value.
|
||
* fabsf: (libc)Absolute Value.
|
||
* fabsfN: (libc)Absolute Value.
|
||
* fabsfNx: (libc)Absolute Value.
|
||
* fabsl: (libc)Absolute Value.
|
||
* fadd: (libc)Misc FP Arithmetic.
|
||
* faddl: (libc)Misc FP Arithmetic.
|
||
* fchdir: (libc)Working Directory.
|
||
* fchmod: (libc)Setting Permissions.
|
||
* fchown: (libc)File Owner.
|
||
* fclose: (libc)Closing Streams.
|
||
* fcloseall: (libc)Closing Streams.
|
||
* fcntl: (libc)Control Operations.
|
||
* fcvt: (libc)System V Number Conversion.
|
||
* fcvt_r: (libc)System V Number Conversion.
|
||
* fdatasync: (libc)Synchronizing I/O.
|
||
* fdim: (libc)Misc FP Arithmetic.
|
||
* fdimf: (libc)Misc FP Arithmetic.
|
||
* fdimfN: (libc)Misc FP Arithmetic.
|
||
* fdimfNx: (libc)Misc FP Arithmetic.
|
||
* fdiml: (libc)Misc FP Arithmetic.
|
||
* fdiv: (libc)Misc FP Arithmetic.
|
||
* fdivl: (libc)Misc FP Arithmetic.
|
||
* fdopen: (libc)Descriptors and Streams.
|
||
* fdopendir: (libc)Opening a Directory.
|
||
* feclearexcept: (libc)Status bit operations.
|
||
* fedisableexcept: (libc)Control Functions.
|
||
* feenableexcept: (libc)Control Functions.
|
||
* fegetenv: (libc)Control Functions.
|
||
* fegetexcept: (libc)Control Functions.
|
||
* fegetexceptflag: (libc)Status bit operations.
|
||
* fegetmode: (libc)Control Functions.
|
||
* fegetround: (libc)Rounding.
|
||
* feholdexcept: (libc)Control Functions.
|
||
* feof: (libc)EOF and Errors.
|
||
* feof_unlocked: (libc)EOF and Errors.
|
||
* feraiseexcept: (libc)Status bit operations.
|
||
* ferror: (libc)EOF and Errors.
|
||
* ferror_unlocked: (libc)EOF and Errors.
|
||
* fesetenv: (libc)Control Functions.
|
||
* fesetexcept: (libc)Status bit operations.
|
||
* fesetexceptflag: (libc)Status bit operations.
|
||
* fesetmode: (libc)Control Functions.
|
||
* fesetround: (libc)Rounding.
|
||
* fetestexcept: (libc)Status bit operations.
|
||
* fetestexceptflag: (libc)Status bit operations.
|
||
* feupdateenv: (libc)Control Functions.
|
||
* fflush: (libc)Flushing Buffers.
|
||
* fflush_unlocked: (libc)Flushing Buffers.
|
||
* fgetc: (libc)Character Input.
|
||
* fgetc_unlocked: (libc)Character Input.
|
||
* fgetgrent: (libc)Scanning All Groups.
|
||
* fgetgrent_r: (libc)Scanning All Groups.
|
||
* fgetpos64: (libc)Portable Positioning.
|
||
* fgetpos: (libc)Portable Positioning.
|
||
* fgetpwent: (libc)Scanning All Users.
|
||
* fgetpwent_r: (libc)Scanning All Users.
|
||
* fgets: (libc)Line Input.
|
||
* fgets_unlocked: (libc)Line Input.
|
||
* fgetwc: (libc)Character Input.
|
||
* fgetwc_unlocked: (libc)Character Input.
|
||
* fgetws: (libc)Line Input.
|
||
* fgetws_unlocked: (libc)Line Input.
|
||
* fileno: (libc)Descriptors and Streams.
|
||
* fileno_unlocked: (libc)Descriptors and Streams.
|
||
* finite: (libc)Floating Point Classes.
|
||
* finitef: (libc)Floating Point Classes.
|
||
* finitel: (libc)Floating Point Classes.
|
||
* flockfile: (libc)Streams and Threads.
|
||
* floor: (libc)Rounding Functions.
|
||
* floorf: (libc)Rounding Functions.
|
||
* floorfN: (libc)Rounding Functions.
|
||
* floorfNx: (libc)Rounding Functions.
|
||
* floorl: (libc)Rounding Functions.
|
||
* fma: (libc)Misc FP Arithmetic.
|
||
* fmaf: (libc)Misc FP Arithmetic.
|
||
* fmafN: (libc)Misc FP Arithmetic.
|
||
* fmafNx: (libc)Misc FP Arithmetic.
|
||
* fmal: (libc)Misc FP Arithmetic.
|
||
* fmax: (libc)Misc FP Arithmetic.
|
||
* fmaxf: (libc)Misc FP Arithmetic.
|
||
* fmaxfN: (libc)Misc FP Arithmetic.
|
||
* fmaxfNx: (libc)Misc FP Arithmetic.
|
||
* fmaxl: (libc)Misc FP Arithmetic.
|
||
* fmaxmag: (libc)Misc FP Arithmetic.
|
||
* fmaxmagf: (libc)Misc FP Arithmetic.
|
||
* fmaxmagfN: (libc)Misc FP Arithmetic.
|
||
* fmaxmagfNx: (libc)Misc FP Arithmetic.
|
||
* fmaxmagl: (libc)Misc FP Arithmetic.
|
||
* fmemopen: (libc)String Streams.
|
||
* fmin: (libc)Misc FP Arithmetic.
|
||
* fminf: (libc)Misc FP Arithmetic.
|
||
* fminfN: (libc)Misc FP Arithmetic.
|
||
* fminfNx: (libc)Misc FP Arithmetic.
|
||
* fminl: (libc)Misc FP Arithmetic.
|
||
* fminmag: (libc)Misc FP Arithmetic.
|
||
* fminmagf: (libc)Misc FP Arithmetic.
|
||
* fminmagfN: (libc)Misc FP Arithmetic.
|
||
* fminmagfNx: (libc)Misc FP Arithmetic.
|
||
* fminmagl: (libc)Misc FP Arithmetic.
|
||
* fmod: (libc)Remainder Functions.
|
||
* fmodf: (libc)Remainder Functions.
|
||
* fmodfN: (libc)Remainder Functions.
|
||
* fmodfNx: (libc)Remainder Functions.
|
||
* fmodl: (libc)Remainder Functions.
|
||
* fmtmsg: (libc)Printing Formatted Messages.
|
||
* fmul: (libc)Misc FP Arithmetic.
|
||
* fmull: (libc)Misc FP Arithmetic.
|
||
* fnmatch: (libc)Wildcard Matching.
|
||
* fopen64: (libc)Opening Streams.
|
||
* fopen: (libc)Opening Streams.
|
||
* fopencookie: (libc)Streams and Cookies.
|
||
* fork: (libc)Creating a Process.
|
||
* forkpty: (libc)Pseudo-Terminal Pairs.
|
||
* fpathconf: (libc)Pathconf.
|
||
* fpclassify: (libc)Floating Point Classes.
|
||
* fprintf: (libc)Formatted Output Functions.
|
||
* fputc: (libc)Simple Output.
|
||
* fputc_unlocked: (libc)Simple Output.
|
||
* fputs: (libc)Simple Output.
|
||
* fputs_unlocked: (libc)Simple Output.
|
||
* fputwc: (libc)Simple Output.
|
||
* fputwc_unlocked: (libc)Simple Output.
|
||
* fputws: (libc)Simple Output.
|
||
* fputws_unlocked: (libc)Simple Output.
|
||
* fread: (libc)Block Input/Output.
|
||
* fread_unlocked: (libc)Block Input/Output.
|
||
* free: (libc)Freeing after Malloc.
|
||
* freopen64: (libc)Opening Streams.
|
||
* freopen: (libc)Opening Streams.
|
||
* frexp: (libc)Normalization Functions.
|
||
* frexpf: (libc)Normalization Functions.
|
||
* frexpfN: (libc)Normalization Functions.
|
||
* frexpfNx: (libc)Normalization Functions.
|
||
* frexpl: (libc)Normalization Functions.
|
||
* fromfp: (libc)Rounding Functions.
|
||
* fromfpf: (libc)Rounding Functions.
|
||
* fromfpfN: (libc)Rounding Functions.
|
||
* fromfpfNx: (libc)Rounding Functions.
|
||
* fromfpl: (libc)Rounding Functions.
|
||
* fromfpx: (libc)Rounding Functions.
|
||
* fromfpxf: (libc)Rounding Functions.
|
||
* fromfpxfN: (libc)Rounding Functions.
|
||
* fromfpxfNx: (libc)Rounding Functions.
|
||
* fromfpxl: (libc)Rounding Functions.
|
||
* fscanf: (libc)Formatted Input Functions.
|
||
* fseek: (libc)File Positioning.
|
||
* fseeko64: (libc)File Positioning.
|
||
* fseeko: (libc)File Positioning.
|
||
* fsetpos64: (libc)Portable Positioning.
|
||
* fsetpos: (libc)Portable Positioning.
|
||
* fstat64: (libc)Reading Attributes.
|
||
* fstat: (libc)Reading Attributes.
|
||
* fsub: (libc)Misc FP Arithmetic.
|
||
* fsubl: (libc)Misc FP Arithmetic.
|
||
* fsync: (libc)Synchronizing I/O.
|
||
* ftell: (libc)File Positioning.
|
||
* ftello64: (libc)File Positioning.
|
||
* ftello: (libc)File Positioning.
|
||
* ftruncate64: (libc)File Size.
|
||
* ftruncate: (libc)File Size.
|
||
* ftrylockfile: (libc)Streams and Threads.
|
||
* ftw64: (libc)Working with Directory Trees.
|
||
* ftw: (libc)Working with Directory Trees.
|
||
* funlockfile: (libc)Streams and Threads.
|
||
* futimes: (libc)File Times.
|
||
* fwide: (libc)Streams and I18N.
|
||
* fwprintf: (libc)Formatted Output Functions.
|
||
* fwrite: (libc)Block Input/Output.
|
||
* fwrite_unlocked: (libc)Block Input/Output.
|
||
* fwscanf: (libc)Formatted Input Functions.
|
||
* gamma: (libc)Special Functions.
|
||
* gammaf: (libc)Special Functions.
|
||
* gammal: (libc)Special Functions.
|
||
* gcvt: (libc)System V Number Conversion.
|
||
* get_avphys_pages: (libc)Query Memory Parameters.
|
||
* get_current_dir_name: (libc)Working Directory.
|
||
* get_nprocs: (libc)Processor Resources.
|
||
* get_nprocs_conf: (libc)Processor Resources.
|
||
* get_phys_pages: (libc)Query Memory Parameters.
|
||
* getauxval: (libc)Auxiliary Vector.
|
||
* getc: (libc)Character Input.
|
||
* getc_unlocked: (libc)Character Input.
|
||
* getchar: (libc)Character Input.
|
||
* getchar_unlocked: (libc)Character Input.
|
||
* getcontext: (libc)System V contexts.
|
||
* getcwd: (libc)Working Directory.
|
||
* getdate: (libc)General Time String Parsing.
|
||
* getdate_r: (libc)General Time String Parsing.
|
||
* getdelim: (libc)Line Input.
|
||
* getdomainnname: (libc)Host Identification.
|
||
* getegid: (libc)Reading Persona.
|
||
* getentropy: (libc)Unpredictable Bytes.
|
||
* getenv: (libc)Environment Access.
|
||
* geteuid: (libc)Reading Persona.
|
||
* getfsent: (libc)fstab.
|
||
* getfsfile: (libc)fstab.
|
||
* getfsspec: (libc)fstab.
|
||
* getgid: (libc)Reading Persona.
|
||
* getgrent: (libc)Scanning All Groups.
|
||
* getgrent_r: (libc)Scanning All Groups.
|
||
* getgrgid: (libc)Lookup Group.
|
||
* getgrgid_r: (libc)Lookup Group.
|
||
* getgrnam: (libc)Lookup Group.
|
||
* getgrnam_r: (libc)Lookup Group.
|
||
* getgrouplist: (libc)Setting Groups.
|
||
* getgroups: (libc)Reading Persona.
|
||
* gethostbyaddr: (libc)Host Names.
|
||
* gethostbyaddr_r: (libc)Host Names.
|
||
* gethostbyname2: (libc)Host Names.
|
||
* gethostbyname2_r: (libc)Host Names.
|
||
* gethostbyname: (libc)Host Names.
|
||
* gethostbyname_r: (libc)Host Names.
|
||
* gethostent: (libc)Host Names.
|
||
* gethostid: (libc)Host Identification.
|
||
* gethostname: (libc)Host Identification.
|
||
* getitimer: (libc)Setting an Alarm.
|
||
* getline: (libc)Line Input.
|
||
* getloadavg: (libc)Processor Resources.
|
||
* getlogin: (libc)Who Logged In.
|
||
* getmntent: (libc)mtab.
|
||
* getmntent_r: (libc)mtab.
|
||
* getnetbyaddr: (libc)Networks Database.
|
||
* getnetbyname: (libc)Networks Database.
|
||
* getnetent: (libc)Networks Database.
|
||
* getnetgrent: (libc)Lookup Netgroup.
|
||
* getnetgrent_r: (libc)Lookup Netgroup.
|
||
* getopt: (libc)Using Getopt.
|
||
* getopt_long: (libc)Getopt Long Options.
|
||
* getopt_long_only: (libc)Getopt Long Options.
|
||
* getpagesize: (libc)Query Memory Parameters.
|
||
* getpass: (libc)getpass.
|
||
* getpayload: (libc)FP Bit Twiddling.
|
||
* getpayloadf: (libc)FP Bit Twiddling.
|
||
* getpayloadfN: (libc)FP Bit Twiddling.
|
||
* getpayloadfNx: (libc)FP Bit Twiddling.
|
||
* getpayloadl: (libc)FP Bit Twiddling.
|
||
* getpeername: (libc)Who is Connected.
|
||
* getpgid: (libc)Process Group Functions.
|
||
* getpgrp: (libc)Process Group Functions.
|
||
* getpid: (libc)Process Identification.
|
||
* getppid: (libc)Process Identification.
|
||
* getpriority: (libc)Traditional Scheduling Functions.
|
||
* getprotobyname: (libc)Protocols Database.
|
||
* getprotobynumber: (libc)Protocols Database.
|
||
* getprotoent: (libc)Protocols Database.
|
||
* getpt: (libc)Allocation.
|
||
* getpwent: (libc)Scanning All Users.
|
||
* getpwent_r: (libc)Scanning All Users.
|
||
* getpwnam: (libc)Lookup User.
|
||
* getpwnam_r: (libc)Lookup User.
|
||
* getpwuid: (libc)Lookup User.
|
||
* getpwuid_r: (libc)Lookup User.
|
||
* getrandom: (libc)Unpredictable Bytes.
|
||
* getrlimit64: (libc)Limits on Resources.
|
||
* getrlimit: (libc)Limits on Resources.
|
||
* getrusage: (libc)Resource Usage.
|
||
* gets: (libc)Line Input.
|
||
* getservbyname: (libc)Services Database.
|
||
* getservbyport: (libc)Services Database.
|
||
* getservent: (libc)Services Database.
|
||
* getsid: (libc)Process Group Functions.
|
||
* getsockname: (libc)Reading Address.
|
||
* getsockopt: (libc)Socket Option Functions.
|
||
* getsubopt: (libc)Suboptions.
|
||
* gettext: (libc)Translation with gettext.
|
||
* gettimeofday: (libc)High-Resolution Calendar.
|
||
* getuid: (libc)Reading Persona.
|
||
* getumask: (libc)Setting Permissions.
|
||
* getutent: (libc)Manipulating the Database.
|
||
* getutent_r: (libc)Manipulating the Database.
|
||
* getutid: (libc)Manipulating the Database.
|
||
* getutid_r: (libc)Manipulating the Database.
|
||
* getutline: (libc)Manipulating the Database.
|
||
* getutline_r: (libc)Manipulating the Database.
|
||
* getutmp: (libc)XPG Functions.
|
||
* getutmpx: (libc)XPG Functions.
|
||
* getutxent: (libc)XPG Functions.
|
||
* getutxid: (libc)XPG Functions.
|
||
* getutxline: (libc)XPG Functions.
|
||
* getw: (libc)Character Input.
|
||
* getwc: (libc)Character Input.
|
||
* getwc_unlocked: (libc)Character Input.
|
||
* getwchar: (libc)Character Input.
|
||
* getwchar_unlocked: (libc)Character Input.
|
||
* getwd: (libc)Working Directory.
|
||
* glob64: (libc)Calling Glob.
|
||
* glob: (libc)Calling Glob.
|
||
* globfree64: (libc)More Flags for Globbing.
|
||
* globfree: (libc)More Flags for Globbing.
|
||
* gmtime: (libc)Broken-down Time.
|
||
* gmtime_r: (libc)Broken-down Time.
|
||
* grantpt: (libc)Allocation.
|
||
* gsignal: (libc)Signaling Yourself.
|
||
* gtty: (libc)BSD Terminal Modes.
|
||
* hasmntopt: (libc)mtab.
|
||
* hcreate: (libc)Hash Search Function.
|
||
* hcreate_r: (libc)Hash Search Function.
|
||
* hdestroy: (libc)Hash Search Function.
|
||
* hdestroy_r: (libc)Hash Search Function.
|
||
* hsearch: (libc)Hash Search Function.
|
||
* hsearch_r: (libc)Hash Search Function.
|
||
* htonl: (libc)Byte Order.
|
||
* htons: (libc)Byte Order.
|
||
* hypot: (libc)Exponents and Logarithms.
|
||
* hypotf: (libc)Exponents and Logarithms.
|
||
* hypotfN: (libc)Exponents and Logarithms.
|
||
* hypotfNx: (libc)Exponents and Logarithms.
|
||
* hypotl: (libc)Exponents and Logarithms.
|
||
* iconv: (libc)Generic Conversion Interface.
|
||
* iconv_close: (libc)Generic Conversion Interface.
|
||
* iconv_open: (libc)Generic Conversion Interface.
|
||
* if_freenameindex: (libc)Interface Naming.
|
||
* if_indextoname: (libc)Interface Naming.
|
||
* if_nameindex: (libc)Interface Naming.
|
||
* if_nametoindex: (libc)Interface Naming.
|
||
* ilogb: (libc)Exponents and Logarithms.
|
||
* ilogbf: (libc)Exponents and Logarithms.
|
||
* ilogbfN: (libc)Exponents and Logarithms.
|
||
* ilogbfNx: (libc)Exponents and Logarithms.
|
||
* ilogbl: (libc)Exponents and Logarithms.
|
||
* imaxabs: (libc)Absolute Value.
|
||
* imaxdiv: (libc)Integer Division.
|
||
* in6addr_any: (libc)Host Address Data Type.
|
||
* in6addr_loopback: (libc)Host Address Data Type.
|
||
* index: (libc)Search Functions.
|
||
* inet_addr: (libc)Host Address Functions.
|
||
* inet_aton: (libc)Host Address Functions.
|
||
* inet_lnaof: (libc)Host Address Functions.
|
||
* inet_makeaddr: (libc)Host Address Functions.
|
||
* inet_netof: (libc)Host Address Functions.
|
||
* inet_network: (libc)Host Address Functions.
|
||
* inet_ntoa: (libc)Host Address Functions.
|
||
* inet_ntop: (libc)Host Address Functions.
|
||
* inet_pton: (libc)Host Address Functions.
|
||
* initgroups: (libc)Setting Groups.
|
||
* initstate: (libc)BSD Random.
|
||
* initstate_r: (libc)BSD Random.
|
||
* innetgr: (libc)Netgroup Membership.
|
||
* ioctl: (libc)IOCTLs.
|
||
* isalnum: (libc)Classification of Characters.
|
||
* isalpha: (libc)Classification of Characters.
|
||
* isascii: (libc)Classification of Characters.
|
||
* isatty: (libc)Is It a Terminal.
|
||
* isblank: (libc)Classification of Characters.
|
||
* iscanonical: (libc)Floating Point Classes.
|
||
* iscntrl: (libc)Classification of Characters.
|
||
* isdigit: (libc)Classification of Characters.
|
||
* iseqsig: (libc)FP Comparison Functions.
|
||
* isfinite: (libc)Floating Point Classes.
|
||
* isgraph: (libc)Classification of Characters.
|
||
* isgreater: (libc)FP Comparison Functions.
|
||
* isgreaterequal: (libc)FP Comparison Functions.
|
||
* isinf: (libc)Floating Point Classes.
|
||
* isinff: (libc)Floating Point Classes.
|
||
* isinfl: (libc)Floating Point Classes.
|
||
* isless: (libc)FP Comparison Functions.
|
||
* islessequal: (libc)FP Comparison Functions.
|
||
* islessgreater: (libc)FP Comparison Functions.
|
||
* islower: (libc)Classification of Characters.
|
||
* isnan: (libc)Floating Point Classes.
|
||
* isnan: (libc)Floating Point Classes.
|
||
* isnanf: (libc)Floating Point Classes.
|
||
* isnanl: (libc)Floating Point Classes.
|
||
* isnormal: (libc)Floating Point Classes.
|
||
* isprint: (libc)Classification of Characters.
|
||
* ispunct: (libc)Classification of Characters.
|
||
* issignaling: (libc)Floating Point Classes.
|
||
* isspace: (libc)Classification of Characters.
|
||
* issubnormal: (libc)Floating Point Classes.
|
||
* isunordered: (libc)FP Comparison Functions.
|
||
* isupper: (libc)Classification of Characters.
|
||
* iswalnum: (libc)Classification of Wide Characters.
|
||
* iswalpha: (libc)Classification of Wide Characters.
|
||
* iswblank: (libc)Classification of Wide Characters.
|
||
* iswcntrl: (libc)Classification of Wide Characters.
|
||
* iswctype: (libc)Classification of Wide Characters.
|
||
* iswdigit: (libc)Classification of Wide Characters.
|
||
* iswgraph: (libc)Classification of Wide Characters.
|
||
* iswlower: (libc)Classification of Wide Characters.
|
||
* iswprint: (libc)Classification of Wide Characters.
|
||
* iswpunct: (libc)Classification of Wide Characters.
|
||
* iswspace: (libc)Classification of Wide Characters.
|
||
* iswupper: (libc)Classification of Wide Characters.
|
||
* iswxdigit: (libc)Classification of Wide Characters.
|
||
* isxdigit: (libc)Classification of Characters.
|
||
* iszero: (libc)Floating Point Classes.
|
||
* j0: (libc)Special Functions.
|
||
* j0f: (libc)Special Functions.
|
||
* j0fN: (libc)Special Functions.
|
||
* j0fNx: (libc)Special Functions.
|
||
* j0l: (libc)Special Functions.
|
||
* j1: (libc)Special Functions.
|
||
* j1f: (libc)Special Functions.
|
||
* j1fN: (libc)Special Functions.
|
||
* j1fNx: (libc)Special Functions.
|
||
* j1l: (libc)Special Functions.
|
||
* jn: (libc)Special Functions.
|
||
* jnf: (libc)Special Functions.
|
||
* jnfN: (libc)Special Functions.
|
||
* jnfNx: (libc)Special Functions.
|
||
* jnl: (libc)Special Functions.
|
||
* jrand48: (libc)SVID Random.
|
||
* jrand48_r: (libc)SVID Random.
|
||
* kill: (libc)Signaling Another Process.
|
||
* killpg: (libc)Signaling Another Process.
|
||
* l64a: (libc)Encode Binary Data.
|
||
* labs: (libc)Absolute Value.
|
||
* lcong48: (libc)SVID Random.
|
||
* lcong48_r: (libc)SVID Random.
|
||
* ldexp: (libc)Normalization Functions.
|
||
* ldexpf: (libc)Normalization Functions.
|
||
* ldexpfN: (libc)Normalization Functions.
|
||
* ldexpfNx: (libc)Normalization Functions.
|
||
* ldexpl: (libc)Normalization Functions.
|
||
* ldiv: (libc)Integer Division.
|
||
* lfind: (libc)Array Search Function.
|
||
* lgamma: (libc)Special Functions.
|
||
* lgamma_r: (libc)Special Functions.
|
||
* lgammaf: (libc)Special Functions.
|
||
* lgammafN: (libc)Special Functions.
|
||
* lgammafN_r: (libc)Special Functions.
|
||
* lgammafNx: (libc)Special Functions.
|
||
* lgammafNx_r: (libc)Special Functions.
|
||
* lgammaf_r: (libc)Special Functions.
|
||
* lgammal: (libc)Special Functions.
|
||
* lgammal_r: (libc)Special Functions.
|
||
* link: (libc)Hard Links.
|
||
* linkat: (libc)Hard Links.
|
||
* lio_listio64: (libc)Asynchronous Reads/Writes.
|
||
* lio_listio: (libc)Asynchronous Reads/Writes.
|
||
* listen: (libc)Listening.
|
||
* llabs: (libc)Absolute Value.
|
||
* lldiv: (libc)Integer Division.
|
||
* llogb: (libc)Exponents and Logarithms.
|
||
* llogbf: (libc)Exponents and Logarithms.
|
||
* llogbfN: (libc)Exponents and Logarithms.
|
||
* llogbfNx: (libc)Exponents and Logarithms.
|
||
* llogbl: (libc)Exponents and Logarithms.
|
||
* llrint: (libc)Rounding Functions.
|
||
* llrintf: (libc)Rounding Functions.
|
||
* llrintfN: (libc)Rounding Functions.
|
||
* llrintfNx: (libc)Rounding Functions.
|
||
* llrintl: (libc)Rounding Functions.
|
||
* llround: (libc)Rounding Functions.
|
||
* llroundf: (libc)Rounding Functions.
|
||
* llroundfN: (libc)Rounding Functions.
|
||
* llroundfNx: (libc)Rounding Functions.
|
||
* llroundl: (libc)Rounding Functions.
|
||
* localeconv: (libc)The Lame Way to Locale Data.
|
||
* localtime: (libc)Broken-down Time.
|
||
* localtime_r: (libc)Broken-down Time.
|
||
* log10: (libc)Exponents and Logarithms.
|
||
* log10f: (libc)Exponents and Logarithms.
|
||
* log10fN: (libc)Exponents and Logarithms.
|
||
* log10fNx: (libc)Exponents and Logarithms.
|
||
* log10l: (libc)Exponents and Logarithms.
|
||
* log1p: (libc)Exponents and Logarithms.
|
||
* log1pf: (libc)Exponents and Logarithms.
|
||
* log1pfN: (libc)Exponents and Logarithms.
|
||
* log1pfNx: (libc)Exponents and Logarithms.
|
||
* log1pl: (libc)Exponents and Logarithms.
|
||
* log2: (libc)Exponents and Logarithms.
|
||
* log2f: (libc)Exponents and Logarithms.
|
||
* log2fN: (libc)Exponents and Logarithms.
|
||
* log2fNx: (libc)Exponents and Logarithms.
|
||
* log2l: (libc)Exponents and Logarithms.
|
||
* log: (libc)Exponents and Logarithms.
|
||
* logb: (libc)Exponents and Logarithms.
|
||
* logbf: (libc)Exponents and Logarithms.
|
||
* logbfN: (libc)Exponents and Logarithms.
|
||
* logbfNx: (libc)Exponents and Logarithms.
|
||
* logbl: (libc)Exponents and Logarithms.
|
||
* logf: (libc)Exponents and Logarithms.
|
||
* logfN: (libc)Exponents and Logarithms.
|
||
* logfNx: (libc)Exponents and Logarithms.
|
||
* login: (libc)Logging In and Out.
|
||
* login_tty: (libc)Logging In and Out.
|
||
* logl: (libc)Exponents and Logarithms.
|
||
* logout: (libc)Logging In and Out.
|
||
* logwtmp: (libc)Logging In and Out.
|
||
* longjmp: (libc)Non-Local Details.
|
||
* lrand48: (libc)SVID Random.
|
||
* lrand48_r: (libc)SVID Random.
|
||
* lrint: (libc)Rounding Functions.
|
||
* lrintf: (libc)Rounding Functions.
|
||
* lrintfN: (libc)Rounding Functions.
|
||
* lrintfNx: (libc)Rounding Functions.
|
||
* lrintl: (libc)Rounding Functions.
|
||
* lround: (libc)Rounding Functions.
|
||
* lroundf: (libc)Rounding Functions.
|
||
* lroundfN: (libc)Rounding Functions.
|
||
* lroundfNx: (libc)Rounding Functions.
|
||
* lroundl: (libc)Rounding Functions.
|
||
* lsearch: (libc)Array Search Function.
|
||
* lseek64: (libc)File Position Primitive.
|
||
* lseek: (libc)File Position Primitive.
|
||
* lstat64: (libc)Reading Attributes.
|
||
* lstat: (libc)Reading Attributes.
|
||
* lutimes: (libc)File Times.
|
||
* madvise: (libc)Memory-mapped I/O.
|
||
* makecontext: (libc)System V contexts.
|
||
* mallinfo: (libc)Statistics of Malloc.
|
||
* malloc: (libc)Basic Allocation.
|
||
* mallopt: (libc)Malloc Tunable Parameters.
|
||
* mblen: (libc)Non-reentrant Character Conversion.
|
||
* mbrlen: (libc)Converting a Character.
|
||
* mbrtowc: (libc)Converting a Character.
|
||
* mbsinit: (libc)Keeping the state.
|
||
* mbsnrtowcs: (libc)Converting Strings.
|
||
* mbsrtowcs: (libc)Converting Strings.
|
||
* mbstowcs: (libc)Non-reentrant String Conversion.
|
||
* mbtowc: (libc)Non-reentrant Character Conversion.
|
||
* mcheck: (libc)Heap Consistency Checking.
|
||
* memalign: (libc)Aligned Memory Blocks.
|
||
* memccpy: (libc)Copying Strings and Arrays.
|
||
* memchr: (libc)Search Functions.
|
||
* memcmp: (libc)String/Array Comparison.
|
||
* memcpy: (libc)Copying Strings and Arrays.
|
||
* memfd_create: (libc)Memory-mapped I/O.
|
||
* memfrob: (libc)Obfuscating Data.
|
||
* memmem: (libc)Search Functions.
|
||
* memmove: (libc)Copying Strings and Arrays.
|
||
* mempcpy: (libc)Copying Strings and Arrays.
|
||
* memrchr: (libc)Search Functions.
|
||
* memset: (libc)Copying Strings and Arrays.
|
||
* mkdir: (libc)Creating Directories.
|
||
* mkdtemp: (libc)Temporary Files.
|
||
* mkfifo: (libc)FIFO Special Files.
|
||
* mknod: (libc)Making Special Files.
|
||
* mkstemp: (libc)Temporary Files.
|
||
* mktemp: (libc)Temporary Files.
|
||
* mktime: (libc)Broken-down Time.
|
||
* mlock2: (libc)Page Lock Functions.
|
||
* mlock: (libc)Page Lock Functions.
|
||
* mlockall: (libc)Page Lock Functions.
|
||
* mmap64: (libc)Memory-mapped I/O.
|
||
* mmap: (libc)Memory-mapped I/O.
|
||
* modf: (libc)Rounding Functions.
|
||
* modff: (libc)Rounding Functions.
|
||
* modffN: (libc)Rounding Functions.
|
||
* modffNx: (libc)Rounding Functions.
|
||
* modfl: (libc)Rounding Functions.
|
||
* mount: (libc)Mount-Unmount-Remount.
|
||
* mprobe: (libc)Heap Consistency Checking.
|
||
* mprotect: (libc)Memory Protection.
|
||
* mrand48: (libc)SVID Random.
|
||
* mrand48_r: (libc)SVID Random.
|
||
* mremap: (libc)Memory-mapped I/O.
|
||
* msync: (libc)Memory-mapped I/O.
|
||
* mtrace: (libc)Tracing malloc.
|
||
* mtx_destroy: (libc)ISO C Mutexes.
|
||
* mtx_init: (libc)ISO C Mutexes.
|
||
* mtx_lock: (libc)ISO C Mutexes.
|
||
* mtx_timedlock: (libc)ISO C Mutexes.
|
||
* mtx_trylock: (libc)ISO C Mutexes.
|
||
* mtx_unlock: (libc)ISO C Mutexes.
|
||
* munlock: (libc)Page Lock Functions.
|
||
* munlockall: (libc)Page Lock Functions.
|
||
* munmap: (libc)Memory-mapped I/O.
|
||
* muntrace: (libc)Tracing malloc.
|
||
* nan: (libc)FP Bit Twiddling.
|
||
* nanf: (libc)FP Bit Twiddling.
|
||
* nanfN: (libc)FP Bit Twiddling.
|
||
* nanfNx: (libc)FP Bit Twiddling.
|
||
* nanl: (libc)FP Bit Twiddling.
|
||
* nanosleep: (libc)Sleeping.
|
||
* nearbyint: (libc)Rounding Functions.
|
||
* nearbyintf: (libc)Rounding Functions.
|
||
* nearbyintfN: (libc)Rounding Functions.
|
||
* nearbyintfNx: (libc)Rounding Functions.
|
||
* nearbyintl: (libc)Rounding Functions.
|
||
* nextafter: (libc)FP Bit Twiddling.
|
||
* nextafterf: (libc)FP Bit Twiddling.
|
||
* nextafterfN: (libc)FP Bit Twiddling.
|
||
* nextafterfNx: (libc)FP Bit Twiddling.
|
||
* nextafterl: (libc)FP Bit Twiddling.
|
||
* nextdown: (libc)FP Bit Twiddling.
|
||
* nextdownf: (libc)FP Bit Twiddling.
|
||
* nextdownfN: (libc)FP Bit Twiddling.
|
||
* nextdownfNx: (libc)FP Bit Twiddling.
|
||
* nextdownl: (libc)FP Bit Twiddling.
|
||
* nexttoward: (libc)FP Bit Twiddling.
|
||
* nexttowardf: (libc)FP Bit Twiddling.
|
||
* nexttowardl: (libc)FP Bit Twiddling.
|
||
* nextup: (libc)FP Bit Twiddling.
|
||
* nextupf: (libc)FP Bit Twiddling.
|
||
* nextupfN: (libc)FP Bit Twiddling.
|
||
* nextupfNx: (libc)FP Bit Twiddling.
|
||
* nextupl: (libc)FP Bit Twiddling.
|
||
* nftw64: (libc)Working with Directory Trees.
|
||
* nftw: (libc)Working with Directory Trees.
|
||
* ngettext: (libc)Advanced gettext functions.
|
||
* nice: (libc)Traditional Scheduling Functions.
|
||
* nl_langinfo: (libc)The Elegant and Fast Way.
|
||
* nrand48: (libc)SVID Random.
|
||
* nrand48_r: (libc)SVID Random.
|
||
* ntohl: (libc)Byte Order.
|
||
* ntohs: (libc)Byte Order.
|
||
* ntp_adjtime: (libc)High Accuracy Clock.
|
||
* ntp_gettime: (libc)High Accuracy Clock.
|
||
* obstack_1grow: (libc)Growing Objects.
|
||
* obstack_1grow_fast: (libc)Extra Fast Growing.
|
||
* obstack_alignment_mask: (libc)Obstacks Data Alignment.
|
||
* obstack_alloc: (libc)Allocation in an Obstack.
|
||
* obstack_base: (libc)Status of an Obstack.
|
||
* obstack_blank: (libc)Growing Objects.
|
||
* obstack_blank_fast: (libc)Extra Fast Growing.
|
||
* obstack_chunk_size: (libc)Obstack Chunks.
|
||
* obstack_copy0: (libc)Allocation in an Obstack.
|
||
* obstack_copy: (libc)Allocation in an Obstack.
|
||
* obstack_finish: (libc)Growing Objects.
|
||
* obstack_free: (libc)Freeing Obstack Objects.
|
||
* obstack_grow0: (libc)Growing Objects.
|
||
* obstack_grow: (libc)Growing Objects.
|
||
* obstack_init: (libc)Preparing for Obstacks.
|
||
* obstack_int_grow: (libc)Growing Objects.
|
||
* obstack_int_grow_fast: (libc)Extra Fast Growing.
|
||
* obstack_next_free: (libc)Status of an Obstack.
|
||
* obstack_object_size: (libc)Growing Objects.
|
||
* obstack_object_size: (libc)Status of an Obstack.
|
||
* obstack_printf: (libc)Dynamic Output.
|
||
* obstack_ptr_grow: (libc)Growing Objects.
|
||
* obstack_ptr_grow_fast: (libc)Extra Fast Growing.
|
||
* obstack_room: (libc)Extra Fast Growing.
|
||
* obstack_vprintf: (libc)Variable Arguments Output.
|
||
* offsetof: (libc)Structure Measurement.
|
||
* on_exit: (libc)Cleanups on Exit.
|
||
* open64: (libc)Opening and Closing Files.
|
||
* open: (libc)Opening and Closing Files.
|
||
* open_memstream: (libc)String Streams.
|
||
* opendir: (libc)Opening a Directory.
|
||
* openlog: (libc)openlog.
|
||
* openpty: (libc)Pseudo-Terminal Pairs.
|
||
* parse_printf_format: (libc)Parsing a Template String.
|
||
* pathconf: (libc)Pathconf.
|
||
* pause: (libc)Using Pause.
|
||
* pclose: (libc)Pipe to a Subprocess.
|
||
* perror: (libc)Error Messages.
|
||
* pipe: (libc)Creating a Pipe.
|
||
* pkey_alloc: (libc)Memory Protection.
|
||
* pkey_free: (libc)Memory Protection.
|
||
* pkey_get: (libc)Memory Protection.
|
||
* pkey_mprotect: (libc)Memory Protection.
|
||
* pkey_set: (libc)Memory Protection.
|
||
* popen: (libc)Pipe to a Subprocess.
|
||
* posix_fallocate64: (libc)Storage Allocation.
|
||
* posix_fallocate: (libc)Storage Allocation.
|
||
* posix_memalign: (libc)Aligned Memory Blocks.
|
||
* pow: (libc)Exponents and Logarithms.
|
||
* powf: (libc)Exponents and Logarithms.
|
||
* powfN: (libc)Exponents and Logarithms.
|
||
* powfNx: (libc)Exponents and Logarithms.
|
||
* powl: (libc)Exponents and Logarithms.
|
||
* pread64: (libc)I/O Primitives.
|
||
* pread: (libc)I/O Primitives.
|
||
* preadv2: (libc)Scatter-Gather.
|
||
* preadv64: (libc)Scatter-Gather.
|
||
* preadv64v2: (libc)Scatter-Gather.
|
||
* preadv: (libc)Scatter-Gather.
|
||
* printf: (libc)Formatted Output Functions.
|
||
* printf_size: (libc)Predefined Printf Handlers.
|
||
* printf_size_info: (libc)Predefined Printf Handlers.
|
||
* psignal: (libc)Signal Messages.
|
||
* pthread_getattr_default_np: (libc)Default Thread Attributes.
|
||
* pthread_getspecific: (libc)Thread-specific Data.
|
||
* pthread_key_create: (libc)Thread-specific Data.
|
||
* pthread_key_delete: (libc)Thread-specific Data.
|
||
* pthread_setattr_default_np: (libc)Default Thread Attributes.
|
||
* pthread_setspecific: (libc)Thread-specific Data.
|
||
* ptsname: (libc)Allocation.
|
||
* ptsname_r: (libc)Allocation.
|
||
* putc: (libc)Simple Output.
|
||
* putc_unlocked: (libc)Simple Output.
|
||
* putchar: (libc)Simple Output.
|
||
* putchar_unlocked: (libc)Simple Output.
|
||
* putenv: (libc)Environment Access.
|
||
* putpwent: (libc)Writing a User Entry.
|
||
* puts: (libc)Simple Output.
|
||
* pututline: (libc)Manipulating the Database.
|
||
* pututxline: (libc)XPG Functions.
|
||
* putw: (libc)Simple Output.
|
||
* putwc: (libc)Simple Output.
|
||
* putwc_unlocked: (libc)Simple Output.
|
||
* putwchar: (libc)Simple Output.
|
||
* putwchar_unlocked: (libc)Simple Output.
|
||
* pwrite64: (libc)I/O Primitives.
|
||
* pwrite: (libc)I/O Primitives.
|
||
* pwritev2: (libc)Scatter-Gather.
|
||
* pwritev64: (libc)Scatter-Gather.
|
||
* pwritev64v2: (libc)Scatter-Gather.
|
||
* pwritev: (libc)Scatter-Gather.
|
||
* qecvt: (libc)System V Number Conversion.
|
||
* qecvt_r: (libc)System V Number Conversion.
|
||
* qfcvt: (libc)System V Number Conversion.
|
||
* qfcvt_r: (libc)System V Number Conversion.
|
||
* qgcvt: (libc)System V Number Conversion.
|
||
* qsort: (libc)Array Sort Function.
|
||
* raise: (libc)Signaling Yourself.
|
||
* rand: (libc)ISO Random.
|
||
* rand_r: (libc)ISO Random.
|
||
* random: (libc)BSD Random.
|
||
* random_r: (libc)BSD Random.
|
||
* rawmemchr: (libc)Search Functions.
|
||
* read: (libc)I/O Primitives.
|
||
* readdir64: (libc)Reading/Closing Directory.
|
||
* readdir64_r: (libc)Reading/Closing Directory.
|
||
* readdir: (libc)Reading/Closing Directory.
|
||
* readdir_r: (libc)Reading/Closing Directory.
|
||
* readlink: (libc)Symbolic Links.
|
||
* readv: (libc)Scatter-Gather.
|
||
* realloc: (libc)Changing Block Size.
|
||
* reallocarray: (libc)Changing Block Size.
|
||
* realpath: (libc)Symbolic Links.
|
||
* recv: (libc)Receiving Data.
|
||
* recvfrom: (libc)Receiving Datagrams.
|
||
* recvmsg: (libc)Receiving Datagrams.
|
||
* regcomp: (libc)POSIX Regexp Compilation.
|
||
* regerror: (libc)Regexp Cleanup.
|
||
* regexec: (libc)Matching POSIX Regexps.
|
||
* regfree: (libc)Regexp Cleanup.
|
||
* register_printf_function: (libc)Registering New Conversions.
|
||
* remainder: (libc)Remainder Functions.
|
||
* remainderf: (libc)Remainder Functions.
|
||
* remainderfN: (libc)Remainder Functions.
|
||
* remainderfNx: (libc)Remainder Functions.
|
||
* remainderl: (libc)Remainder Functions.
|
||
* remove: (libc)Deleting Files.
|
||
* rename: (libc)Renaming Files.
|
||
* rewind: (libc)File Positioning.
|
||
* rewinddir: (libc)Random Access Directory.
|
||
* rindex: (libc)Search Functions.
|
||
* rint: (libc)Rounding Functions.
|
||
* rintf: (libc)Rounding Functions.
|
||
* rintfN: (libc)Rounding Functions.
|
||
* rintfNx: (libc)Rounding Functions.
|
||
* rintl: (libc)Rounding Functions.
|
||
* rmdir: (libc)Deleting Files.
|
||
* round: (libc)Rounding Functions.
|
||
* roundeven: (libc)Rounding Functions.
|
||
* roundevenf: (libc)Rounding Functions.
|
||
* roundevenfN: (libc)Rounding Functions.
|
||
* roundevenfNx: (libc)Rounding Functions.
|
||
* roundevenl: (libc)Rounding Functions.
|
||
* roundf: (libc)Rounding Functions.
|
||
* roundfN: (libc)Rounding Functions.
|
||
* roundfNx: (libc)Rounding Functions.
|
||
* roundl: (libc)Rounding Functions.
|
||
* rpmatch: (libc)Yes-or-No Questions.
|
||
* sbrk: (libc)Resizing the Data Segment.
|
||
* scalb: (libc)Normalization Functions.
|
||
* scalbf: (libc)Normalization Functions.
|
||
* scalbl: (libc)Normalization Functions.
|
||
* scalbln: (libc)Normalization Functions.
|
||
* scalblnf: (libc)Normalization Functions.
|
||
* scalblnfN: (libc)Normalization Functions.
|
||
* scalblnfNx: (libc)Normalization Functions.
|
||
* scalblnl: (libc)Normalization Functions.
|
||
* scalbn: (libc)Normalization Functions.
|
||
* scalbnf: (libc)Normalization Functions.
|
||
* scalbnfN: (libc)Normalization Functions.
|
||
* scalbnfNx: (libc)Normalization Functions.
|
||
* scalbnl: (libc)Normalization Functions.
|
||
* scandir64: (libc)Scanning Directory Content.
|
||
* scandir: (libc)Scanning Directory Content.
|
||
* scanf: (libc)Formatted Input Functions.
|
||
* sched_get_priority_max: (libc)Basic Scheduling Functions.
|
||
* sched_get_priority_min: (libc)Basic Scheduling Functions.
|
||
* sched_getaffinity: (libc)CPU Affinity.
|
||
* sched_getparam: (libc)Basic Scheduling Functions.
|
||
* sched_getscheduler: (libc)Basic Scheduling Functions.
|
||
* sched_rr_get_interval: (libc)Basic Scheduling Functions.
|
||
* sched_setaffinity: (libc)CPU Affinity.
|
||
* sched_setparam: (libc)Basic Scheduling Functions.
|
||
* sched_setscheduler: (libc)Basic Scheduling Functions.
|
||
* sched_yield: (libc)Basic Scheduling Functions.
|
||
* secure_getenv: (libc)Environment Access.
|
||
* seed48: (libc)SVID Random.
|
||
* seed48_r: (libc)SVID Random.
|
||
* seekdir: (libc)Random Access Directory.
|
||
* select: (libc)Waiting for I/O.
|
||
* sem_close: (libc)Semaphores.
|
||
* sem_destroy: (libc)Semaphores.
|
||
* sem_getvalue: (libc)Semaphores.
|
||
* sem_init: (libc)Semaphores.
|
||
* sem_open: (libc)Semaphores.
|
||
* sem_post: (libc)Semaphores.
|
||
* sem_timedwait: (libc)Semaphores.
|
||
* sem_trywait: (libc)Semaphores.
|
||
* sem_unlink: (libc)Semaphores.
|
||
* sem_wait: (libc)Semaphores.
|
||
* semctl: (libc)Semaphores.
|
||
* semget: (libc)Semaphores.
|
||
* semop: (libc)Semaphores.
|
||
* semtimedop: (libc)Semaphores.
|
||
* send: (libc)Sending Data.
|
||
* sendmsg: (libc)Receiving Datagrams.
|
||
* sendto: (libc)Sending Datagrams.
|
||
* setbuf: (libc)Controlling Buffering.
|
||
* setbuffer: (libc)Controlling Buffering.
|
||
* setcontext: (libc)System V contexts.
|
||
* setdomainname: (libc)Host Identification.
|
||
* setegid: (libc)Setting Groups.
|
||
* setenv: (libc)Environment Access.
|
||
* seteuid: (libc)Setting User ID.
|
||
* setfsent: (libc)fstab.
|
||
* setgid: (libc)Setting Groups.
|
||
* setgrent: (libc)Scanning All Groups.
|
||
* setgroups: (libc)Setting Groups.
|
||
* sethostent: (libc)Host Names.
|
||
* sethostid: (libc)Host Identification.
|
||
* sethostname: (libc)Host Identification.
|
||
* setitimer: (libc)Setting an Alarm.
|
||
* setjmp: (libc)Non-Local Details.
|
||
* setlinebuf: (libc)Controlling Buffering.
|
||
* setlocale: (libc)Setting the Locale.
|
||
* setlogmask: (libc)setlogmask.
|
||
* setmntent: (libc)mtab.
|
||
* setnetent: (libc)Networks Database.
|
||
* setnetgrent: (libc)Lookup Netgroup.
|
||
* setpayload: (libc)FP Bit Twiddling.
|
||
* setpayloadf: (libc)FP Bit Twiddling.
|
||
* setpayloadfN: (libc)FP Bit Twiddling.
|
||
* setpayloadfNx: (libc)FP Bit Twiddling.
|
||
* setpayloadl: (libc)FP Bit Twiddling.
|
||
* setpayloadsig: (libc)FP Bit Twiddling.
|
||
* setpayloadsigf: (libc)FP Bit Twiddling.
|
||
* setpayloadsigfN: (libc)FP Bit Twiddling.
|
||
* setpayloadsigfNx: (libc)FP Bit Twiddling.
|
||
* setpayloadsigl: (libc)FP Bit Twiddling.
|
||
* setpgid: (libc)Process Group Functions.
|
||
* setpgrp: (libc)Process Group Functions.
|
||
* setpriority: (libc)Traditional Scheduling Functions.
|
||
* setprotoent: (libc)Protocols Database.
|
||
* setpwent: (libc)Scanning All Users.
|
||
* setregid: (libc)Setting Groups.
|
||
* setreuid: (libc)Setting User ID.
|
||
* setrlimit64: (libc)Limits on Resources.
|
||
* setrlimit: (libc)Limits on Resources.
|
||
* setservent: (libc)Services Database.
|
||
* setsid: (libc)Process Group Functions.
|
||
* setsockopt: (libc)Socket Option Functions.
|
||
* setstate: (libc)BSD Random.
|
||
* setstate_r: (libc)BSD Random.
|
||
* settimeofday: (libc)High-Resolution Calendar.
|
||
* setuid: (libc)Setting User ID.
|
||
* setutent: (libc)Manipulating the Database.
|
||
* setutxent: (libc)XPG Functions.
|
||
* setvbuf: (libc)Controlling Buffering.
|
||
* shm_open: (libc)Memory-mapped I/O.
|
||
* shm_unlink: (libc)Memory-mapped I/O.
|
||
* shutdown: (libc)Closing a Socket.
|
||
* sigaction: (libc)Advanced Signal Handling.
|
||
* sigaddset: (libc)Signal Sets.
|
||
* sigaltstack: (libc)Signal Stack.
|
||
* sigblock: (libc)BSD Signal Handling.
|
||
* sigdelset: (libc)Signal Sets.
|
||
* sigemptyset: (libc)Signal Sets.
|
||
* sigfillset: (libc)Signal Sets.
|
||
* siginterrupt: (libc)BSD Signal Handling.
|
||
* sigismember: (libc)Signal Sets.
|
||
* siglongjmp: (libc)Non-Local Exits and Signals.
|
||
* sigmask: (libc)BSD Signal Handling.
|
||
* signal: (libc)Basic Signal Handling.
|
||
* signbit: (libc)FP Bit Twiddling.
|
||
* significand: (libc)Normalization Functions.
|
||
* significandf: (libc)Normalization Functions.
|
||
* significandl: (libc)Normalization Functions.
|
||
* sigpause: (libc)BSD Signal Handling.
|
||
* sigpending: (libc)Checking for Pending Signals.
|
||
* sigprocmask: (libc)Process Signal Mask.
|
||
* sigsetjmp: (libc)Non-Local Exits and Signals.
|
||
* sigsetmask: (libc)BSD Signal Handling.
|
||
* sigstack: (libc)Signal Stack.
|
||
* sigsuspend: (libc)Sigsuspend.
|
||
* sin: (libc)Trig Functions.
|
||
* sincos: (libc)Trig Functions.
|
||
* sincosf: (libc)Trig Functions.
|
||
* sincosfN: (libc)Trig Functions.
|
||
* sincosfNx: (libc)Trig Functions.
|
||
* sincosl: (libc)Trig Functions.
|
||
* sinf: (libc)Trig Functions.
|
||
* sinfN: (libc)Trig Functions.
|
||
* sinfNx: (libc)Trig Functions.
|
||
* sinh: (libc)Hyperbolic Functions.
|
||
* sinhf: (libc)Hyperbolic Functions.
|
||
* sinhfN: (libc)Hyperbolic Functions.
|
||
* sinhfNx: (libc)Hyperbolic Functions.
|
||
* sinhl: (libc)Hyperbolic Functions.
|
||
* sinl: (libc)Trig Functions.
|
||
* sleep: (libc)Sleeping.
|
||
* snprintf: (libc)Formatted Output Functions.
|
||
* socket: (libc)Creating a Socket.
|
||
* socketpair: (libc)Socket Pairs.
|
||
* sprintf: (libc)Formatted Output Functions.
|
||
* sqrt: (libc)Exponents and Logarithms.
|
||
* sqrtf: (libc)Exponents and Logarithms.
|
||
* sqrtfN: (libc)Exponents and Logarithms.
|
||
* sqrtfNx: (libc)Exponents and Logarithms.
|
||
* sqrtl: (libc)Exponents and Logarithms.
|
||
* srand48: (libc)SVID Random.
|
||
* srand48_r: (libc)SVID Random.
|
||
* srand: (libc)ISO Random.
|
||
* srandom: (libc)BSD Random.
|
||
* srandom_r: (libc)BSD Random.
|
||
* sscanf: (libc)Formatted Input Functions.
|
||
* ssignal: (libc)Basic Signal Handling.
|
||
* stat64: (libc)Reading Attributes.
|
||
* stat: (libc)Reading Attributes.
|
||
* stime: (libc)Simple Calendar Time.
|
||
* stpcpy: (libc)Copying Strings and Arrays.
|
||
* stpncpy: (libc)Truncating Strings.
|
||
* strcasecmp: (libc)String/Array Comparison.
|
||
* strcasestr: (libc)Search Functions.
|
||
* strcat: (libc)Concatenating Strings.
|
||
* strchr: (libc)Search Functions.
|
||
* strchrnul: (libc)Search Functions.
|
||
* strcmp: (libc)String/Array Comparison.
|
||
* strcoll: (libc)Collation Functions.
|
||
* strcpy: (libc)Copying Strings and Arrays.
|
||
* strcspn: (libc)Search Functions.
|
||
* strdup: (libc)Copying Strings and Arrays.
|
||
* strdupa: (libc)Copying Strings and Arrays.
|
||
* strerror: (libc)Error Messages.
|
||
* strerror_r: (libc)Error Messages.
|
||
* strfmon: (libc)Formatting Numbers.
|
||
* strfromd: (libc)Printing of Floats.
|
||
* strfromf: (libc)Printing of Floats.
|
||
* strfromfN: (libc)Printing of Floats.
|
||
* strfromfNx: (libc)Printing of Floats.
|
||
* strfroml: (libc)Printing of Floats.
|
||
* strfry: (libc)Shuffling Bytes.
|
||
* strftime: (libc)Formatting Calendar Time.
|
||
* strlen: (libc)String Length.
|
||
* strncasecmp: (libc)String/Array Comparison.
|
||
* strncat: (libc)Truncating Strings.
|
||
* strncmp: (libc)String/Array Comparison.
|
||
* strncpy: (libc)Truncating Strings.
|
||
* strndup: (libc)Truncating Strings.
|
||
* strndupa: (libc)Truncating Strings.
|
||
* strnlen: (libc)String Length.
|
||
* strpbrk: (libc)Search Functions.
|
||
* strptime: (libc)Low-Level Time String Parsing.
|
||
* strrchr: (libc)Search Functions.
|
||
* strsep: (libc)Finding Tokens in a String.
|
||
* strsignal: (libc)Signal Messages.
|
||
* strspn: (libc)Search Functions.
|
||
* strstr: (libc)Search Functions.
|
||
* strtod: (libc)Parsing of Floats.
|
||
* strtof: (libc)Parsing of Floats.
|
||
* strtofN: (libc)Parsing of Floats.
|
||
* strtofNx: (libc)Parsing of Floats.
|
||
* strtoimax: (libc)Parsing of Integers.
|
||
* strtok: (libc)Finding Tokens in a String.
|
||
* strtok_r: (libc)Finding Tokens in a String.
|
||
* strtol: (libc)Parsing of Integers.
|
||
* strtold: (libc)Parsing of Floats.
|
||
* strtoll: (libc)Parsing of Integers.
|
||
* strtoq: (libc)Parsing of Integers.
|
||
* strtoul: (libc)Parsing of Integers.
|
||
* strtoull: (libc)Parsing of Integers.
|
||
* strtoumax: (libc)Parsing of Integers.
|
||
* strtouq: (libc)Parsing of Integers.
|
||
* strverscmp: (libc)String/Array Comparison.
|
||
* strxfrm: (libc)Collation Functions.
|
||
* stty: (libc)BSD Terminal Modes.
|
||
* swapcontext: (libc)System V contexts.
|
||
* swprintf: (libc)Formatted Output Functions.
|
||
* swscanf: (libc)Formatted Input Functions.
|
||
* symlink: (libc)Symbolic Links.
|
||
* sync: (libc)Synchronizing I/O.
|
||
* syscall: (libc)System Calls.
|
||
* sysconf: (libc)Sysconf Definition.
|
||
* sysctl: (libc)System Parameters.
|
||
* syslog: (libc)syslog; vsyslog.
|
||
* system: (libc)Running a Command.
|
||
* sysv_signal: (libc)Basic Signal Handling.
|
||
* tan: (libc)Trig Functions.
|
||
* tanf: (libc)Trig Functions.
|
||
* tanfN: (libc)Trig Functions.
|
||
* tanfNx: (libc)Trig Functions.
|
||
* tanh: (libc)Hyperbolic Functions.
|
||
* tanhf: (libc)Hyperbolic Functions.
|
||
* tanhfN: (libc)Hyperbolic Functions.
|
||
* tanhfNx: (libc)Hyperbolic Functions.
|
||
* tanhl: (libc)Hyperbolic Functions.
|
||
* tanl: (libc)Trig Functions.
|
||
* tcdrain: (libc)Line Control.
|
||
* tcflow: (libc)Line Control.
|
||
* tcflush: (libc)Line Control.
|
||
* tcgetattr: (libc)Mode Functions.
|
||
* tcgetpgrp: (libc)Terminal Access Functions.
|
||
* tcgetsid: (libc)Terminal Access Functions.
|
||
* tcsendbreak: (libc)Line Control.
|
||
* tcsetattr: (libc)Mode Functions.
|
||
* tcsetpgrp: (libc)Terminal Access Functions.
|
||
* tdelete: (libc)Tree Search Function.
|
||
* tdestroy: (libc)Tree Search Function.
|
||
* telldir: (libc)Random Access Directory.
|
||
* tempnam: (libc)Temporary Files.
|
||
* textdomain: (libc)Locating gettext catalog.
|
||
* tfind: (libc)Tree Search Function.
|
||
* tgamma: (libc)Special Functions.
|
||
* tgammaf: (libc)Special Functions.
|
||
* tgammafN: (libc)Special Functions.
|
||
* tgammafNx: (libc)Special Functions.
|
||
* tgammal: (libc)Special Functions.
|
||
* thrd_create: (libc)ISO C Thread Management.
|
||
* thrd_current: (libc)ISO C Thread Management.
|
||
* thrd_detach: (libc)ISO C Thread Management.
|
||
* thrd_equal: (libc)ISO C Thread Management.
|
||
* thrd_exit: (libc)ISO C Thread Management.
|
||
* thrd_join: (libc)ISO C Thread Management.
|
||
* thrd_sleep: (libc)ISO C Thread Management.
|
||
* thrd_yield: (libc)ISO C Thread Management.
|
||
* time: (libc)Simple Calendar Time.
|
||
* timegm: (libc)Broken-down Time.
|
||
* timelocal: (libc)Broken-down Time.
|
||
* times: (libc)Processor Time.
|
||
* tmpfile64: (libc)Temporary Files.
|
||
* tmpfile: (libc)Temporary Files.
|
||
* tmpnam: (libc)Temporary Files.
|
||
* tmpnam_r: (libc)Temporary Files.
|
||
* toascii: (libc)Case Conversion.
|
||
* tolower: (libc)Case Conversion.
|
||
* totalorder: (libc)FP Comparison Functions.
|
||
* totalorderf: (libc)FP Comparison Functions.
|
||
* totalorderfN: (libc)FP Comparison Functions.
|
||
* totalorderfNx: (libc)FP Comparison Functions.
|
||
* totalorderl: (libc)FP Comparison Functions.
|
||
* totalordermag: (libc)FP Comparison Functions.
|
||
* totalordermagf: (libc)FP Comparison Functions.
|
||
* totalordermagfN: (libc)FP Comparison Functions.
|
||
* totalordermagfNx: (libc)FP Comparison Functions.
|
||
* totalordermagl: (libc)FP Comparison Functions.
|
||
* toupper: (libc)Case Conversion.
|
||
* towctrans: (libc)Wide Character Case Conversion.
|
||
* towlower: (libc)Wide Character Case Conversion.
|
||
* towupper: (libc)Wide Character Case Conversion.
|
||
* trunc: (libc)Rounding Functions.
|
||
* truncate64: (libc)File Size.
|
||
* truncate: (libc)File Size.
|
||
* truncf: (libc)Rounding Functions.
|
||
* truncfN: (libc)Rounding Functions.
|
||
* truncfNx: (libc)Rounding Functions.
|
||
* truncl: (libc)Rounding Functions.
|
||
* tsearch: (libc)Tree Search Function.
|
||
* tss_create: (libc)ISO C Thread-local Storage.
|
||
* tss_delete: (libc)ISO C Thread-local Storage.
|
||
* tss_get: (libc)ISO C Thread-local Storage.
|
||
* tss_set: (libc)ISO C Thread-local Storage.
|
||
* ttyname: (libc)Is It a Terminal.
|
||
* ttyname_r: (libc)Is It a Terminal.
|
||
* twalk: (libc)Tree Search Function.
|
||
* tzset: (libc)Time Zone Functions.
|
||
* ufromfp: (libc)Rounding Functions.
|
||
* ufromfpf: (libc)Rounding Functions.
|
||
* ufromfpfN: (libc)Rounding Functions.
|
||
* ufromfpfNx: (libc)Rounding Functions.
|
||
* ufromfpl: (libc)Rounding Functions.
|
||
* ufromfpx: (libc)Rounding Functions.
|
||
* ufromfpxf: (libc)Rounding Functions.
|
||
* ufromfpxfN: (libc)Rounding Functions.
|
||
* ufromfpxfNx: (libc)Rounding Functions.
|
||
* ufromfpxl: (libc)Rounding Functions.
|
||
* ulimit: (libc)Limits on Resources.
|
||
* umask: (libc)Setting Permissions.
|
||
* umount2: (libc)Mount-Unmount-Remount.
|
||
* umount: (libc)Mount-Unmount-Remount.
|
||
* uname: (libc)Platform Type.
|
||
* ungetc: (libc)How Unread.
|
||
* ungetwc: (libc)How Unread.
|
||
* unlink: (libc)Deleting Files.
|
||
* unlockpt: (libc)Allocation.
|
||
* unsetenv: (libc)Environment Access.
|
||
* updwtmp: (libc)Manipulating the Database.
|
||
* utime: (libc)File Times.
|
||
* utimes: (libc)File Times.
|
||
* utmpname: (libc)Manipulating the Database.
|
||
* utmpxname: (libc)XPG Functions.
|
||
* va_arg: (libc)Argument Macros.
|
||
* va_copy: (libc)Argument Macros.
|
||
* va_end: (libc)Argument Macros.
|
||
* va_start: (libc)Argument Macros.
|
||
* valloc: (libc)Aligned Memory Blocks.
|
||
* vasprintf: (libc)Variable Arguments Output.
|
||
* verr: (libc)Error Messages.
|
||
* verrx: (libc)Error Messages.
|
||
* versionsort64: (libc)Scanning Directory Content.
|
||
* versionsort: (libc)Scanning Directory Content.
|
||
* vfork: (libc)Creating a Process.
|
||
* vfprintf: (libc)Variable Arguments Output.
|
||
* vfscanf: (libc)Variable Arguments Input.
|
||
* vfwprintf: (libc)Variable Arguments Output.
|
||
* vfwscanf: (libc)Variable Arguments Input.
|
||
* vlimit: (libc)Limits on Resources.
|
||
* vprintf: (libc)Variable Arguments Output.
|
||
* vscanf: (libc)Variable Arguments Input.
|
||
* vsnprintf: (libc)Variable Arguments Output.
|
||
* vsprintf: (libc)Variable Arguments Output.
|
||
* vsscanf: (libc)Variable Arguments Input.
|
||
* vswprintf: (libc)Variable Arguments Output.
|
||
* vswscanf: (libc)Variable Arguments Input.
|
||
* vsyslog: (libc)syslog; vsyslog.
|
||
* vtimes: (libc)Resource Usage.
|
||
* vwarn: (libc)Error Messages.
|
||
* vwarnx: (libc)Error Messages.
|
||
* vwprintf: (libc)Variable Arguments Output.
|
||
* vwscanf: (libc)Variable Arguments Input.
|
||
* wait3: (libc)BSD Wait Functions.
|
||
* wait4: (libc)Process Completion.
|
||
* wait: (libc)Process Completion.
|
||
* waitpid: (libc)Process Completion.
|
||
* warn: (libc)Error Messages.
|
||
* warnx: (libc)Error Messages.
|
||
* wcpcpy: (libc)Copying Strings and Arrays.
|
||
* wcpncpy: (libc)Truncating Strings.
|
||
* wcrtomb: (libc)Converting a Character.
|
||
* wcscasecmp: (libc)String/Array Comparison.
|
||
* wcscat: (libc)Concatenating Strings.
|
||
* wcschr: (libc)Search Functions.
|
||
* wcschrnul: (libc)Search Functions.
|
||
* wcscmp: (libc)String/Array Comparison.
|
||
* wcscoll: (libc)Collation Functions.
|
||
* wcscpy: (libc)Copying Strings and Arrays.
|
||
* wcscspn: (libc)Search Functions.
|
||
* wcsdup: (libc)Copying Strings and Arrays.
|
||
* wcsftime: (libc)Formatting Calendar Time.
|
||
* wcslen: (libc)String Length.
|
||
* wcsncasecmp: (libc)String/Array Comparison.
|
||
* wcsncat: (libc)Truncating Strings.
|
||
* wcsncmp: (libc)String/Array Comparison.
|
||
* wcsncpy: (libc)Truncating Strings.
|
||
* wcsnlen: (libc)String Length.
|
||
* wcsnrtombs: (libc)Converting Strings.
|
||
* wcspbrk: (libc)Search Functions.
|
||
* wcsrchr: (libc)Search Functions.
|
||
* wcsrtombs: (libc)Converting Strings.
|
||
* wcsspn: (libc)Search Functions.
|
||
* wcsstr: (libc)Search Functions.
|
||
* wcstod: (libc)Parsing of Floats.
|
||
* wcstof: (libc)Parsing of Floats.
|
||
* wcstofN: (libc)Parsing of Floats.
|
||
* wcstofNx: (libc)Parsing of Floats.
|
||
* wcstoimax: (libc)Parsing of Integers.
|
||
* wcstok: (libc)Finding Tokens in a String.
|
||
* wcstol: (libc)Parsing of Integers.
|
||
* wcstold: (libc)Parsing of Floats.
|
||
* wcstoll: (libc)Parsing of Integers.
|
||
* wcstombs: (libc)Non-reentrant String Conversion.
|
||
* wcstoq: (libc)Parsing of Integers.
|
||
* wcstoul: (libc)Parsing of Integers.
|
||
* wcstoull: (libc)Parsing of Integers.
|
||
* wcstoumax: (libc)Parsing of Integers.
|
||
* wcstouq: (libc)Parsing of Integers.
|
||
* wcswcs: (libc)Search Functions.
|
||
* wcsxfrm: (libc)Collation Functions.
|
||
* wctob: (libc)Converting a Character.
|
||
* wctomb: (libc)Non-reentrant Character Conversion.
|
||
* wctrans: (libc)Wide Character Case Conversion.
|
||
* wctype: (libc)Classification of Wide Characters.
|
||
* wmemchr: (libc)Search Functions.
|
||
* wmemcmp: (libc)String/Array Comparison.
|
||
* wmemcpy: (libc)Copying Strings and Arrays.
|
||
* wmemmove: (libc)Copying Strings and Arrays.
|
||
* wmempcpy: (libc)Copying Strings and Arrays.
|
||
* wmemset: (libc)Copying Strings and Arrays.
|
||
* wordexp: (libc)Calling Wordexp.
|
||
* wordfree: (libc)Calling Wordexp.
|
||
* wprintf: (libc)Formatted Output Functions.
|
||
* write: (libc)I/O Primitives.
|
||
* writev: (libc)Scatter-Gather.
|
||
* wscanf: (libc)Formatted Input Functions.
|
||
* y0: (libc)Special Functions.
|
||
* y0f: (libc)Special Functions.
|
||
* y0fN: (libc)Special Functions.
|
||
* y0fNx: (libc)Special Functions.
|
||
* y0l: (libc)Special Functions.
|
||
* y1: (libc)Special Functions.
|
||
* y1f: (libc)Special Functions.
|
||
* y1fN: (libc)Special Functions.
|
||
* y1fNx: (libc)Special Functions.
|
||
* y1l: (libc)Special Functions.
|
||
* yn: (libc)Special Functions.
|
||
* ynf: (libc)Special Functions.
|
||
* ynfN: (libc)Special Functions.
|
||
* ynfNx: (libc)Special Functions.
|
||
* ynl: (libc)Special Functions.
|
||
END-INFO-DIR-ENTRY
|
||
|
||
|
||
File: libc.info, Node: Hooks for Malloc, Next: Statistics of Malloc, Prev: Heap Consistency Checking, Up: Unconstrained Allocation
|
||
|
||
3.2.3.9 Memory Allocation Hooks
|
||
...............................
|
||
|
||
The GNU C Library lets you modify the behavior of ‘malloc’, ‘realloc’,
|
||
and ‘free’ by specifying appropriate hook functions. You can use these
|
||
hooks to help you debug programs that use dynamic memory allocation, for
|
||
example.
|
||
|
||
The hook variables are declared in ‘malloc.h’.
|
||
|
||
-- Variable: __malloc_hook
|
||
|
||
The value of this variable is a pointer to the function that
|
||
‘malloc’ uses whenever it is called. You should define this
|
||
function to look like ‘malloc’; that is, like:
|
||
|
||
void *FUNCTION (size_t SIZE, const void *CALLER)
|
||
|
||
The value of CALLER is the return address found on the stack when
|
||
the ‘malloc’ function was called. This value allows you to trace
|
||
the memory consumption of the program.
|
||
|
||
-- Variable: __realloc_hook
|
||
|
||
The value of this variable is a pointer to function that ‘realloc’
|
||
uses whenever it is called. You should define this function to
|
||
look like ‘realloc’; that is, like:
|
||
|
||
void *FUNCTION (void *PTR, size_t SIZE, const void *CALLER)
|
||
|
||
The value of CALLER is the return address found on the stack when
|
||
the ‘realloc’ function was called. This value allows you to trace
|
||
the memory consumption of the program.
|
||
|
||
-- Variable: __free_hook
|
||
|
||
The value of this variable is a pointer to function that ‘free’
|
||
uses whenever it is called. You should define this function to
|
||
look like ‘free’; that is, like:
|
||
|
||
void FUNCTION (void *PTR, const void *CALLER)
|
||
|
||
The value of CALLER is the return address found on the stack when
|
||
the ‘free’ function was called. This value allows you to trace the
|
||
memory consumption of the program.
|
||
|
||
-- Variable: __memalign_hook
|
||
|
||
The value of this variable is a pointer to function that
|
||
‘aligned_alloc’, ‘memalign’, ‘posix_memalign’ and ‘valloc’ use
|
||
whenever they are called. You should define this function to look
|
||
like ‘aligned_alloc’; that is, like:
|
||
|
||
void *FUNCTION (size_t ALIGNMENT, size_t SIZE, const void *CALLER)
|
||
|
||
The value of CALLER is the return address found on the stack when
|
||
the ‘aligned_alloc’, ‘memalign’, ‘posix_memalign’ or ‘valloc’
|
||
functions are called. This value allows you to trace the memory
|
||
consumption of the program.
|
||
|
||
You must make sure that the function you install as a hook for one of
|
||
these functions does not call that function recursively without
|
||
restoring the old value of the hook first! Otherwise, your program will
|
||
get stuck in an infinite recursion. Before calling the function
|
||
recursively, one should make sure to restore all the hooks to their
|
||
previous value. When coming back from the recursive call, all the hooks
|
||
should be resaved since a hook might modify itself.
|
||
|
||
An issue to look out for is the time at which the malloc hook
|
||
functions can be safely installed. If the hook functions call the
|
||
malloc-related functions recursively, it is necessary that malloc has
|
||
already properly initialized itself at the time when ‘__malloc_hook’
|
||
etc. is assigned to. On the other hand, if the hook functions provide
|
||
a complete malloc implementation of their own, it is vital that the
|
||
hooks are assigned to _before_ the very first ‘malloc’ call has
|
||
completed, because otherwise a chunk obtained from the ordinary,
|
||
un-hooked malloc may later be handed to ‘__free_hook’, for example.
|
||
|
||
Here is an example showing how to use ‘__malloc_hook’ and
|
||
‘__free_hook’ properly. It installs a function that prints out
|
||
information every time ‘malloc’ or ‘free’ is called. We just assume
|
||
here that ‘realloc’ and ‘memalign’ are not used in our program.
|
||
|
||
/* Prototypes for __malloc_hook, __free_hook */
|
||
#include <malloc.h>
|
||
|
||
/* Prototypes for our hooks. */
|
||
static void my_init_hook (void);
|
||
static void *my_malloc_hook (size_t, const void *);
|
||
static void my_free_hook (void*, const void *);
|
||
|
||
static void
|
||
my_init (void)
|
||
{
|
||
old_malloc_hook = __malloc_hook;
|
||
old_free_hook = __free_hook;
|
||
__malloc_hook = my_malloc_hook;
|
||
__free_hook = my_free_hook;
|
||
}
|
||
|
||
static void *
|
||
my_malloc_hook (size_t size, const void *caller)
|
||
{
|
||
void *result;
|
||
/* Restore all old hooks */
|
||
__malloc_hook = old_malloc_hook;
|
||
__free_hook = old_free_hook;
|
||
/* Call recursively */
|
||
result = malloc (size);
|
||
/* Save underlying hooks */
|
||
old_malloc_hook = __malloc_hook;
|
||
old_free_hook = __free_hook;
|
||
/* ‘printf’ might call ‘malloc’, so protect it too. */
|
||
printf ("malloc (%u) returns %p\n", (unsigned int) size, result);
|
||
/* Restore our own hooks */
|
||
__malloc_hook = my_malloc_hook;
|
||
__free_hook = my_free_hook;
|
||
return result;
|
||
}
|
||
|
||
static void
|
||
my_free_hook (void *ptr, const void *caller)
|
||
{
|
||
/* Restore all old hooks */
|
||
__malloc_hook = old_malloc_hook;
|
||
__free_hook = old_free_hook;
|
||
/* Call recursively */
|
||
free (ptr);
|
||
/* Save underlying hooks */
|
||
old_malloc_hook = __malloc_hook;
|
||
old_free_hook = __free_hook;
|
||
/* ‘printf’ might call ‘free’, so protect it too. */
|
||
printf ("freed pointer %p\n", ptr);
|
||
/* Restore our own hooks */
|
||
__malloc_hook = my_malloc_hook;
|
||
__free_hook = my_free_hook;
|
||
}
|
||
|
||
main ()
|
||
{
|
||
my_init ();
|
||
...
|
||
}
|
||
|
||
The ‘mcheck’ function (*note Heap Consistency Checking::) works by
|
||
installing such hooks.
|
||
|
||
|
||
File: libc.info, Node: Statistics of Malloc, Next: Summary of Malloc, Prev: Hooks for Malloc, Up: Unconstrained Allocation
|
||
|
||
3.2.3.10 Statistics for Memory Allocation with ‘malloc’
|
||
.......................................................
|
||
|
||
You can get information about dynamic memory allocation by calling the
|
||
‘mallinfo’ function. This function and its associated data type are
|
||
declared in ‘malloc.h’; they are an extension of the standard SVID/XPG
|
||
version.
|
||
|
||
-- Data Type: struct mallinfo
|
||
|
||
This structure type is used to return information about the dynamic
|
||
memory allocator. It contains the following members:
|
||
|
||
‘int arena’
|
||
This is the total size of memory allocated with ‘sbrk’ by
|
||
‘malloc’, in bytes.
|
||
|
||
‘int ordblks’
|
||
This is the number of chunks not in use. (The memory
|
||
allocator internally gets chunks of memory from the operating
|
||
system, and then carves them up to satisfy individual ‘malloc’
|
||
requests; *note The GNU Allocator::.)
|
||
|
||
‘int smblks’
|
||
This field is unused.
|
||
|
||
‘int hblks’
|
||
This is the total number of chunks allocated with ‘mmap’.
|
||
|
||
‘int hblkhd’
|
||
This is the total size of memory allocated with ‘mmap’, in
|
||
bytes.
|
||
|
||
‘int usmblks’
|
||
This field is unused and always 0.
|
||
|
||
‘int fsmblks’
|
||
This field is unused.
|
||
|
||
‘int uordblks’
|
||
This is the total size of memory occupied by chunks handed out
|
||
by ‘malloc’.
|
||
|
||
‘int fordblks’
|
||
This is the total size of memory occupied by free (not in use)
|
||
chunks.
|
||
|
||
‘int keepcost’
|
||
This is the size of the top-most releasable chunk that
|
||
normally borders the end of the heap (i.e., the high end of
|
||
the virtual address space’s data segment).
|
||
|
||
-- Function: struct mallinfo mallinfo (void)
|
||
|
||
Preliminary: | MT-Unsafe init const:mallopt | AS-Unsafe init lock |
|
||
AC-Unsafe init lock | *Note POSIX Safety Concepts::.
|
||
|
||
This function returns information about the current dynamic memory
|
||
usage in a structure of type ‘struct mallinfo’.
|
||
|
||
|
||
File: libc.info, Node: Summary of Malloc, Prev: Statistics of Malloc, Up: Unconstrained Allocation
|
||
|
||
3.2.3.11 Summary of ‘malloc’-Related Functions
|
||
..............................................
|
||
|
||
Here is a summary of the functions that work with ‘malloc’:
|
||
|
||
‘void *malloc (size_t SIZE)’
|
||
Allocate a block of SIZE bytes. *Note Basic Allocation::.
|
||
|
||
‘void free (void *ADDR)’
|
||
Free a block previously allocated by ‘malloc’. *Note Freeing after
|
||
Malloc::.
|
||
|
||
‘void *realloc (void *ADDR, size_t SIZE)’
|
||
Make a block previously allocated by ‘malloc’ larger or smaller,
|
||
possibly by copying it to a new location. *Note Changing Block
|
||
Size::.
|
||
|
||
‘void *reallocarray (void *PTR, size_t NMEMB, size_t SIZE)’
|
||
Change the size of a block previously allocated by ‘malloc’ to
|
||
‘NMEMB * SIZE’ bytes as with ‘realloc’. *Note Changing Block
|
||
Size::.
|
||
|
||
‘void *calloc (size_t COUNT, size_t ELTSIZE)’
|
||
Allocate a block of COUNT * ELTSIZE bytes using ‘malloc’, and set
|
||
its contents to zero. *Note Allocating Cleared Space::.
|
||
|
||
‘void *valloc (size_t SIZE)’
|
||
Allocate a block of SIZE bytes, starting on a page boundary. *Note
|
||
Aligned Memory Blocks::.
|
||
|
||
‘void *aligned_alloc (size_t SIZE, size_t ALIGNMENT)’
|
||
Allocate a block of SIZE bytes, starting on an address that is a
|
||
multiple of ALIGNMENT. *Note Aligned Memory Blocks::.
|
||
|
||
‘int posix_memalign (void **MEMPTR, size_t ALIGNMENT, size_t SIZE)’
|
||
Allocate a block of SIZE bytes, starting on an address that is a
|
||
multiple of ALIGNMENT. *Note Aligned Memory Blocks::.
|
||
|
||
‘void *memalign (size_t SIZE, size_t BOUNDARY)’
|
||
Allocate a block of SIZE bytes, starting on an address that is a
|
||
multiple of BOUNDARY. *Note Aligned Memory Blocks::.
|
||
|
||
‘int mallopt (int PARAM, int VALUE)’
|
||
Adjust a tunable parameter. *Note Malloc Tunable Parameters::.
|
||
|
||
‘int mcheck (void (*ABORTFN) (void))’
|
||
Tell ‘malloc’ to perform occasional consistency checks on
|
||
dynamically allocated memory, and to call ABORTFN when an
|
||
inconsistency is found. *Note Heap Consistency Checking::.
|
||
|
||
‘void *(*__malloc_hook) (size_t SIZE, const void *CALLER)’
|
||
A pointer to a function that ‘malloc’ uses whenever it is called.
|
||
|
||
‘void *(*__realloc_hook) (void *PTR, size_t SIZE, const void *CALLER)’
|
||
A pointer to a function that ‘realloc’ uses whenever it is called.
|
||
|
||
‘void (*__free_hook) (void *PTR, const void *CALLER)’
|
||
A pointer to a function that ‘free’ uses whenever it is called.
|
||
|
||
‘void (*__memalign_hook) (size_t SIZE, size_t ALIGNMENT, const void *CALLER)’
|
||
A pointer to a function that ‘aligned_alloc’, ‘memalign’,
|
||
‘posix_memalign’ and ‘valloc’ use whenever they are called.
|
||
|
||
‘struct mallinfo mallinfo (void)’
|
||
Return information about the current dynamic memory usage. *Note
|
||
Statistics of Malloc::.
|
||
|
||
|
||
File: libc.info, Node: Allocation Debugging, Next: Replacing malloc, Prev: Unconstrained Allocation, Up: Memory Allocation
|
||
|
||
3.2.4 Allocation Debugging
|
||
--------------------------
|
||
|
||
A complicated task when programming with languages which do not use
|
||
garbage collected dynamic memory allocation is to find memory leaks.
|
||
Long running programs must ensure that dynamically allocated objects are
|
||
freed at the end of their lifetime. If this does not happen the system
|
||
runs out of memory, sooner or later.
|
||
|
||
The ‘malloc’ implementation in the GNU C Library provides some simple
|
||
means to detect such leaks and obtain some information to find the
|
||
location. To do this the application must be started in a special mode
|
||
which is enabled by an environment variable. There are no speed
|
||
penalties for the program if the debugging mode is not enabled.
|
||
|
||
* Menu:
|
||
|
||
* Tracing malloc:: How to install the tracing functionality.
|
||
* Using the Memory Debugger:: Example programs excerpts.
|
||
* Tips for the Memory Debugger:: Some more or less clever ideas.
|
||
* Interpreting the traces:: What do all these lines mean?
|
||
|
||
|
||
File: libc.info, Node: Tracing malloc, Next: Using the Memory Debugger, Up: Allocation Debugging
|
||
|
||
3.2.4.1 How to install the tracing functionality
|
||
................................................
|
||
|
||
-- Function: void mtrace (void)
|
||
|
||
Preliminary: | MT-Unsafe env race:mtrace const:malloc_hooks init |
|
||
AS-Unsafe init heap corrupt lock | AC-Unsafe init corrupt lock fd
|
||
mem | *Note POSIX Safety Concepts::.
|
||
|
||
When the ‘mtrace’ function is called it looks for an environment
|
||
variable named ‘MALLOC_TRACE’. This variable is supposed to
|
||
contain a valid file name. The user must have write access. If
|
||
the file already exists it is truncated. If the environment
|
||
variable is not set or it does not name a valid file which can be
|
||
opened for writing nothing is done. The behavior of ‘malloc’ etc.
|
||
is not changed. For obvious reasons this also happens if the
|
||
application is installed with the SUID or SGID bit set.
|
||
|
||
If the named file is successfully opened, ‘mtrace’ installs special
|
||
handlers for the functions ‘malloc’, ‘realloc’, and ‘free’ (*note
|
||
Hooks for Malloc::). From then on, all uses of these functions are
|
||
traced and protocolled into the file. There is now of course a
|
||
speed penalty for all calls to the traced functions so tracing
|
||
should not be enabled during normal use.
|
||
|
||
This function is a GNU extension and generally not available on
|
||
other systems. The prototype can be found in ‘mcheck.h’.
|
||
|
||
-- Function: void muntrace (void)
|
||
|
||
Preliminary: | MT-Unsafe race:mtrace const:malloc_hooks locale |
|
||
AS-Unsafe corrupt heap | AC-Unsafe corrupt mem lock fd | *Note
|
||
POSIX Safety Concepts::.
|
||
|
||
The ‘muntrace’ function can be called after ‘mtrace’ was used to
|
||
enable tracing the ‘malloc’ calls. If no (successful) call of
|
||
‘mtrace’ was made ‘muntrace’ does nothing.
|
||
|
||
Otherwise it deinstalls the handlers for ‘malloc’, ‘realloc’, and
|
||
‘free’ and then closes the protocol file. No calls are protocolled
|
||
anymore and the program runs again at full speed.
|
||
|
||
This function is a GNU extension and generally not available on
|
||
other systems. The prototype can be found in ‘mcheck.h’.
|
||
|
||
|
||
File: libc.info, Node: Using the Memory Debugger, Next: Tips for the Memory Debugger, Prev: Tracing malloc, Up: Allocation Debugging
|
||
|
||
3.2.4.2 Example program excerpts
|
||
................................
|
||
|
||
Even though the tracing functionality does not influence the runtime
|
||
behavior of the program it is not a good idea to call ‘mtrace’ in all
|
||
programs. Just imagine that you debug a program using ‘mtrace’ and all
|
||
other programs used in the debugging session also trace their ‘malloc’
|
||
calls. The output file would be the same for all programs and thus is
|
||
unusable. Therefore one should call ‘mtrace’ only if compiled for
|
||
debugging. A program could therefore start like this:
|
||
|
||
#include <mcheck.h>
|
||
|
||
int
|
||
main (int argc, char *argv[])
|
||
{
|
||
#ifdef DEBUGGING
|
||
mtrace ();
|
||
#endif
|
||
...
|
||
}
|
||
|
||
This is all that is needed if you want to trace the calls during the
|
||
whole runtime of the program. Alternatively you can stop the tracing at
|
||
any time with a call to ‘muntrace’. It is even possible to restart the
|
||
tracing again with a new call to ‘mtrace’. But this can cause
|
||
unreliable results since there may be calls of the functions which are
|
||
not called. Please note that not only the application uses the traced
|
||
functions, also libraries (including the C library itself) use these
|
||
functions.
|
||
|
||
This last point is also why it is not a good idea to call ‘muntrace’
|
||
before the program terminates. The libraries are informed about the
|
||
termination of the program only after the program returns from ‘main’ or
|
||
calls ‘exit’ and so cannot free the memory they use before this time.
|
||
|
||
So the best thing one can do is to call ‘mtrace’ as the very first
|
||
function in the program and never call ‘muntrace’. So the program
|
||
traces almost all uses of the ‘malloc’ functions (except those calls
|
||
which are executed by constructors of the program or used libraries).
|
||
|
||
|
||
File: libc.info, Node: Tips for the Memory Debugger, Next: Interpreting the traces, Prev: Using the Memory Debugger, Up: Allocation Debugging
|
||
|
||
3.2.4.3 Some more or less clever ideas
|
||
......................................
|
||
|
||
You know the situation. The program is prepared for debugging and in
|
||
all debugging sessions it runs well. But once it is started without
|
||
debugging the error shows up. A typical example is a memory leak that
|
||
becomes visible only when we turn off the debugging. If you foresee
|
||
such situations you can still win. Simply use something equivalent to
|
||
the following little program:
|
||
|
||
#include <mcheck.h>
|
||
#include <signal.h>
|
||
|
||
static void
|
||
enable (int sig)
|
||
{
|
||
mtrace ();
|
||
signal (SIGUSR1, enable);
|
||
}
|
||
|
||
static void
|
||
disable (int sig)
|
||
{
|
||
muntrace ();
|
||
signal (SIGUSR2, disable);
|
||
}
|
||
|
||
int
|
||
main (int argc, char *argv[])
|
||
{
|
||
...
|
||
|
||
signal (SIGUSR1, enable);
|
||
signal (SIGUSR2, disable);
|
||
|
||
...
|
||
}
|
||
|
||
I.e., the user can start the memory debugger any time s/he wants if
|
||
the program was started with ‘MALLOC_TRACE’ set in the environment. The
|
||
output will of course not show the allocations which happened before the
|
||
first signal but if there is a memory leak this will show up
|
||
nevertheless.
|
||
|
||
|
||
File: libc.info, Node: Interpreting the traces, Prev: Tips for the Memory Debugger, Up: Allocation Debugging
|
||
|
||
3.2.4.4 Interpreting the traces
|
||
...............................
|
||
|
||
If you take a look at the output it will look similar to this:
|
||
|
||
= Start
|
||
[0x8048209] - 0x8064cc8
|
||
[0x8048209] - 0x8064ce0
|
||
[0x8048209] - 0x8064cf8
|
||
[0x80481eb] + 0x8064c48 0x14
|
||
[0x80481eb] + 0x8064c60 0x14
|
||
[0x80481eb] + 0x8064c78 0x14
|
||
[0x80481eb] + 0x8064c90 0x14
|
||
= End
|
||
|
||
What this all means is not really important since the trace file is
|
||
not meant to be read by a human. Therefore no attention is given to
|
||
readability. Instead there is a program which comes with the GNU C
|
||
Library which interprets the traces and outputs a summary in an
|
||
user-friendly way. The program is called ‘mtrace’ (it is in fact a Perl
|
||
script) and it takes one or two arguments. In any case the name of the
|
||
file with the trace output must be specified. If an optional argument
|
||
precedes the name of the trace file this must be the name of the program
|
||
which generated the trace.
|
||
|
||
drepper$ mtrace tst-mtrace log
|
||
No memory leaks.
|
||
|
||
In this case the program ‘tst-mtrace’ was run and it produced a trace
|
||
file ‘log’. The message printed by ‘mtrace’ shows there are no problems
|
||
with the code, all allocated memory was freed afterwards.
|
||
|
||
If we call ‘mtrace’ on the example trace given above we would get a
|
||
different outout:
|
||
|
||
drepper$ mtrace errlog
|
||
- 0x08064cc8 Free 2 was never alloc'd 0x8048209
|
||
- 0x08064ce0 Free 3 was never alloc'd 0x8048209
|
||
- 0x08064cf8 Free 4 was never alloc'd 0x8048209
|
||
|
||
Memory not freed:
|
||
-----------------
|
||
Address Size Caller
|
||
0x08064c48 0x14 at 0x80481eb
|
||
0x08064c60 0x14 at 0x80481eb
|
||
0x08064c78 0x14 at 0x80481eb
|
||
0x08064c90 0x14 at 0x80481eb
|
||
|
||
We have called ‘mtrace’ with only one argument and so the script has
|
||
no chance to find out what is meant with the addresses given in the
|
||
trace. We can do better:
|
||
|
||
drepper$ mtrace tst errlog
|
||
- 0x08064cc8 Free 2 was never alloc'd /home/drepper/tst.c:39
|
||
- 0x08064ce0 Free 3 was never alloc'd /home/drepper/tst.c:39
|
||
- 0x08064cf8 Free 4 was never alloc'd /home/drepper/tst.c:39
|
||
|
||
Memory not freed:
|
||
-----------------
|
||
Address Size Caller
|
||
0x08064c48 0x14 at /home/drepper/tst.c:33
|
||
0x08064c60 0x14 at /home/drepper/tst.c:33
|
||
0x08064c78 0x14 at /home/drepper/tst.c:33
|
||
0x08064c90 0x14 at /home/drepper/tst.c:33
|
||
|
||
Suddenly the output makes much more sense and the user can see
|
||
immediately where the function calls causing the trouble can be found.
|
||
|
||
Interpreting this output is not complicated. There are at most two
|
||
different situations being detected. First, ‘free’ was called for
|
||
pointers which were never returned by one of the allocation functions.
|
||
This is usually a very bad problem and what this looks like is shown in
|
||
the first three lines of the output. Situations like this are quite
|
||
rare and if they appear they show up very drastically: the program
|
||
normally crashes.
|
||
|
||
The other situation which is much harder to detect are memory leaks.
|
||
As you can see in the output the ‘mtrace’ function collects all this
|
||
information and so can say that the program calls an allocation function
|
||
from line 33 in the source file ‘/home/drepper/tst-mtrace.c’ four times
|
||
without freeing this memory before the program terminates. Whether this
|
||
is a real problem remains to be investigated.
|
||
|
||
|
||
File: libc.info, Node: Replacing malloc, Next: Obstacks, Prev: Allocation Debugging, Up: Memory Allocation
|
||
|
||
3.2.5 Replacing ‘malloc’
|
||
------------------------
|
||
|
||
The GNU C Library supports replacing the built-in ‘malloc’
|
||
implementation with a different allocator with the same interface. For
|
||
dynamically linked programs, this happens through ELF symbol
|
||
interposition, either using shared object dependencies or ‘LD_PRELOAD’.
|
||
For static linking, the ‘malloc’ replacement library must be linked in
|
||
before linking against ‘libc.a’ (explicitly or implicitly).
|
||
|
||
*Note:* Failure to provide a complete set of replacement functions
|
||
(that is, all the functions used by the application, the GNU C Library,
|
||
and other linked-in libraries) can lead to static linking failures, and,
|
||
at run time, to heap corruption and application crashes.
|
||
|
||
The minimum set of functions which has to be provided by a custom
|
||
‘malloc’ is given in the table below.
|
||
|
||
‘malloc’
|
||
‘free’
|
||
‘calloc’
|
||
‘realloc’
|
||
|
||
These ‘malloc’-related functions are required for the GNU C Library
|
||
to work.(1)
|
||
|
||
The ‘malloc’ implementation in the GNU C Library provides additional
|
||
functionality not used by the library itself, but which is often used by
|
||
other system libraries and applications. A general-purpose replacement
|
||
‘malloc’ implementation should provide definitions of these functions,
|
||
too. Their names are listed in the following table.
|
||
|
||
‘aligned_alloc’
|
||
‘malloc_usable_size’
|
||
‘memalign’
|
||
‘posix_memalign’
|
||
‘pvalloc’
|
||
‘valloc’
|
||
|
||
In addition, very old applications may use the obsolete ‘cfree’
|
||
function.
|
||
|
||
Further ‘malloc’-related functions such as ‘mallopt’ or ‘mallinfo’
|
||
will not have any effect or return incorrect statistics when a
|
||
replacement ‘malloc’ is in use. However, failure to replace these
|
||
functions typically does not result in crashes or other incorrect
|
||
application behavior, but may result in static linking failures.
|
||
|
||
---------- Footnotes ----------
|
||
|
||
(1) Versions of the GNU C Library before 2.25 required that a custom
|
||
‘malloc’ defines ‘__libc_memalign’ (with the same interface as the
|
||
‘memalign’ function).
|
||
|
||
|
||
File: libc.info, Node: Obstacks, Next: Variable Size Automatic, Prev: Replacing malloc, Up: Memory Allocation
|
||
|
||
3.2.6 Obstacks
|
||
--------------
|
||
|
||
An “obstack” is a pool of memory containing a stack of objects. You can
|
||
create any number of separate obstacks, and then allocate objects in
|
||
specified obstacks. Within each obstack, the last object allocated must
|
||
always be the first one freed, but distinct obstacks are independent of
|
||
each other.
|
||
|
||
Aside from this one constraint of order of freeing, obstacks are
|
||
totally general: an obstack can contain any number of objects of any
|
||
size. They are implemented with macros, so allocation is usually very
|
||
fast as long as the objects are usually small. And the only space
|
||
overhead per object is the padding needed to start each object on a
|
||
suitable boundary.
|
||
|
||
* Menu:
|
||
|
||
* Creating Obstacks:: How to declare an obstack in your program.
|
||
* Preparing for Obstacks:: Preparations needed before you can
|
||
use obstacks.
|
||
* Allocation in an Obstack:: Allocating objects in an obstack.
|
||
* Freeing Obstack Objects:: Freeing objects in an obstack.
|
||
* Obstack Functions:: The obstack functions are both
|
||
functions and macros.
|
||
* Growing Objects:: Making an object bigger by stages.
|
||
* Extra Fast Growing:: Extra-high-efficiency (though more
|
||
complicated) growing objects.
|
||
* Status of an Obstack:: Inquiries about the status of an obstack.
|
||
* Obstacks Data Alignment:: Controlling alignment of objects in obstacks.
|
||
* Obstack Chunks:: How obstacks obtain and release chunks;
|
||
efficiency considerations.
|
||
* Summary of Obstacks::
|
||
|
||
|
||
File: libc.info, Node: Creating Obstacks, Next: Preparing for Obstacks, Up: Obstacks
|
||
|
||
3.2.6.1 Creating Obstacks
|
||
.........................
|
||
|
||
The utilities for manipulating obstacks are declared in the header file
|
||
‘obstack.h’.
|
||
|
||
-- Data Type: struct obstack
|
||
|
||
An obstack is represented by a data structure of type ‘struct
|
||
obstack’. This structure has a small fixed size; it records the
|
||
status of the obstack and how to find the space in which objects
|
||
are allocated. It does not contain any of the objects themselves.
|
||
You should not try to access the contents of the structure
|
||
directly; use only the functions described in this chapter.
|
||
|
||
You can declare variables of type ‘struct obstack’ and use them as
|
||
obstacks, or you can allocate obstacks dynamically like any other kind
|
||
of object. Dynamic allocation of obstacks allows your program to have a
|
||
variable number of different stacks. (You can even allocate an obstack
|
||
structure in another obstack, but this is rarely useful.)
|
||
|
||
All the functions that work with obstacks require you to specify
|
||
which obstack to use. You do this with a pointer of type ‘struct
|
||
obstack *’. In the following, we often say “an obstack” when strictly
|
||
speaking the object at hand is such a pointer.
|
||
|
||
The objects in the obstack are packed into large blocks called
|
||
“chunks”. The ‘struct obstack’ structure points to a chain of the
|
||
chunks currently in use.
|
||
|
||
The obstack library obtains a new chunk whenever you allocate an
|
||
object that won’t fit in the previous chunk. Since the obstack library
|
||
manages chunks automatically, you don’t need to pay much attention to
|
||
them, but you do need to supply a function which the obstack library
|
||
should use to get a chunk. Usually you supply a function which uses
|
||
‘malloc’ directly or indirectly. You must also supply a function to
|
||
free a chunk. These matters are described in the following section.
|
||
|
||
|
||
File: libc.info, Node: Preparing for Obstacks, Next: Allocation in an Obstack, Prev: Creating Obstacks, Up: Obstacks
|
||
|
||
3.2.6.2 Preparing for Using Obstacks
|
||
....................................
|
||
|
||
Each source file in which you plan to use the obstack functions must
|
||
include the header file ‘obstack.h’, like this:
|
||
|
||
#include <obstack.h>
|
||
|
||
Also, if the source file uses the macro ‘obstack_init’, it must
|
||
declare or define two functions or macros that will be called by the
|
||
obstack library. One, ‘obstack_chunk_alloc’, is used to allocate the
|
||
chunks of memory into which objects are packed. The other,
|
||
‘obstack_chunk_free’, is used to return chunks when the objects in them
|
||
are freed. These macros should appear before any use of obstacks in the
|
||
source file.
|
||
|
||
Usually these are defined to use ‘malloc’ via the intermediary
|
||
‘xmalloc’ (*note Unconstrained Allocation::). This is done with the
|
||
following pair of macro definitions:
|
||
|
||
#define obstack_chunk_alloc xmalloc
|
||
#define obstack_chunk_free free
|
||
|
||
Though the memory you get using obstacks really comes from ‘malloc’,
|
||
using obstacks is faster because ‘malloc’ is called less often, for
|
||
larger blocks of memory. *Note Obstack Chunks::, for full details.
|
||
|
||
At run time, before the program can use a ‘struct obstack’ object as
|
||
an obstack, it must initialize the obstack by calling ‘obstack_init’.
|
||
|
||
-- Function: int obstack_init (struct obstack *OBSTACK-PTR)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe mem |
|
||
*Note POSIX Safety Concepts::.
|
||
|
||
Initialize obstack OBSTACK-PTR for allocation of objects. This
|
||
function calls the obstack’s ‘obstack_chunk_alloc’ function. If
|
||
allocation of memory fails, the function pointed to by
|
||
‘obstack_alloc_failed_handler’ is called. The ‘obstack_init’
|
||
function always returns 1 (Compatibility notice: Former versions of
|
||
obstack returned 0 if allocation failed).
|
||
|
||
Here are two examples of how to allocate the space for an obstack and
|
||
initialize it. First, an obstack that is a static variable:
|
||
|
||
static struct obstack myobstack;
|
||
...
|
||
obstack_init (&myobstack);
|
||
|
||
Second, an obstack that is itself dynamically allocated:
|
||
|
||
struct obstack *myobstack_ptr
|
||
= (struct obstack *) xmalloc (sizeof (struct obstack));
|
||
|
||
obstack_init (myobstack_ptr);
|
||
|
||
-- Variable: obstack_alloc_failed_handler
|
||
|
||
The value of this variable is a pointer to a function that
|
||
‘obstack’ uses when ‘obstack_chunk_alloc’ fails to allocate memory.
|
||
The default action is to print a message and abort. You should
|
||
supply a function that either calls ‘exit’ (*note Program
|
||
Termination::) or ‘longjmp’ (*note Non-Local Exits::) and doesn’t
|
||
return.
|
||
|
||
void my_obstack_alloc_failed (void)
|
||
...
|
||
obstack_alloc_failed_handler = &my_obstack_alloc_failed;
|
||
|
||
|
||
File: libc.info, Node: Allocation in an Obstack, Next: Freeing Obstack Objects, Prev: Preparing for Obstacks, Up: Obstacks
|
||
|
||
3.2.6.3 Allocation in an Obstack
|
||
................................
|
||
|
||
The most direct way to allocate an object in an obstack is with
|
||
‘obstack_alloc’, which is invoked almost like ‘malloc’.
|
||
|
||
-- Function: void * obstack_alloc (struct obstack *OBSTACK-PTR, int
|
||
SIZE)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
|
||
corrupt mem | *Note POSIX Safety Concepts::.
|
||
|
||
This allocates an uninitialized block of SIZE bytes in an obstack
|
||
and returns its address. Here OBSTACK-PTR specifies which obstack
|
||
to allocate the block in; it is the address of the ‘struct obstack’
|
||
object which represents the obstack. Each obstack function or
|
||
macro requires you to specify an OBSTACK-PTR as the first argument.
|
||
|
||
This function calls the obstack’s ‘obstack_chunk_alloc’ function if
|
||
it needs to allocate a new chunk of memory; it calls
|
||
‘obstack_alloc_failed_handler’ if allocation of memory by
|
||
‘obstack_chunk_alloc’ failed.
|
||
|
||
For example, here is a function that allocates a copy of a string STR
|
||
in a specific obstack, which is in the variable ‘string_obstack’:
|
||
|
||
struct obstack string_obstack;
|
||
|
||
char *
|
||
copystring (char *string)
|
||
{
|
||
size_t len = strlen (string) + 1;
|
||
char *s = (char *) obstack_alloc (&string_obstack, len);
|
||
memcpy (s, string, len);
|
||
return s;
|
||
}
|
||
|
||
To allocate a block with specified contents, use the function
|
||
‘obstack_copy’, declared like this:
|
||
|
||
-- Function: void * obstack_copy (struct obstack *OBSTACK-PTR, void
|
||
*ADDRESS, int SIZE)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
|
||
corrupt mem | *Note POSIX Safety Concepts::.
|
||
|
||
This allocates a block and initializes it by copying SIZE bytes of
|
||
data starting at ADDRESS. It calls ‘obstack_alloc_failed_handler’
|
||
if allocation of memory by ‘obstack_chunk_alloc’ failed.
|
||
|
||
-- Function: void * obstack_copy0 (struct obstack *OBSTACK-PTR, void
|
||
*ADDRESS, int SIZE)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
|
||
corrupt mem | *Note POSIX Safety Concepts::.
|
||
|
||
Like ‘obstack_copy’, but appends an extra byte containing a null
|
||
character. This extra byte is not counted in the argument SIZE.
|
||
|
||
The ‘obstack_copy0’ function is convenient for copying a sequence of
|
||
characters into an obstack as a null-terminated string. Here is an
|
||
example of its use:
|
||
|
||
char *
|
||
obstack_savestring (char *addr, int size)
|
||
{
|
||
return obstack_copy0 (&myobstack, addr, size);
|
||
}
|
||
|
||
Contrast this with the previous example of ‘savestring’ using ‘malloc’
|
||
(*note Basic Allocation::).
|
||
|
||
|
||
File: libc.info, Node: Freeing Obstack Objects, Next: Obstack Functions, Prev: Allocation in an Obstack, Up: Obstacks
|
||
|
||
3.2.6.4 Freeing Objects in an Obstack
|
||
.....................................
|
||
|
||
To free an object allocated in an obstack, use the function
|
||
‘obstack_free’. Since the obstack is a stack of objects, freeing one
|
||
object automatically frees all other objects allocated more recently in
|
||
the same obstack.
|
||
|
||
-- Function: void obstack_free (struct obstack *OBSTACK-PTR, void
|
||
*OBJECT)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
|
||
corrupt | *Note POSIX Safety Concepts::.
|
||
|
||
If OBJECT is a null pointer, everything allocated in the obstack is
|
||
freed. Otherwise, OBJECT must be the address of an object
|
||
allocated in the obstack. Then OBJECT is freed, along with
|
||
everything allocated in OBSTACK-PTR since OBJECT.
|
||
|
||
Note that if OBJECT is a null pointer, the result is an uninitialized
|
||
obstack. To free all memory in an obstack but leave it valid for
|
||
further allocation, call ‘obstack_free’ with the address of the first
|
||
object allocated on the obstack:
|
||
|
||
obstack_free (obstack_ptr, first_object_allocated_ptr);
|
||
|
||
Recall that the objects in an obstack are grouped into chunks. When
|
||
all the objects in a chunk become free, the obstack library
|
||
automatically frees the chunk (*note Preparing for Obstacks::). Then
|
||
other obstacks, or non-obstack allocation, can reuse the space of the
|
||
chunk.
|
||
|
||
|
||
File: libc.info, Node: Obstack Functions, Next: Growing Objects, Prev: Freeing Obstack Objects, Up: Obstacks
|
||
|
||
3.2.6.5 Obstack Functions and Macros
|
||
....................................
|
||
|
||
The interfaces for using obstacks may be defined either as functions or
|
||
as macros, depending on the compiler. The obstack facility works with
|
||
all C compilers, including both ISO C and traditional C, but there are
|
||
precautions you must take if you plan to use compilers other than GNU C.
|
||
|
||
If you are using an old-fashioned non-ISO C compiler, all the obstack
|
||
“functions” are actually defined only as macros. You can call these
|
||
macros like functions, but you cannot use them in any other way (for
|
||
example, you cannot take their address).
|
||
|
||
Calling the macros requires a special precaution: namely, the first
|
||
operand (the obstack pointer) may not contain any side effects, because
|
||
it may be computed more than once. For example, if you write this:
|
||
|
||
obstack_alloc (get_obstack (), 4);
|
||
|
||
you will find that ‘get_obstack’ may be called several times. If you
|
||
use ‘*obstack_list_ptr++’ as the obstack pointer argument, you will get
|
||
very strange results since the incrementation may occur several times.
|
||
|
||
In ISO C, each function has both a macro definition and a function
|
||
definition. The function definition is used if you take the address of
|
||
the function without calling it. An ordinary call uses the macro
|
||
definition by default, but you can request the function definition
|
||
instead by writing the function name in parentheses, as shown here:
|
||
|
||
char *x;
|
||
void *(*funcp) ();
|
||
/* Use the macro. */
|
||
x = (char *) obstack_alloc (obptr, size);
|
||
/* Call the function. */
|
||
x = (char *) (obstack_alloc) (obptr, size);
|
||
/* Take the address of the function. */
|
||
funcp = obstack_alloc;
|
||
|
||
This is the same situation that exists in ISO C for the standard library
|
||
functions. *Note Macro Definitions::.
|
||
|
||
*Warning:* When you do use the macros, you must observe the
|
||
precaution of avoiding side effects in the first operand, even in ISO C.
|
||
|
||
If you use the GNU C compiler, this precaution is not necessary,
|
||
because various language extensions in GNU C permit defining the macros
|
||
so as to compute each argument only once.
|
||
|
||
|
||
File: libc.info, Node: Growing Objects, Next: Extra Fast Growing, Prev: Obstack Functions, Up: Obstacks
|
||
|
||
3.2.6.6 Growing Objects
|
||
.......................
|
||
|
||
Because memory in obstack chunks is used sequentially, it is possible to
|
||
build up an object step by step, adding one or more bytes at a time to
|
||
the end of the object. With this technique, you do not need to know how
|
||
much data you will put in the object until you come to the end of it.
|
||
We call this the technique of “growing objects”. The special functions
|
||
for adding data to the growing object are described in this section.
|
||
|
||
You don’t need to do anything special when you start to grow an
|
||
object. Using one of the functions to add data to the object
|
||
automatically starts it. However, it is necessary to say explicitly
|
||
when the object is finished. This is done with the function
|
||
‘obstack_finish’.
|
||
|
||
The actual address of the object thus built up is not known until the
|
||
object is finished. Until then, it always remains possible that you
|
||
will add so much data that the object must be copied into a new chunk.
|
||
|
||
While the obstack is in use for a growing object, you cannot use it
|
||
for ordinary allocation of another object. If you try to do so, the
|
||
space already added to the growing object will become part of the other
|
||
object.
|
||
|
||
-- Function: void obstack_blank (struct obstack *OBSTACK-PTR, int SIZE)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
|
||
corrupt mem | *Note POSIX Safety Concepts::.
|
||
|
||
The most basic function for adding to a growing object is
|
||
‘obstack_blank’, which adds space without initializing it.
|
||
|
||
-- Function: void obstack_grow (struct obstack *OBSTACK-PTR, void
|
||
*DATA, int SIZE)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
|
||
corrupt mem | *Note POSIX Safety Concepts::.
|
||
|
||
To add a block of initialized space, use ‘obstack_grow’, which is
|
||
the growing-object analogue of ‘obstack_copy’. It adds SIZE bytes
|
||
of data to the growing object, copying the contents from DATA.
|
||
|
||
-- Function: void obstack_grow0 (struct obstack *OBSTACK-PTR, void
|
||
*DATA, int SIZE)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
|
||
corrupt mem | *Note POSIX Safety Concepts::.
|
||
|
||
This is the growing-object analogue of ‘obstack_copy0’. It adds
|
||
SIZE bytes copied from DATA, followed by an additional null
|
||
character.
|
||
|
||
-- Function: void obstack_1grow (struct obstack *OBSTACK-PTR, char C)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
|
||
corrupt mem | *Note POSIX Safety Concepts::.
|
||
|
||
To add one character at a time, use the function ‘obstack_1grow’.
|
||
It adds a single byte containing C to the growing object.
|
||
|
||
-- Function: void obstack_ptr_grow (struct obstack *OBSTACK-PTR, void
|
||
*DATA)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
|
||
corrupt mem | *Note POSIX Safety Concepts::.
|
||
|
||
Adding the value of a pointer one can use the function
|
||
‘obstack_ptr_grow’. It adds ‘sizeof (void *)’ bytes containing the
|
||
value of DATA.
|
||
|
||
-- Function: void obstack_int_grow (struct obstack *OBSTACK-PTR, int
|
||
DATA)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
|
||
corrupt mem | *Note POSIX Safety Concepts::.
|
||
|
||
A single value of type ‘int’ can be added by using the
|
||
‘obstack_int_grow’ function. It adds ‘sizeof (int)’ bytes to the
|
||
growing object and initializes them with the value of DATA.
|
||
|
||
-- Function: void * obstack_finish (struct obstack *OBSTACK-PTR)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
|
||
corrupt | *Note POSIX Safety Concepts::.
|
||
|
||
When you are finished growing the object, use the function
|
||
‘obstack_finish’ to close it off and return its final address.
|
||
|
||
Once you have finished the object, the obstack is available for
|
||
ordinary allocation or for growing another object.
|
||
|
||
This function can return a null pointer under the same conditions
|
||
as ‘obstack_alloc’ (*note Allocation in an Obstack::).
|
||
|
||
When you build an object by growing it, you will probably need to
|
||
know afterward how long it became. You need not keep track of this as
|
||
you grow the object, because you can find out the length from the
|
||
obstack just before finishing the object with the function
|
||
‘obstack_object_size’, declared as follows:
|
||
|
||
-- Function: int obstack_object_size (struct obstack *OBSTACK-PTR)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe | *Note
|
||
POSIX Safety Concepts::.
|
||
|
||
This function returns the current size of the growing object, in
|
||
bytes. Remember to call this function _before_ finishing the
|
||
object. After it is finished, ‘obstack_object_size’ will return
|
||
zero.
|
||
|
||
If you have started growing an object and wish to cancel it, you
|
||
should finish it and then free it, like this:
|
||
|
||
obstack_free (obstack_ptr, obstack_finish (obstack_ptr));
|
||
|
||
This has no effect if no object was growing.
|
||
|
||
You can use ‘obstack_blank’ with a negative size argument to make the
|
||
current object smaller. Just don’t try to shrink it beyond zero
|
||
length—there’s no telling what will happen if you do that.
|
||
|
||
|
||
File: libc.info, Node: Extra Fast Growing, Next: Status of an Obstack, Prev: Growing Objects, Up: Obstacks
|
||
|
||
3.2.6.7 Extra Fast Growing Objects
|
||
..................................
|
||
|
||
The usual functions for growing objects incur overhead for checking
|
||
whether there is room for the new growth in the current chunk. If you
|
||
are frequently constructing objects in small steps of growth, this
|
||
overhead can be significant.
|
||
|
||
You can reduce the overhead by using special “fast growth” functions
|
||
that grow the object without checking. In order to have a robust
|
||
program, you must do the checking yourself. If you do this checking in
|
||
the simplest way each time you are about to add data to the object, you
|
||
have not saved anything, because that is what the ordinary growth
|
||
functions do. But if you can arrange to check less often, or check more
|
||
efficiently, then you make the program faster.
|
||
|
||
The function ‘obstack_room’ returns the amount of room available in
|
||
the current chunk. It is declared as follows:
|
||
|
||
-- Function: int obstack_room (struct obstack *OBSTACK-PTR)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe | *Note
|
||
POSIX Safety Concepts::.
|
||
|
||
This returns the number of bytes that can be added safely to the
|
||
current growing object (or to an object about to be started) in
|
||
obstack OBSTACK-PTR using the fast growth functions.
|
||
|
||
While you know there is room, you can use these fast growth functions
|
||
for adding data to a growing object:
|
||
|
||
-- Function: void obstack_1grow_fast (struct obstack *OBSTACK-PTR, char
|
||
C)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
|
||
corrupt mem | *Note POSIX Safety Concepts::.
|
||
|
||
The function ‘obstack_1grow_fast’ adds one byte containing the
|
||
character C to the growing object in obstack OBSTACK-PTR.
|
||
|
||
-- Function: void obstack_ptr_grow_fast (struct obstack *OBSTACK-PTR,
|
||
void *DATA)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe | *Note
|
||
POSIX Safety Concepts::.
|
||
|
||
The function ‘obstack_ptr_grow_fast’ adds ‘sizeof (void *)’ bytes
|
||
containing the value of DATA to the growing object in obstack
|
||
OBSTACK-PTR.
|
||
|
||
-- Function: void obstack_int_grow_fast (struct obstack *OBSTACK-PTR,
|
||
int DATA)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe | *Note
|
||
POSIX Safety Concepts::.
|
||
|
||
The function ‘obstack_int_grow_fast’ adds ‘sizeof (int)’ bytes
|
||
containing the value of DATA to the growing object in obstack
|
||
OBSTACK-PTR.
|
||
|
||
-- Function: void obstack_blank_fast (struct obstack *OBSTACK-PTR, int
|
||
SIZE)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe | *Note
|
||
POSIX Safety Concepts::.
|
||
|
||
The function ‘obstack_blank_fast’ adds SIZE bytes to the growing
|
||
object in obstack OBSTACK-PTR without initializing them.
|
||
|
||
When you check for space using ‘obstack_room’ and there is not enough
|
||
room for what you want to add, the fast growth functions are not safe.
|
||
In this case, simply use the corresponding ordinary growth function
|
||
instead. Very soon this will copy the object to a new chunk; then there
|
||
will be lots of room available again.
|
||
|
||
So, each time you use an ordinary growth function, check afterward
|
||
for sufficient space using ‘obstack_room’. Once the object is copied to
|
||
a new chunk, there will be plenty of space again, so the program will
|
||
start using the fast growth functions again.
|
||
|
||
Here is an example:
|
||
|
||
void
|
||
add_string (struct obstack *obstack, const char *ptr, int len)
|
||
{
|
||
while (len > 0)
|
||
{
|
||
int room = obstack_room (obstack);
|
||
if (room == 0)
|
||
{
|
||
/* Not enough room. Add one character slowly,
|
||
which may copy to a new chunk and make room. */
|
||
obstack_1grow (obstack, *ptr++);
|
||
len--;
|
||
}
|
||
else
|
||
{
|
||
if (room > len)
|
||
room = len;
|
||
/* Add fast as much as we have room for. */
|
||
len -= room;
|
||
while (room-- > 0)
|
||
obstack_1grow_fast (obstack, *ptr++);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
File: libc.info, Node: Status of an Obstack, Next: Obstacks Data Alignment, Prev: Extra Fast Growing, Up: Obstacks
|
||
|
||
3.2.6.8 Status of an Obstack
|
||
............................
|
||
|
||
Here are functions that provide information on the current status of
|
||
allocation in an obstack. You can use them to learn about an object
|
||
while still growing it.
|
||
|
||
-- Function: void * obstack_base (struct obstack *OBSTACK-PTR)
|
||
|
||
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
This function returns the tentative address of the beginning of the
|
||
currently growing object in OBSTACK-PTR. If you finish the object
|
||
immediately, it will have that address. If you make it larger
|
||
first, it may outgrow the current chunk—then its address will
|
||
change!
|
||
|
||
If no object is growing, this value says where the next object you
|
||
allocate will start (once again assuming it fits in the current
|
||
chunk).
|
||
|
||
-- Function: void * obstack_next_free (struct obstack *OBSTACK-PTR)
|
||
|
||
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
This function returns the address of the first free byte in the
|
||
current chunk of obstack OBSTACK-PTR. This is the end of the
|
||
currently growing object. If no object is growing,
|
||
‘obstack_next_free’ returns the same value as ‘obstack_base’.
|
||
|
||
-- Function: int obstack_object_size (struct obstack *OBSTACK-PTR)
|
||
|
||
Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe | *Note
|
||
POSIX Safety Concepts::.
|
||
|
||
This function returns the size in bytes of the currently growing
|
||
object. This is equivalent to
|
||
|
||
obstack_next_free (OBSTACK-PTR) - obstack_base (OBSTACK-PTR)
|
||
|
||
|
||
File: libc.info, Node: Obstacks Data Alignment, Next: Obstack Chunks, Prev: Status of an Obstack, Up: Obstacks
|
||
|
||
3.2.6.9 Alignment of Data in Obstacks
|
||
.....................................
|
||
|
||
Each obstack has an “alignment boundary”; each object allocated in the
|
||
obstack automatically starts on an address that is a multiple of the
|
||
specified boundary. By default, this boundary is aligned so that the
|
||
object can hold any type of data.
|
||
|
||
To access an obstack’s alignment boundary, use the macro
|
||
‘obstack_alignment_mask’, whose function prototype looks like this:
|
||
|
||
-- Macro: int obstack_alignment_mask (struct obstack *OBSTACK-PTR)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The value is a bit mask; a bit that is 1 indicates that the
|
||
corresponding bit in the address of an object should be 0. The
|
||
mask value should be one less than a power of 2; the effect is that
|
||
all object addresses are multiples of that power of 2. The default
|
||
value of the mask is a value that allows aligned objects to hold
|
||
any type of data: for example, if its value is 3, any type of data
|
||
can be stored at locations whose addresses are multiples of 4. A
|
||
mask value of 0 means an object can start on any multiple of 1
|
||
(that is, no alignment is required).
|
||
|
||
The expansion of the macro ‘obstack_alignment_mask’ is an lvalue,
|
||
so you can alter the mask by assignment. For example, this
|
||
statement:
|
||
|
||
obstack_alignment_mask (obstack_ptr) = 0;
|
||
|
||
has the effect of turning off alignment processing in the specified
|
||
obstack.
|
||
|
||
Note that a change in alignment mask does not take effect until
|
||
_after_ the next time an object is allocated or finished in the obstack.
|
||
If you are not growing an object, you can make the new alignment mask
|
||
take effect immediately by calling ‘obstack_finish’. This will finish a
|
||
zero-length object and then do proper alignment for the next object.
|
||
|
||
|
||
File: libc.info, Node: Obstack Chunks, Next: Summary of Obstacks, Prev: Obstacks Data Alignment, Up: Obstacks
|
||
|
||
3.2.6.10 Obstack Chunks
|
||
.......................
|
||
|
||
Obstacks work by allocating space for themselves in large chunks, and
|
||
then parceling out space in the chunks to satisfy your requests. Chunks
|
||
are normally 4096 bytes long unless you specify a different chunk size.
|
||
The chunk size includes 8 bytes of overhead that are not actually used
|
||
for storing objects. Regardless of the specified size, longer chunks
|
||
will be allocated when necessary for long objects.
|
||
|
||
The obstack library allocates chunks by calling the function
|
||
‘obstack_chunk_alloc’, which you must define. When a chunk is no longer
|
||
needed because you have freed all the objects in it, the obstack library
|
||
frees the chunk by calling ‘obstack_chunk_free’, which you must also
|
||
define.
|
||
|
||
These two must be defined (as macros) or declared (as functions) in
|
||
each source file that uses ‘obstack_init’ (*note Creating Obstacks::).
|
||
Most often they are defined as macros like this:
|
||
|
||
#define obstack_chunk_alloc malloc
|
||
#define obstack_chunk_free free
|
||
|
||
Note that these are simple macros (no arguments). Macro definitions
|
||
with arguments will not work! It is necessary that
|
||
‘obstack_chunk_alloc’ or ‘obstack_chunk_free’, alone, expand into a
|
||
function name if it is not itself a function name.
|
||
|
||
If you allocate chunks with ‘malloc’, the chunk size should be a
|
||
power of 2. The default chunk size, 4096, was chosen because it is long
|
||
enough to satisfy many typical requests on the obstack yet short enough
|
||
not to waste too much memory in the portion of the last chunk not yet
|
||
used.
|
||
|
||
-- Macro: int obstack_chunk_size (struct obstack *OBSTACK-PTR)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This returns the chunk size of the given obstack.
|
||
|
||
Since this macro expands to an lvalue, you can specify a new chunk
|
||
size by assigning it a new value. Doing so does not affect the chunks
|
||
already allocated, but will change the size of chunks allocated for that
|
||
particular obstack in the future. It is unlikely to be useful to make
|
||
the chunk size smaller, but making it larger might improve efficiency if
|
||
you are allocating many objects whose size is comparable to the chunk
|
||
size. Here is how to do so cleanly:
|
||
|
||
if (obstack_chunk_size (obstack_ptr) < NEW-CHUNK-SIZE)
|
||
obstack_chunk_size (obstack_ptr) = NEW-CHUNK-SIZE;
|
||
|
||
|
||
File: libc.info, Node: Summary of Obstacks, Prev: Obstack Chunks, Up: Obstacks
|
||
|
||
3.2.6.11 Summary of Obstack Functions
|
||
.....................................
|
||
|
||
Here is a summary of all the functions associated with obstacks. Each
|
||
takes the address of an obstack (‘struct obstack *’) as its first
|
||
argument.
|
||
|
||
‘void obstack_init (struct obstack *OBSTACK-PTR)’
|
||
Initialize use of an obstack. *Note Creating Obstacks::.
|
||
|
||
‘void *obstack_alloc (struct obstack *OBSTACK-PTR, int SIZE)’
|
||
Allocate an object of SIZE uninitialized bytes. *Note Allocation
|
||
in an Obstack::.
|
||
|
||
‘void *obstack_copy (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)’
|
||
Allocate an object of SIZE bytes, with contents copied from
|
||
ADDRESS. *Note Allocation in an Obstack::.
|
||
|
||
‘void *obstack_copy0 (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)’
|
||
Allocate an object of SIZE+1 bytes, with SIZE of them copied from
|
||
ADDRESS, followed by a null character at the end. *Note Allocation
|
||
in an Obstack::.
|
||
|
||
‘void obstack_free (struct obstack *OBSTACK-PTR, void *OBJECT)’
|
||
Free OBJECT (and everything allocated in the specified obstack more
|
||
recently than OBJECT). *Note Freeing Obstack Objects::.
|
||
|
||
‘void obstack_blank (struct obstack *OBSTACK-PTR, int SIZE)’
|
||
Add SIZE uninitialized bytes to a growing object. *Note Growing
|
||
Objects::.
|
||
|
||
‘void obstack_grow (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)’
|
||
Add SIZE bytes, copied from ADDRESS, to a growing object. *Note
|
||
Growing Objects::.
|
||
|
||
‘void obstack_grow0 (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)’
|
||
Add SIZE bytes, copied from ADDRESS, to a growing object, and then
|
||
add another byte containing a null character. *Note Growing
|
||
Objects::.
|
||
|
||
‘void obstack_1grow (struct obstack *OBSTACK-PTR, char DATA-CHAR)’
|
||
Add one byte containing DATA-CHAR to a growing object. *Note
|
||
Growing Objects::.
|
||
|
||
‘void *obstack_finish (struct obstack *OBSTACK-PTR)’
|
||
Finalize the object that is growing and return its permanent
|
||
address. *Note Growing Objects::.
|
||
|
||
‘int obstack_object_size (struct obstack *OBSTACK-PTR)’
|
||
Get the current size of the currently growing object. *Note
|
||
Growing Objects::.
|
||
|
||
‘void obstack_blank_fast (struct obstack *OBSTACK-PTR, int SIZE)’
|
||
Add SIZE uninitialized bytes to a growing object without checking
|
||
that there is enough room. *Note Extra Fast Growing::.
|
||
|
||
‘void obstack_1grow_fast (struct obstack *OBSTACK-PTR, char DATA-CHAR)’
|
||
Add one byte containing DATA-CHAR to a growing object without
|
||
checking that there is enough room. *Note Extra Fast Growing::.
|
||
|
||
‘int obstack_room (struct obstack *OBSTACK-PTR)’
|
||
Get the amount of room now available for growing the current
|
||
object. *Note Extra Fast Growing::.
|
||
|
||
‘int obstack_alignment_mask (struct obstack *OBSTACK-PTR)’
|
||
The mask used for aligning the beginning of an object. This is an
|
||
lvalue. *Note Obstacks Data Alignment::.
|
||
|
||
‘int obstack_chunk_size (struct obstack *OBSTACK-PTR)’
|
||
The size for allocating chunks. This is an lvalue. *Note Obstack
|
||
Chunks::.
|
||
|
||
‘void *obstack_base (struct obstack *OBSTACK-PTR)’
|
||
Tentative starting address of the currently growing object. *Note
|
||
Status of an Obstack::.
|
||
|
||
‘void *obstack_next_free (struct obstack *OBSTACK-PTR)’
|
||
Address just after the end of the currently growing object. *Note
|
||
Status of an Obstack::.
|
||
|
||
|
||
File: libc.info, Node: Variable Size Automatic, Prev: Obstacks, Up: Memory Allocation
|
||
|
||
3.2.7 Automatic Storage with Variable Size
|
||
------------------------------------------
|
||
|
||
The function ‘alloca’ supports a kind of half-dynamic allocation in
|
||
which blocks are allocated dynamically but freed automatically.
|
||
|
||
Allocating a block with ‘alloca’ is an explicit action; you can
|
||
allocate as many blocks as you wish, and compute the size at run time.
|
||
But all the blocks are freed when you exit the function that ‘alloca’
|
||
was called from, just as if they were automatic variables declared in
|
||
that function. There is no way to free the space explicitly.
|
||
|
||
The prototype for ‘alloca’ is in ‘stdlib.h’. This function is a BSD
|
||
extension.
|
||
|
||
-- Function: void * alloca (size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The return value of ‘alloca’ is the address of a block of SIZE
|
||
bytes of memory, allocated in the stack frame of the calling
|
||
function.
|
||
|
||
Do not use ‘alloca’ inside the arguments of a function call—you will
|
||
get unpredictable results, because the stack space for the ‘alloca’
|
||
would appear on the stack in the middle of the space for the function
|
||
arguments. An example of what to avoid is ‘foo (x, alloca (4), y)’.
|
||
|
||
* Menu:
|
||
|
||
* Alloca Example:: Example of using ‘alloca’.
|
||
* Advantages of Alloca:: Reasons to use ‘alloca’.
|
||
* Disadvantages of Alloca:: Reasons to avoid ‘alloca’.
|
||
* GNU C Variable-Size Arrays:: Only in GNU C, here is an alternative
|
||
method of allocating dynamically and
|
||
freeing automatically.
|
||
|
||
|
||
File: libc.info, Node: Alloca Example, Next: Advantages of Alloca, Up: Variable Size Automatic
|
||
|
||
3.2.7.1 ‘alloca’ Example
|
||
........................
|
||
|
||
As an example of the use of ‘alloca’, here is a function that opens a
|
||
file name made from concatenating two argument strings, and returns a
|
||
file descriptor or minus one signifying failure:
|
||
|
||
int
|
||
open2 (char *str1, char *str2, int flags, int mode)
|
||
{
|
||
char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
|
||
stpcpy (stpcpy (name, str1), str2);
|
||
return open (name, flags, mode);
|
||
}
|
||
|
||
Here is how you would get the same results with ‘malloc’ and ‘free’:
|
||
|
||
int
|
||
open2 (char *str1, char *str2, int flags, int mode)
|
||
{
|
||
char *name = (char *) malloc (strlen (str1) + strlen (str2) + 1);
|
||
int desc;
|
||
if (name == 0)
|
||
fatal ("virtual memory exceeded");
|
||
stpcpy (stpcpy (name, str1), str2);
|
||
desc = open (name, flags, mode);
|
||
free (name);
|
||
return desc;
|
||
}
|
||
|
||
As you can see, it is simpler with ‘alloca’. But ‘alloca’ has other,
|
||
more important advantages, and some disadvantages.
|
||
|
||
|
||
File: libc.info, Node: Advantages of Alloca, Next: Disadvantages of Alloca, Prev: Alloca Example, Up: Variable Size Automatic
|
||
|
||
3.2.7.2 Advantages of ‘alloca’
|
||
..............................
|
||
|
||
Here are the reasons why ‘alloca’ may be preferable to ‘malloc’:
|
||
|
||
• Using ‘alloca’ wastes very little space and is very fast. (It is
|
||
open-coded by the GNU C compiler.)
|
||
|
||
• Since ‘alloca’ does not have separate pools for different sizes of
|
||
blocks, space used for any size block can be reused for any other
|
||
size. ‘alloca’ does not cause memory fragmentation.
|
||
|
||
• Nonlocal exits done with ‘longjmp’ (*note Non-Local Exits::)
|
||
automatically free the space allocated with ‘alloca’ when they exit
|
||
through the function that called ‘alloca’. This is the most
|
||
important reason to use ‘alloca’.
|
||
|
||
To illustrate this, suppose you have a function
|
||
‘open_or_report_error’ which returns a descriptor, like ‘open’, if
|
||
it succeeds, but does not return to its caller if it fails. If the
|
||
file cannot be opened, it prints an error message and jumps out to
|
||
the command level of your program using ‘longjmp’. Let’s change
|
||
‘open2’ (*note Alloca Example::) to use this subroutine:
|
||
|
||
int
|
||
open2 (char *str1, char *str2, int flags, int mode)
|
||
{
|
||
char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
|
||
stpcpy (stpcpy (name, str1), str2);
|
||
return open_or_report_error (name, flags, mode);
|
||
}
|
||
|
||
Because of the way ‘alloca’ works, the memory it allocates is freed
|
||
even when an error occurs, with no special effort required.
|
||
|
||
By contrast, the previous definition of ‘open2’ (which uses
|
||
‘malloc’ and ‘free’) would develop a memory leak if it were changed
|
||
in this way. Even if you are willing to make more changes to fix
|
||
it, there is no easy way to do so.
|
||
|
||
|
||
File: libc.info, Node: Disadvantages of Alloca, Next: GNU C Variable-Size Arrays, Prev: Advantages of Alloca, Up: Variable Size Automatic
|
||
|
||
3.2.7.3 Disadvantages of ‘alloca’
|
||
.................................
|
||
|
||
These are the disadvantages of ‘alloca’ in comparison with ‘malloc’:
|
||
|
||
• If you try to allocate more memory than the machine can provide,
|
||
you don’t get a clean error message. Instead you get a fatal
|
||
signal like the one you would get from an infinite recursion;
|
||
probably a segmentation violation (*note Program Error Signals::).
|
||
|
||
• Some non-GNU systems fail to support ‘alloca’, so it is less
|
||
portable. However, a slower emulation of ‘alloca’ written in C is
|
||
available for use on systems with this deficiency.
|
||
|
||
|
||
File: libc.info, Node: GNU C Variable-Size Arrays, Prev: Disadvantages of Alloca, Up: Variable Size Automatic
|
||
|
||
3.2.7.4 GNU C Variable-Size Arrays
|
||
..................................
|
||
|
||
In GNU C, you can replace most uses of ‘alloca’ with an array of
|
||
variable size. Here is how ‘open2’ would look then:
|
||
|
||
int open2 (char *str1, char *str2, int flags, int mode)
|
||
{
|
||
char name[strlen (str1) + strlen (str2) + 1];
|
||
stpcpy (stpcpy (name, str1), str2);
|
||
return open (name, flags, mode);
|
||
}
|
||
|
||
But ‘alloca’ is not always equivalent to a variable-sized array, for
|
||
several reasons:
|
||
|
||
• A variable size array’s space is freed at the end of the scope of
|
||
the name of the array. The space allocated with ‘alloca’ remains
|
||
until the end of the function.
|
||
|
||
• It is possible to use ‘alloca’ within a loop, allocating an
|
||
additional block on each iteration. This is impossible with
|
||
variable-sized arrays.
|
||
|
||
*NB:* If you mix use of ‘alloca’ and variable-sized arrays within one
|
||
function, exiting a scope in which a variable-sized array was declared
|
||
frees all blocks allocated with ‘alloca’ during the execution of that
|
||
scope.
|
||
|
||
|
||
File: libc.info, Node: Resizing the Data Segment, Next: Memory Protection, Prev: Memory Allocation, Up: Memory
|
||
|
||
3.3 Resizing the Data Segment
|
||
=============================
|
||
|
||
The symbols in this section are declared in ‘unistd.h’.
|
||
|
||
You will not normally use the functions in this section, because the
|
||
functions described in *note Memory Allocation:: are easier to use.
|
||
Those are interfaces to a GNU C Library memory allocator that uses the
|
||
functions below itself. The functions below are simple interfaces to
|
||
system calls.
|
||
|
||
-- Function: int brk (void *ADDR)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘brk’ sets the high end of the calling process’ data segment to
|
||
ADDR.
|
||
|
||
The address of the end of a segment is defined to be the address of
|
||
the last byte in the segment plus 1.
|
||
|
||
The function has no effect if ADDR is lower than the low end of the
|
||
data segment. (This is considered success, by the way.)
|
||
|
||
The function fails if it would cause the data segment to overlap
|
||
another segment or exceed the process’ data storage limit (*note
|
||
Limits on Resources::).
|
||
|
||
The function is named for a common historical case where data
|
||
storage and the stack are in the same segment. Data storage
|
||
allocation grows upward from the bottom of the segment while the
|
||
stack grows downward toward it from the top of the segment and the
|
||
curtain between them is called the “break”.
|
||
|
||
The return value is zero on success. On failure, the return value
|
||
is ‘-1’ and ‘errno’ is set accordingly. The following ‘errno’
|
||
values are specific to this function:
|
||
|
||
‘ENOMEM’
|
||
The request would cause the data segment to overlap another
|
||
segment or exceed the process’ data storage limit.
|
||
|
||
-- Function: void *sbrk (ptrdiff_t DELTA)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function is the same as ‘brk’ except that you specify the new
|
||
end of the data segment as an offset DELTA from the current end and
|
||
on success the return value is the address of the resulting end of
|
||
the data segment instead of zero.
|
||
|
||
This means you can use ‘sbrk(0)’ to find out what the current end
|
||
of the data segment is.
|
||
|
||
|
||
File: libc.info, Node: Memory Protection, Next: Locking Pages, Prev: Resizing the Data Segment, Up: Memory
|
||
|
||
3.4 Memory Protection
|
||
=====================
|
||
|
||
When a page is mapped using ‘mmap’, page protection flags can be
|
||
specified using the protection flags argument. *Note Memory-mapped
|
||
I/O::.
|
||
|
||
The following flags are available:
|
||
|
||
‘PROT_WRITE’
|
||
|
||
The memory can be written to.
|
||
|
||
‘PROT_READ’
|
||
|
||
The memory can be read. On some architectures, this flag implies
|
||
that the memory can be executed as well (as if ‘PROT_EXEC’ had been
|
||
specified at the same time).
|
||
|
||
‘PROT_EXEC’
|
||
|
||
The memory can be used to store instructions which can then be
|
||
executed. On most architectures, this flag implies that the memory
|
||
can be read (as if ‘PROT_READ’ had been specified).
|
||
|
||
‘PROT_NONE’
|
||
|
||
This flag must be specified on its own.
|
||
|
||
The memory is reserved, but cannot be read, written, or executed.
|
||
If this flag is specified in a call to ‘mmap’, a virtual memory
|
||
area will be set aside for future use in the process, and ‘mmap’
|
||
calls without the ‘MAP_FIXED’ flag will not use it for subsequent
|
||
allocations. For anonymous mappings, the kernel will not reserve
|
||
any physical memory for the allocation at the time the mapping is
|
||
created.
|
||
|
||
The operating system may keep track of these flags separately even if
|
||
the underlying hardware treats them the same for the purposes of access
|
||
checking (as happens with ‘PROT_READ’ and ‘PROT_EXEC’ on some
|
||
platforms). On GNU systems, ‘PROT_EXEC’ always implies ‘PROT_READ’, so
|
||
that users can view the machine code which is executing on their system.
|
||
|
||
Inappropriate access will cause a segfault (*note Program Error
|
||
Signals::).
|
||
|
||
After allocation, protection flags can be changed using the
|
||
‘mprotect’ function.
|
||
|
||
-- Function: int mprotect (void *ADDRESS, size_t LENGTH, int
|
||
PROTECTION)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
A successful call to the ‘mprotect’ function changes the protection
|
||
flags of at least LENGTH bytes of memory, starting at ADDRESS.
|
||
|
||
ADDRESS must be aligned to the page size for the mapping. The
|
||
system page size can be obtained by calling ‘sysconf’ with the
|
||
‘_SC_PAGESIZE’ parameter (*note Sysconf Definition::). The system
|
||
page size is the granularity in which the page protection of
|
||
anonymous memory mappings and most file mappings can be changed.
|
||
Memory which is mapped from special files or devices may have
|
||
larger page granularity than the system page size and may require
|
||
larger alignment.
|
||
|
||
LENGTH is the number of bytes whose protection flags must be
|
||
changed. It is automatically rounded up to the next multiple of
|
||
the system page size.
|
||
|
||
PROTECTION is a combination of the ‘PROT_*’ flags described above.
|
||
|
||
The ‘mprotect’ function returns 0 on success and -1 on failure.
|
||
|
||
The following ‘errno’ error conditions are defined for this
|
||
function:
|
||
|
||
‘ENOMEM’
|
||
The system was not able to allocate resources to fulfill the
|
||
request. This can happen if there is not enough physical
|
||
memory in the system for the allocation of backing storage.
|
||
The error can also occur if the new protection flags would
|
||
cause the memory region to be split from its neighbors, and
|
||
the process limit for the number of such distinct memory
|
||
regions would be exceeded.
|
||
|
||
‘EINVAL’
|
||
ADDRESS is not properly aligned to a page boundary for the
|
||
mapping, or LENGTH (after rounding up to the system page size)
|
||
is not a multiple of the applicable page size for the mapping,
|
||
or the combination of flags in PROTECTION is not valid.
|
||
|
||
‘EACCES’
|
||
The file for a file-based mapping was not opened with open
|
||
flags which are compatible with PROTECTION.
|
||
|
||
‘EPERM’
|
||
The system security policy does not allow a mapping with the
|
||
specified flags. For example, mappings which are both
|
||
‘PROT_EXEC’ and ‘PROT_WRITE’ at the same time might not be
|
||
allowed.
|
||
|
||
If the ‘mprotect’ function is used to make a region of memory
|
||
inaccessible by specifying the ‘PROT_NONE’ protection flag and access is
|
||
later restored, the memory retains its previous contents.
|
||
|
||
On some systems, it may not be possible to specify additional flags
|
||
which were not present when the mapping was first created. For example,
|
||
an attempt to make a region of memory executable could fail if the
|
||
initial protection flags were ‘PROT_READ | PROT_WRITE’.
|
||
|
||
In general, the ‘mprotect’ function can be used to change any process
|
||
memory, no matter how it was allocated. However, portable use of the
|
||
function requires that it is only used with memory regions returned by
|
||
‘mmap’ or ‘mmap64’.
|
||
|
||
3.4.1 Memory Protection Keys
|
||
----------------------------
|
||
|
||
On some systems, further restrictions can be added to specific pages
|
||
using “memory protection keys”. These restrictions work as follows:
|
||
|
||
• All memory pages are associated with a protection key. The default
|
||
protection key does not cause any additional protections to be
|
||
applied during memory accesses. New keys can be allocated with the
|
||
‘pkey_alloc’ function, and applied to pages using ‘pkey_mprotect’.
|
||
|
||
• Each thread has a set of separate access right restriction for each
|
||
protection key. These access rights can be manipulated using the
|
||
‘pkey_set’ and ‘pkey_get’ functions.
|
||
|
||
• During a memory access, the system obtains the protection key for
|
||
the accessed page and uses that to determine the applicable access
|
||
rights, as configured for the current thread. If the access is
|
||
restricted, a segmentation fault is the result ((*note Program
|
||
Error Signals::). These checks happen in addition to the ‘PROT_’*
|
||
protection flags set by ‘mprotect’ or ‘pkey_mprotect’.
|
||
|
||
New threads and subprocesses inherit the access rights of the current
|
||
thread. If a protection key is allocated subsequently, existing threads
|
||
(except the current) will use an unspecified system default for the
|
||
access rights associated with newly allocated keys.
|
||
|
||
Upon entering a signal handler, the system resets the access rights
|
||
of the current thread so that pages with the default key can be
|
||
accessed, but the access rights for other protection keys are
|
||
unspecified.
|
||
|
||
Applications are expected to allocate a key once using ‘pkey_alloc’,
|
||
and apply the key to memory regions which need special protection with
|
||
‘pkey_mprotect’:
|
||
|
||
int key = pkey_alloc (0, PKEY_DISABLE_ACCESS);
|
||
if (key < 0)
|
||
/* Perform error checking, including fallback for lack of support. */
|
||
...;
|
||
|
||
/* Apply the key to a special memory region used to store critical
|
||
data. */
|
||
if (pkey_mprotect (region, region_length,
|
||
PROT_READ | PROT_WRITE, key) < 0)
|
||
...; /* Perform error checking (generally fatal). */
|
||
|
||
If the key allocation fails due to lack of support for memory
|
||
protection keys, the ‘pkey_mprotect’ call can usually be skipped. In
|
||
this case, the region will not be protected by default. It is also
|
||
possible to call ‘pkey_mprotect’ with a key value of -1, in which case
|
||
it will behave in the same way as ‘mprotect’.
|
||
|
||
After key allocation assignment to memory pages, ‘pkey_set’ can be
|
||
used to temporarily acquire access to the memory region and relinquish
|
||
it again:
|
||
|
||
if (key >= 0 && pkey_set (key, 0) < 0)
|
||
...; /* Perform error checking (generally fatal). */
|
||
/* At this point, the current thread has read-write access to the
|
||
memory region. */
|
||
...
|
||
/* Revoke access again. */
|
||
if (key >= 0 && pkey_set (key, PKEY_DISABLE_ACCESS) < 0)
|
||
...; /* Perform error checking (generally fatal). */
|
||
|
||
In this example, a negative key value indicates that no key had been
|
||
allocated, which means that the system lacks support for memory
|
||
protection keys and it is not necessary to change the the access rights
|
||
of the current thread (because it always has access).
|
||
|
||
Compared to using ‘mprotect’ to change the page protection flags,
|
||
this approach has two advantages: It is thread-safe in the sense that
|
||
the access rights are only changed for the current thread, so another
|
||
thread which changes its own access rights concurrently to gain access
|
||
to the mapping will not suddenly see its access rights revoked. And
|
||
‘pkey_set’ typically does not involve a call into the kernel and a
|
||
context switch, so it is more efficient.
|
||
|
||
-- Function: int pkey_alloc (unsigned int FLAGS, unsigned int
|
||
RESTRICTIONS)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Unsafe corrupt | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
Allocate a new protection key. The FLAGS argument is reserved and
|
||
must be zero. The RESTRICTIONS argument specifies access rights
|
||
which are applied to the current thread (as if with ‘pkey_set’
|
||
below). Access rights of other threads are not changed.
|
||
|
||
The function returns the new protection key, a non-negative number,
|
||
or -1 on error.
|
||
|
||
The following ‘errno’ error conditions are defined for this
|
||
function:
|
||
|
||
‘ENOSYS’
|
||
The system does not implement memory protection keys.
|
||
|
||
‘EINVAL’
|
||
The FLAGS argument is not zero.
|
||
|
||
The RESTRICTIONS argument is invalid.
|
||
|
||
The system does not implement memory protection keys or runs
|
||
in a mode in which memory protection keys are disabled.
|
||
|
||
‘ENOSPC’
|
||
All available protection keys already have been allocated.
|
||
|
||
-- Function: int pkey_free (int KEY)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Deallocate the protection key, so that it can be reused by
|
||
‘pkey_alloc’.
|
||
|
||
Calling this function does not change the access rights of the
|
||
freed protection key. The calling thread and other threads may
|
||
retain access to it, even if it is subsequently allocated again.
|
||
For this reason, it is not recommended to call the ‘pkey_free’
|
||
function.
|
||
|
||
‘ENOSYS’
|
||
The system does not implement memory protection keys.
|
||
|
||
‘EINVAL’
|
||
The KEY argument is not a valid protection key.
|
||
|
||
-- Function: int pkey_mprotect (void *ADDRESS, size_t LENGTH, int
|
||
PROTECTION, int KEY)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Similar to ‘mprotect’, but also set the memory protection key for
|
||
the memory region to ‘key’.
|
||
|
||
Some systems use memory protection keys to emulate certain
|
||
combinations of PROTECTION flags. Under such circumstances,
|
||
specifying an explicit protection key may behave as if additional
|
||
flags have been specified in PROTECTION, even though this does not
|
||
happen with the default protection key. For example, some systems
|
||
can support ‘PROT_EXEC’-only mappings only with a default
|
||
protection key, and memory with a key which was allocated using
|
||
‘pkey_alloc’ will still be readable if ‘PROT_EXEC’ is specified
|
||
without ‘PROT_READ’.
|
||
|
||
If KEY is -1, the default protection key is applied to the mapping,
|
||
just as if ‘mprotect’ had been called.
|
||
|
||
The ‘pkey_mprotect’ function returns 0 on success and -1 on
|
||
failure. The same ‘errno’ error conditions as for ‘mprotect’ are
|
||
defined for this function, with the following addition:
|
||
|
||
‘EINVAL’
|
||
The KEY argument is not -1 or a valid memory protection key
|
||
allocated using ‘pkey_alloc’.
|
||
|
||
‘ENOSYS’
|
||
The system does not implement memory protection keys, and KEY
|
||
is not -1.
|
||
|
||
-- Function: int pkey_set (int KEY, unsigned int RIGHTS)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Change the access rights of the current thread for memory pages
|
||
with the protection key KEY to RIGHTS. If RIGHTS is zero, no
|
||
additional access restrictions on top of the page protection flags
|
||
are applied. Otherwise, RIGHTS is a combination of the following
|
||
flags:
|
||
|
||
‘PKEY_DISABLE_WRITE’
|
||
|
||
Subsequent attempts to write to memory with the specified
|
||
protection key will fault.
|
||
|
||
‘PKEY_DISABLE_ACCESS’
|
||
|
||
Subsequent attempts to write to or read from memory with the
|
||
specified protection key will fault.
|
||
|
||
Operations not specified as flags are not restricted. In
|
||
particular, this means that the memory region will remain
|
||
executable if it was mapped with the ‘PROT_EXEC’ protection flag
|
||
and ‘PKEY_DISABLE_ACCESS’ has been specified.
|
||
|
||
Calling the ‘pkey_set’ function with a protection key which was not
|
||
allocated by ‘pkey_alloc’ results in undefined behavior. This
|
||
means that calling this function on systems which do not support
|
||
memory protection keys is undefined.
|
||
|
||
The ‘pkey_set’ function returns 0 on success and -1 on failure.
|
||
|
||
The following ‘errno’ error conditions are defined for this
|
||
function:
|
||
|
||
‘EINVAL’
|
||
The system does not support the access rights restrictions
|
||
expressed in the RIGHTS argument.
|
||
|
||
-- Function: int pkey_get (int KEY)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Return the access rights of the current thread for memory pages
|
||
with protection key KEY. The return value is zero or a combination
|
||
of the ‘PKEY_DISABLE_’* flags; see the ‘pkey_set’ function.
|
||
|
||
Calling the ‘pkey_get’ function with a protection key which was not
|
||
allocated by ‘pkey_alloc’ results in undefined behavior. This
|
||
means that calling this function on systems which do not support
|
||
memory protection keys is undefined.
|
||
|
||
|
||
File: libc.info, Node: Locking Pages, Prev: Memory Protection, Up: Memory
|
||
|
||
3.5 Locking Pages
|
||
=================
|
||
|
||
You can tell the system to associate a particular virtual memory page
|
||
with a real page frame and keep it that way — i.e., cause the page to be
|
||
paged in if it isn’t already and mark it so it will never be paged out
|
||
and consequently will never cause a page fault. This is called
|
||
“locking” a page.
|
||
|
||
The functions in this chapter lock and unlock the calling process’
|
||
pages.
|
||
|
||
* Menu:
|
||
|
||
* Why Lock Pages:: Reasons to read this section.
|
||
* Locked Memory Details:: Everything you need to know locked
|
||
memory
|
||
* Page Lock Functions:: Here’s how to do it.
|
||
|
||
|
||
File: libc.info, Node: Why Lock Pages, Next: Locked Memory Details, Up: Locking Pages
|
||
|
||
3.5.1 Why Lock Pages
|
||
--------------------
|
||
|
||
Because page faults cause paged out pages to be paged in transparently,
|
||
a process rarely needs to be concerned about locking pages. However,
|
||
there are two reasons people sometimes are:
|
||
|
||
• Speed. A page fault is transparent only insofar as the process is
|
||
not sensitive to how long it takes to do a simple memory access.
|
||
Time-critical processes, especially realtime processes, may not be
|
||
able to wait or may not be able to tolerate variance in execution
|
||
speed.
|
||
|
||
A process that needs to lock pages for this reason probably also
|
||
needs priority among other processes for use of the CPU. *Note
|
||
Priority::.
|
||
|
||
In some cases, the programmer knows better than the system’s demand
|
||
paging allocator which pages should remain in real memory to
|
||
optimize system performance. In this case, locking pages can help.
|
||
|
||
• Privacy. If you keep secrets in virtual memory and that virtual
|
||
memory gets paged out, that increases the chance that the secrets
|
||
will get out. If a passphrase gets written out to disk swap space,
|
||
for example, it might still be there long after virtual and real
|
||
memory have been wiped clean.
|
||
|
||
Be aware that when you lock a page, that’s one fewer page frame that
|
||
can be used to back other virtual memory (by the same or other
|
||
processes), which can mean more page faults, which means the system runs
|
||
more slowly. In fact, if you lock enough memory, some programs may not
|
||
be able to run at all for lack of real memory.
|
||
|
||
|
||
File: libc.info, Node: Locked Memory Details, Next: Page Lock Functions, Prev: Why Lock Pages, Up: Locking Pages
|
||
|
||
3.5.2 Locked Memory Details
|
||
---------------------------
|
||
|
||
A memory lock is associated with a virtual page, not a real frame. The
|
||
paging rule is: If a frame backs at least one locked page, don’t page it
|
||
out.
|
||
|
||
Memory locks do not stack. I.e., you can’t lock a particular page
|
||
twice so that it has to be unlocked twice before it is truly unlocked.
|
||
It is either locked or it isn’t.
|
||
|
||
A memory lock persists until the process that owns the memory
|
||
explicitly unlocks it. (But process termination and exec cause the
|
||
virtual memory to cease to exist, which you might say means it isn’t
|
||
locked any more).
|
||
|
||
Memory locks are not inherited by child processes. (But note that on
|
||
a modern Unix system, immediately after a fork, the parent’s and the
|
||
child’s virtual address space are backed by the same real page frames,
|
||
so the child enjoys the parent’s locks). *Note Creating a Process::.
|
||
|
||
Because of its ability to impact other processes, only the superuser
|
||
can lock a page. Any process can unlock its own page.
|
||
|
||
The system sets limits on the amount of memory a process can have
|
||
locked and the amount of real memory it can have dedicated to it. *Note
|
||
Limits on Resources::.
|
||
|
||
In Linux, locked pages aren’t as locked as you might think. Two
|
||
virtual pages that are not shared memory can nonetheless be backed by
|
||
the same real frame. The kernel does this in the name of efficiency
|
||
when it knows both virtual pages contain identical data, and does it
|
||
even if one or both of the virtual pages are locked.
|
||
|
||
But when a process modifies one of those pages, the kernel must get
|
||
it a separate frame and fill it with the page’s data. This is known as
|
||
a “copy-on-write page fault”. It takes a small amount of time and in a
|
||
pathological case, getting that frame may require I/O.
|
||
|
||
To make sure this doesn’t happen to your program, don’t just lock the
|
||
pages. Write to them as well, unless you know you won’t write to them
|
||
ever. And to make sure you have pre-allocated frames for your stack,
|
||
enter a scope that declares a C automatic variable larger than the
|
||
maximum stack size you will need, set it to something, then return from
|
||
its scope.
|
||
|
||
|
||
File: libc.info, Node: Page Lock Functions, Prev: Locked Memory Details, Up: Locking Pages
|
||
|
||
3.5.3 Functions To Lock And Unlock Pages
|
||
----------------------------------------
|
||
|
||
The symbols in this section are declared in ‘sys/mman.h’. These
|
||
functions are defined by POSIX.1b, but their availability depends on
|
||
your kernel. If your kernel doesn’t allow these functions, they exist
|
||
but always fail. They _are_ available with a Linux kernel.
|
||
|
||
*Portability Note:* POSIX.1b requires that when the ‘mlock’ and
|
||
‘munlock’ functions are available, the file ‘unistd.h’ define the macro
|
||
‘_POSIX_MEMLOCK_RANGE’ and the file ‘limits.h’ define the macro
|
||
‘PAGESIZE’ to be the size of a memory page in bytes. It requires that
|
||
when the ‘mlockall’ and ‘munlockall’ functions are available, the
|
||
‘unistd.h’ file define the macro ‘_POSIX_MEMLOCK’. The GNU C Library
|
||
conforms to this requirement.
|
||
|
||
-- Function: int mlock (const void *ADDR, size_t LEN)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘mlock’ locks a range of the calling process’ virtual pages.
|
||
|
||
The range of memory starts at address ADDR and is LEN bytes long.
|
||
Actually, since you must lock whole pages, it is the range of pages
|
||
that include any part of the specified range.
|
||
|
||
When the function returns successfully, each of those pages is
|
||
backed by (connected to) a real frame (is resident) and is marked
|
||
to stay that way. This means the function may cause page-ins and
|
||
have to wait for them.
|
||
|
||
When the function fails, it does not affect the lock status of any
|
||
pages.
|
||
|
||
The return value is zero if the function succeeds. Otherwise, it
|
||
is ‘-1’ and ‘errno’ is set accordingly. ‘errno’ values specific to
|
||
this function are:
|
||
|
||
‘ENOMEM’
|
||
• At least some of the specified address range does not
|
||
exist in the calling process’ virtual address space.
|
||
• The locking would cause the process to exceed its locked
|
||
page limit.
|
||
|
||
‘EPERM’
|
||
The calling process is not superuser.
|
||
|
||
‘EINVAL’
|
||
LEN is not positive.
|
||
|
||
‘ENOSYS’
|
||
The kernel does not provide ‘mlock’ capability.
|
||
|
||
-- Function: int mlock2 (const void *ADDR, size_t LEN, unsigned int
|
||
FLAGS)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function is similar to ‘mlock’. If FLAGS is zero, a call to
|
||
‘mlock2’ behaves exactly as the equivalent call to ‘mlock’.
|
||
|
||
The FLAGS argument must be a combination of zero or more of the
|
||
following flags:
|
||
|
||
‘MLOCK_ONFAULT’
|
||
|
||
Only those pages in the specified address range which are
|
||
already in memory are locked immediately. Additional pages in
|
||
the range are automatically locked in case of a page fault and
|
||
allocation of memory.
|
||
|
||
Like ‘mlock’, ‘mlock2’ returns zero on success and ‘-1’ on failure,
|
||
setting ‘errno’ accordingly. Additional ‘errno’ values defined for
|
||
‘mlock2’ are:
|
||
|
||
‘EINVAL’
|
||
The specified (non-zero) FLAGS argument is not supported by
|
||
this system.
|
||
|
||
You can lock _all_ a process’ memory with ‘mlockall’. You unlock
|
||
memory with ‘munlock’ or ‘munlockall’.
|
||
|
||
To avoid all page faults in a C program, you have to use ‘mlockall’,
|
||
because some of the memory a program uses is hidden from the C code,
|
||
e.g. the stack and automatic variables, and you wouldn’t know what
|
||
address to tell ‘mlock’.
|
||
|
||
-- Function: int munlock (const void *ADDR, size_t LEN)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘munlock’ unlocks a range of the calling process’ virtual pages.
|
||
|
||
‘munlock’ is the inverse of ‘mlock’ and functions completely
|
||
analogously to ‘mlock’, except that there is no ‘EPERM’ failure.
|
||
|
||
-- Function: int mlockall (int FLAGS)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘mlockall’ locks all the pages in a process’ virtual memory address
|
||
space, and/or any that are added to it in the future. This
|
||
includes the pages of the code, data and stack segment, as well as
|
||
shared libraries, user space kernel data, shared memory, and memory
|
||
mapped files.
|
||
|
||
FLAGS is a string of single bit flags represented by the following
|
||
macros. They tell ‘mlockall’ which of its functions you want. All
|
||
other bits must be zero.
|
||
|
||
‘MCL_CURRENT’
|
||
Lock all pages which currently exist in the calling process’
|
||
virtual address space.
|
||
|
||
‘MCL_FUTURE’
|
||
Set a mode such that any pages added to the process’ virtual
|
||
address space in the future will be locked from birth. This
|
||
mode does not affect future address spaces owned by the same
|
||
process so exec, which replaces a process’ address space,
|
||
wipes out ‘MCL_FUTURE’. *Note Executing a File::.
|
||
|
||
When the function returns successfully, and you specified
|
||
‘MCL_CURRENT’, all of the process’ pages are backed by (connected
|
||
to) real frames (they are resident) and are marked to stay that
|
||
way. This means the function may cause page-ins and have to wait
|
||
for them.
|
||
|
||
When the process is in ‘MCL_FUTURE’ mode because it successfully
|
||
executed this function and specified ‘MCL_CURRENT’, any system call
|
||
by the process that requires space be added to its virtual address
|
||
space fails with ‘errno’ = ‘ENOMEM’ if locking the additional space
|
||
would cause the process to exceed its locked page limit. In the
|
||
case that the address space addition that can’t be accommodated is
|
||
stack expansion, the stack expansion fails and the kernel sends a
|
||
‘SIGSEGV’ signal to the process.
|
||
|
||
When the function fails, it does not affect the lock status of any
|
||
pages or the future locking mode.
|
||
|
||
The return value is zero if the function succeeds. Otherwise, it
|
||
is ‘-1’ and ‘errno’ is set accordingly. ‘errno’ values specific to
|
||
this function are:
|
||
|
||
‘ENOMEM’
|
||
• At least some of the specified address range does not
|
||
exist in the calling process’ virtual address space.
|
||
• The locking would cause the process to exceed its locked
|
||
page limit.
|
||
|
||
‘EPERM’
|
||
The calling process is not superuser.
|
||
|
||
‘EINVAL’
|
||
Undefined bits in FLAGS are not zero.
|
||
|
||
‘ENOSYS’
|
||
The kernel does not provide ‘mlockall’ capability.
|
||
|
||
You can lock just specific pages with ‘mlock’. You unlock pages
|
||
with ‘munlockall’ and ‘munlock’.
|
||
|
||
-- Function: int munlockall (void)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘munlockall’ unlocks every page in the calling process’ virtual
|
||
address space and turns off ‘MCL_FUTURE’ future locking mode.
|
||
|
||
The return value is zero if the function succeeds. Otherwise, it
|
||
is ‘-1’ and ‘errno’ is set accordingly. The only way this function
|
||
can fail is for generic reasons that all functions and system calls
|
||
can fail, so there are no specific ‘errno’ values.
|
||
|
||
|
||
File: libc.info, Node: Character Handling, Next: String and Array Utilities, Prev: Memory, Up: Top
|
||
|
||
4 Character Handling
|
||
********************
|
||
|
||
Programs that work with characters and strings often need to classify a
|
||
character—is it alphabetic, is it a digit, is it whitespace, and so
|
||
on—and perform case conversion operations on characters. The functions
|
||
in the header file ‘ctype.h’ are provided for this purpose.
|
||
|
||
Since the choice of locale and character set can alter the
|
||
classifications of particular character codes, all of these functions
|
||
are affected by the current locale. (More precisely, they are affected
|
||
by the locale currently selected for character classification—the
|
||
‘LC_CTYPE’ category; see *note Locale Categories::.)
|
||
|
||
The ISO C standard specifies two different sets of functions. The
|
||
one set works on ‘char’ type characters, the other one on ‘wchar_t’ wide
|
||
characters (*note Extended Char Intro::).
|
||
|
||
* Menu:
|
||
|
||
* Classification of Characters:: Testing whether characters are
|
||
letters, digits, punctuation, etc.
|
||
|
||
* Case Conversion:: Case mapping, and the like.
|
||
* Classification of Wide Characters:: Character class determination for
|
||
wide characters.
|
||
* Using Wide Char Classes:: Notes on using the wide character
|
||
classes.
|
||
* Wide Character Case Conversion:: Mapping of wide characters.
|
||
|
||
|
||
File: libc.info, Node: Classification of Characters, Next: Case Conversion, Up: Character Handling
|
||
|
||
4.1 Classification of Characters
|
||
================================
|
||
|
||
This section explains the library functions for classifying characters.
|
||
For example, ‘isalpha’ is the function to test for an alphabetic
|
||
character. It takes one argument, the character to test, and returns a
|
||
nonzero integer if the character is alphabetic, and zero otherwise. You
|
||
would use it like this:
|
||
|
||
if (isalpha (c))
|
||
printf ("The character `%c' is alphabetic.\n", c);
|
||
|
||
Each of the functions in this section tests for membership in a
|
||
particular class of characters; each has a name starting with ‘is’.
|
||
Each of them takes one argument, which is a character to test, and
|
||
returns an ‘int’ which is treated as a boolean value. The character
|
||
argument is passed as an ‘int’, and it may be the constant value ‘EOF’
|
||
instead of a real character.
|
||
|
||
The attributes of any given character can vary between locales.
|
||
*Note Locales::, for more information on locales.
|
||
|
||
These functions are declared in the header file ‘ctype.h’.
|
||
|
||
-- Function: int islower (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Returns true if C is a lower-case letter. The letter need not be
|
||
from the Latin alphabet, any alphabet representable is valid.
|
||
|
||
-- Function: int isupper (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Returns true if C is an upper-case letter. The letter need not be
|
||
from the Latin alphabet, any alphabet representable is valid.
|
||
|
||
-- Function: int isalpha (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Returns true if C is an alphabetic character (a letter). If
|
||
‘islower’ or ‘isupper’ is true of a character, then ‘isalpha’ is
|
||
also true.
|
||
|
||
In some locales, there may be additional characters for which
|
||
‘isalpha’ is true—letters which are neither upper case nor lower
|
||
case. But in the standard ‘"C"’ locale, there are no such
|
||
additional characters.
|
||
|
||
-- Function: int isdigit (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Returns true if C is a decimal digit (‘0’ through ‘9’).
|
||
|
||
-- Function: int isalnum (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Returns true if C is an alphanumeric character (a letter or
|
||
number); in other words, if either ‘isalpha’ or ‘isdigit’ is true
|
||
of a character, then ‘isalnum’ is also true.
|
||
|
||
-- Function: int isxdigit (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Returns true if C is a hexadecimal digit. Hexadecimal digits
|
||
include the normal decimal digits ‘0’ through ‘9’ and the letters
|
||
‘A’ through ‘F’ and ‘a’ through ‘f’.
|
||
|
||
-- Function: int ispunct (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Returns true if C is a punctuation character. This means any
|
||
printing character that is not alphanumeric or a space character.
|
||
|
||
-- Function: int isspace (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Returns true if C is a “whitespace” character. In the standard
|
||
‘"C"’ locale, ‘isspace’ returns true for only the standard
|
||
whitespace characters:
|
||
|
||
‘' '’
|
||
space
|
||
|
||
‘'\f'’
|
||
formfeed
|
||
|
||
‘'\n'’
|
||
newline
|
||
|
||
‘'\r'’
|
||
carriage return
|
||
|
||
‘'\t'’
|
||
horizontal tab
|
||
|
||
‘'\v'’
|
||
vertical tab
|
||
|
||
-- Function: int isblank (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Returns true if C is a blank character; that is, a space or a tab.
|
||
This function was originally a GNU extension, but was added in
|
||
ISO C99.
|
||
|
||
-- Function: int isgraph (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Returns true if C is a graphic character; that is, a character that
|
||
has a glyph associated with it. The whitespace characters are not
|
||
considered graphic.
|
||
|
||
-- Function: int isprint (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Returns true if C is a printing character. Printing characters
|
||
include all the graphic characters, plus the space (‘ ’) character.
|
||
|
||
-- Function: int iscntrl (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Returns true if C is a control character (that is, a character that
|
||
is not a printing character).
|
||
|
||
-- Function: int isascii (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Returns true if C is a 7-bit ‘unsigned char’ value that fits into
|
||
the US/UK ASCII character set. This function is a BSD extension
|
||
and is also an SVID extension.
|
||
|
||
|
||
File: libc.info, Node: Case Conversion, Next: Classification of Wide Characters, Prev: Classification of Characters, Up: Character Handling
|
||
|
||
4.2 Case Conversion
|
||
===================
|
||
|
||
This section explains the library functions for performing conversions
|
||
such as case mappings on characters. For example, ‘toupper’ converts
|
||
any character to upper case if possible. If the character can’t be
|
||
converted, ‘toupper’ returns it unchanged.
|
||
|
||
These functions take one argument of type ‘int’, which is the
|
||
character to convert, and return the converted character as an ‘int’.
|
||
If the conversion is not applicable to the argument given, the argument
|
||
is returned unchanged.
|
||
|
||
*Compatibility Note:* In pre-ISO C dialects, instead of returning the
|
||
argument unchanged, these functions may fail when the argument is not
|
||
suitable for the conversion. Thus for portability, you may need to
|
||
write ‘islower(c) ? toupper(c) : c’ rather than just ‘toupper(c)’.
|
||
|
||
These functions are declared in the header file ‘ctype.h’.
|
||
|
||
-- Function: int tolower (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
If C is an upper-case letter, ‘tolower’ returns the corresponding
|
||
lower-case letter. If C is not an upper-case letter, C is returned
|
||
unchanged.
|
||
|
||
-- Function: int toupper (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
If C is a lower-case letter, ‘toupper’ returns the corresponding
|
||
upper-case letter. Otherwise C is returned unchanged.
|
||
|
||
-- Function: int toascii (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function converts C to a 7-bit ‘unsigned char’ value that fits
|
||
into the US/UK ASCII character set, by clearing the high-order
|
||
bits. This function is a BSD extension and is also an SVID
|
||
extension.
|
||
|
||
-- Function: int _tolower (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This is identical to ‘tolower’, and is provided for compatibility
|
||
with the SVID. *Note SVID::.
|
||
|
||
-- Function: int _toupper (int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This is identical to ‘toupper’, and is provided for compatibility
|
||
with the SVID.
|
||
|
||
|
||
File: libc.info, Node: Classification of Wide Characters, Next: Using Wide Char Classes, Prev: Case Conversion, Up: Character Handling
|
||
|
||
4.3 Character class determination for wide characters
|
||
=====================================================
|
||
|
||
Amendment 1 to ISO C90 defines functions to classify wide characters.
|
||
Although the original ISO C90 standard already defined the type
|
||
‘wchar_t’, no functions operating on them were defined.
|
||
|
||
The general design of the classification functions for wide
|
||
characters is more general. It allows extensions to the set of
|
||
available classifications, beyond those which are always available. The
|
||
POSIX standard specifies how extensions can be made, and this is already
|
||
implemented in the GNU C Library implementation of the ‘localedef’
|
||
program.
|
||
|
||
The character class functions are normally implemented with bitsets,
|
||
with a bitset per character. For a given character, the appropriate
|
||
bitset is read from a table and a test is performed as to whether a
|
||
certain bit is set. Which bit is tested for is determined by the class.
|
||
|
||
For the wide character classification functions this is made visible.
|
||
There is a type classification type defined, a function to retrieve this
|
||
value for a given class, and a function to test whether a given
|
||
character is in this class, using the classification value. On top of
|
||
this the normal character classification functions as used for ‘char’
|
||
objects can be defined.
|
||
|
||
-- Data type: wctype_t
|
||
|
||
The ‘wctype_t’ can hold a value which represents a character class.
|
||
The only defined way to generate such a value is by using the
|
||
‘wctype’ function.
|
||
|
||
This type is defined in ‘wctype.h’.
|
||
|
||
-- Function: wctype_t wctype (const char *PROPERTY)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
‘wctype’ returns a value representing a class of wide characters
|
||
which is identified by the string PROPERTY. Besides some standard
|
||
properties each locale can define its own ones. In case no
|
||
property with the given name is known for the current locale
|
||
selected for the ‘LC_CTYPE’ category, the function returns zero.
|
||
|
||
The properties known in every locale are:
|
||
|
||
‘"alnum"’ ‘"alpha"’ ‘"cntrl"’ ‘"digit"’
|
||
‘"graph"’ ‘"lower"’ ‘"print"’ ‘"punct"’
|
||
‘"space"’ ‘"upper"’ ‘"xdigit"’
|
||
|
||
This function is declared in ‘wctype.h’.
|
||
|
||
To test the membership of a character to one of the non-standard
|
||
classes the ISO C standard defines a completely new function.
|
||
|
||
-- Function: int iswctype (wint_t WC, wctype_t DESC)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function returns a nonzero value if WC is in the character
|
||
class specified by DESC. DESC must previously be returned by a
|
||
successful call to ‘wctype’.
|
||
|
||
This function is declared in ‘wctype.h’.
|
||
|
||
To make it easier to use the commonly-used classification functions,
|
||
they are defined in the C library. There is no need to use ‘wctype’ if
|
||
the property string is one of the known character classes. In some
|
||
situations it is desirable to construct the property strings, and then
|
||
it is important that ‘wctype’ can also handle the standard classes.
|
||
|
||
-- Function: int iswalnum (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
This function returns a nonzero value if WC is an alphanumeric
|
||
character (a letter or number); in other words, if either
|
||
‘iswalpha’ or ‘iswdigit’ is true of a character, then ‘iswalnum’ is
|
||
also true.
|
||
|
||
This function can be implemented using
|
||
|
||
iswctype (wc, wctype ("alnum"))
|
||
|
||
It is declared in ‘wctype.h’.
|
||
|
||
-- Function: int iswalpha (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
Returns true if WC is an alphabetic character (a letter). If
|
||
‘iswlower’ or ‘iswupper’ is true of a character, then ‘iswalpha’ is
|
||
also true.
|
||
|
||
In some locales, there may be additional characters for which
|
||
‘iswalpha’ is true—letters which are neither upper case nor lower
|
||
case. But in the standard ‘"C"’ locale, there are no such
|
||
additional characters.
|
||
|
||
This function can be implemented using
|
||
|
||
iswctype (wc, wctype ("alpha"))
|
||
|
||
It is declared in ‘wctype.h’.
|
||
|
||
-- Function: int iswcntrl (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
Returns true if WC is a control character (that is, a character
|
||
that is not a printing character).
|
||
|
||
This function can be implemented using
|
||
|
||
iswctype (wc, wctype ("cntrl"))
|
||
|
||
It is declared in ‘wctype.h’.
|
||
|
||
-- Function: int iswdigit (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
Returns true if WC is a digit (e.g., ‘0’ through ‘9’). Please note
|
||
that this function does not only return a nonzero value for
|
||
_decimal_ digits, but for all kinds of digits. A consequence is
|
||
that code like the following will *not* work unconditionally for
|
||
wide characters:
|
||
|
||
n = 0;
|
||
while (iswdigit (*wc))
|
||
{
|
||
n *= 10;
|
||
n += *wc++ - L'0';
|
||
}
|
||
|
||
This function can be implemented using
|
||
|
||
iswctype (wc, wctype ("digit"))
|
||
|
||
It is declared in ‘wctype.h’.
|
||
|
||
-- Function: int iswgraph (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
Returns true if WC is a graphic character; that is, a character
|
||
that has a glyph associated with it. The whitespace characters are
|
||
not considered graphic.
|
||
|
||
This function can be implemented using
|
||
|
||
iswctype (wc, wctype ("graph"))
|
||
|
||
It is declared in ‘wctype.h’.
|
||
|
||
-- Function: int iswlower (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
Returns true if WC is a lower-case letter. The letter need not be
|
||
from the Latin alphabet, any alphabet representable is valid.
|
||
|
||
This function can be implemented using
|
||
|
||
iswctype (wc, wctype ("lower"))
|
||
|
||
It is declared in ‘wctype.h’.
|
||
|
||
-- Function: int iswprint (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
Returns true if WC is a printing character. Printing characters
|
||
include all the graphic characters, plus the space (‘ ’) character.
|
||
|
||
This function can be implemented using
|
||
|
||
iswctype (wc, wctype ("print"))
|
||
|
||
It is declared in ‘wctype.h’.
|
||
|
||
-- Function: int iswpunct (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
Returns true if WC is a punctuation character. This means any
|
||
printing character that is not alphanumeric or a space character.
|
||
|
||
This function can be implemented using
|
||
|
||
iswctype (wc, wctype ("punct"))
|
||
|
||
It is declared in ‘wctype.h’.
|
||
|
||
-- Function: int iswspace (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
Returns true if WC is a “whitespace” character. In the standard
|
||
‘"C"’ locale, ‘iswspace’ returns true for only the standard
|
||
whitespace characters:
|
||
|
||
‘L' '’
|
||
space
|
||
|
||
‘L'\f'’
|
||
formfeed
|
||
|
||
‘L'\n'’
|
||
newline
|
||
|
||
‘L'\r'’
|
||
carriage return
|
||
|
||
‘L'\t'’
|
||
horizontal tab
|
||
|
||
‘L'\v'’
|
||
vertical tab
|
||
|
||
This function can be implemented using
|
||
|
||
iswctype (wc, wctype ("space"))
|
||
|
||
It is declared in ‘wctype.h’.
|
||
|
||
-- Function: int iswupper (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
Returns true if WC is an upper-case letter. The letter need not be
|
||
from the Latin alphabet, any alphabet representable is valid.
|
||
|
||
This function can be implemented using
|
||
|
||
iswctype (wc, wctype ("upper"))
|
||
|
||
It is declared in ‘wctype.h’.
|
||
|
||
-- Function: int iswxdigit (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
Returns true if WC is a hexadecimal digit. Hexadecimal digits
|
||
include the normal decimal digits ‘0’ through ‘9’ and the letters
|
||
‘A’ through ‘F’ and ‘a’ through ‘f’.
|
||
|
||
This function can be implemented using
|
||
|
||
iswctype (wc, wctype ("xdigit"))
|
||
|
||
It is declared in ‘wctype.h’.
|
||
|
||
The GNU C Library also provides a function which is not defined in
|
||
the ISO C standard but which is available as a version for single byte
|
||
characters as well.
|
||
|
||
-- Function: int iswblank (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
Returns true if WC is a blank character; that is, a space or a tab.
|
||
This function was originally a GNU extension, but was added in
|
||
ISO C99. It is declared in ‘wchar.h’.
|
||
|
||
|
||
File: libc.info, Node: Using Wide Char Classes, Next: Wide Character Case Conversion, Prev: Classification of Wide Characters, Up: Character Handling
|
||
|
||
4.4 Notes on using the wide character classes
|
||
=============================================
|
||
|
||
The first note is probably not astonishing but still occasionally a
|
||
cause of problems. The ‘iswXXX’ functions can be implemented using
|
||
macros and in fact, the GNU C Library does this. They are still
|
||
available as real functions but when the ‘wctype.h’ header is included
|
||
the macros will be used. This is the same as the ‘char’ type versions
|
||
of these functions.
|
||
|
||
The second note covers something new. It can be best illustrated by
|
||
a (real-world) example. The first piece of code is an excerpt from the
|
||
original code. It is truncated a bit but the intention should be clear.
|
||
|
||
int
|
||
is_in_class (int c, const char *class)
|
||
{
|
||
if (strcmp (class, "alnum") == 0)
|
||
return isalnum (c);
|
||
if (strcmp (class, "alpha") == 0)
|
||
return isalpha (c);
|
||
if (strcmp (class, "cntrl") == 0)
|
||
return iscntrl (c);
|
||
...
|
||
return 0;
|
||
}
|
||
|
||
Now, with the ‘wctype’ and ‘iswctype’ you can avoid the ‘if’
|
||
cascades, but rewriting the code as follows is wrong:
|
||
|
||
int
|
||
is_in_class (int c, const char *class)
|
||
{
|
||
wctype_t desc = wctype (class);
|
||
return desc ? iswctype ((wint_t) c, desc) : 0;
|
||
}
|
||
|
||
The problem is that it is not guaranteed that the wide character
|
||
representation of a single-byte character can be found using casting.
|
||
In fact, usually this fails miserably. The correct solution to this
|
||
problem is to write the code as follows:
|
||
|
||
int
|
||
is_in_class (int c, const char *class)
|
||
{
|
||
wctype_t desc = wctype (class);
|
||
return desc ? iswctype (btowc (c), desc) : 0;
|
||
}
|
||
|
||
*Note Converting a Character::, for more information on ‘btowc’.
|
||
Note that this change probably does not improve the performance of the
|
||
program a lot since the ‘wctype’ function still has to make the string
|
||
comparisons. It gets really interesting if the ‘is_in_class’ function
|
||
is called more than once for the same class name. In this case the
|
||
variable DESC could be computed once and reused for all the calls.
|
||
Therefore the above form of the function is probably not the final one.
|
||
|
||
|
||
File: libc.info, Node: Wide Character Case Conversion, Prev: Using Wide Char Classes, Up: Character Handling
|
||
|
||
4.5 Mapping of wide characters.
|
||
===============================
|
||
|
||
The classification functions are also generalized by the ISO C standard.
|
||
Instead of just allowing the two standard mappings, a locale can contain
|
||
others. Again, the ‘localedef’ program already supports generating such
|
||
locale data files.
|
||
|
||
-- Data Type: wctrans_t
|
||
|
||
This data type is defined as a scalar type which can hold a value
|
||
representing the locale-dependent character mapping. There is no
|
||
way to construct such a value apart from using the return value of
|
||
the ‘wctrans’ function.
|
||
|
||
This type is defined in ‘wctype.h’.
|
||
|
||
-- Function: wctrans_t wctrans (const char *PROPERTY)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
The ‘wctrans’ function has to be used to find out whether a named
|
||
mapping is defined in the current locale selected for the
|
||
‘LC_CTYPE’ category. If the returned value is non-zero, you can
|
||
use it afterwards in calls to ‘towctrans’. If the return value is
|
||
zero no such mapping is known in the current locale.
|
||
|
||
Beside locale-specific mappings there are two mappings which are
|
||
guaranteed to be available in every locale:
|
||
|
||
‘"tolower"’ ‘"toupper"’
|
||
|
||
These functions are declared in ‘wctype.h’.
|
||
|
||
-- Function: wint_t towctrans (wint_t WC, wctrans_t DESC)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘towctrans’ maps the input character WC according to the rules of
|
||
the mapping for which DESC is a descriptor, and returns the value
|
||
it finds. DESC must be obtained by a successful call to ‘wctrans’.
|
||
|
||
This function is declared in ‘wctype.h’.
|
||
|
||
For the generally available mappings, the ISO C standard defines
|
||
convenient shortcuts so that it is not necessary to call ‘wctrans’ for
|
||
them.
|
||
|
||
-- Function: wint_t towlower (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
If WC is an upper-case letter, ‘towlower’ returns the corresponding
|
||
lower-case letter. If WC is not an upper-case letter, WC is
|
||
returned unchanged.
|
||
|
||
‘towlower’ can be implemented using
|
||
|
||
towctrans (wc, wctrans ("tolower"))
|
||
|
||
This function is declared in ‘wctype.h’.
|
||
|
||
-- Function: wint_t towupper (wint_t WC)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
If WC is a lower-case letter, ‘towupper’ returns the corresponding
|
||
upper-case letter. Otherwise WC is returned unchanged.
|
||
|
||
‘towupper’ can be implemented using
|
||
|
||
towctrans (wc, wctrans ("toupper"))
|
||
|
||
This function is declared in ‘wctype.h’.
|
||
|
||
The same warnings given in the last section for the use of the wide
|
||
character classification functions apply here. It is not possible to
|
||
simply cast a ‘char’ type value to a ‘wint_t’ and use it as an argument
|
||
to ‘towctrans’ calls.
|
||
|
||
|
||
File: libc.info, Node: String and Array Utilities, Next: Character Set Handling, Prev: Character Handling, Up: Top
|
||
|
||
5 String and Array Utilities
|
||
****************************
|
||
|
||
Operations on strings (null-terminated byte sequences) are an important
|
||
part of many programs. The GNU C Library provides an extensive set of
|
||
string utility functions, including functions for copying,
|
||
concatenating, comparing, and searching strings. Many of these
|
||
functions can also operate on arbitrary regions of storage; for example,
|
||
the ‘memcpy’ function can be used to copy the contents of any kind of
|
||
array.
|
||
|
||
It’s fairly common for beginning C programmers to “reinvent the
|
||
wheel” by duplicating this functionality in their own code, but it pays
|
||
to become familiar with the library functions and to make use of them,
|
||
since this offers benefits in maintenance, efficiency, and portability.
|
||
|
||
For instance, you could easily compare one string to another in two
|
||
lines of C code, but if you use the built-in ‘strcmp’ function, you’re
|
||
less likely to make a mistake. And, since these library functions are
|
||
typically highly optimized, your program may run faster too.
|
||
|
||
* Menu:
|
||
|
||
* Representation of Strings:: Introduction to basic concepts.
|
||
* String/Array Conventions:: Whether to use a string function or an
|
||
arbitrary array function.
|
||
* String Length:: Determining the length of a string.
|
||
* Copying Strings and Arrays:: Functions to copy strings and arrays.
|
||
* Concatenating Strings:: Functions to concatenate strings while copying.
|
||
* Truncating Strings:: Functions to truncate strings while copying.
|
||
* String/Array Comparison:: Functions for byte-wise and character-wise
|
||
comparison.
|
||
* Collation Functions:: Functions for collating strings.
|
||
* Search Functions:: Searching for a specific element or substring.
|
||
* Finding Tokens in a String:: Splitting a string into tokens by looking
|
||
for delimiters.
|
||
* Erasing Sensitive Data:: Clearing memory which contains sensitive
|
||
data, after it’s no longer needed.
|
||
* Shuffling Bytes:: Or how to flash-cook a string.
|
||
* Obfuscating Data:: Reversibly obscuring data from casual view.
|
||
* Encode Binary Data:: Encoding and Decoding of Binary Data.
|
||
* Argz and Envz Vectors:: Null-separated string vectors.
|
||
|
||
|
||
File: libc.info, Node: Representation of Strings, Next: String/Array Conventions, Up: String and Array Utilities
|
||
|
||
5.1 Representation of Strings
|
||
=============================
|
||
|
||
This section is a quick summary of string concepts for beginning C
|
||
programmers. It describes how strings are represented in C and some
|
||
common pitfalls. If you are already familiar with this material, you
|
||
can skip this section.
|
||
|
||
A “string” is a null-terminated array of bytes of type ‘char’,
|
||
including the terminating null byte. String-valued variables are
|
||
usually declared to be pointers of type ‘char *’. Such variables do not
|
||
include space for the text of a string; that has to be stored somewhere
|
||
else—in an array variable, a string constant, or dynamically allocated
|
||
memory (*note Memory Allocation::). It’s up to you to store the address
|
||
of the chosen memory space into the pointer variable. Alternatively you
|
||
can store a “null pointer” in the pointer variable. The null pointer
|
||
does not point anywhere, so attempting to reference the string it points
|
||
to gets an error.
|
||
|
||
A “multibyte character” is a sequence of one or more bytes that
|
||
represents a single character using the locale’s encoding scheme; a null
|
||
byte always represents the null character. A “multibyte string” is a
|
||
string that consists entirely of multibyte characters. In contrast, a
|
||
“wide string” is a null-terminated sequence of ‘wchar_t’ objects. A
|
||
wide-string variable is usually declared to be a pointer of type
|
||
‘wchar_t *’, by analogy with string variables and ‘char *’. *Note
|
||
Extended Char Intro::.
|
||
|
||
By convention, the “null byte”, ‘'\0'’, marks the end of a string and
|
||
the “null wide character”, ‘L'\0'’, marks the end of a wide string. For
|
||
example, in testing to see whether the ‘char *’ variable P points to a
|
||
null byte marking the end of a string, you can write ‘!*P’ or ‘*P ==
|
||
'\0'’.
|
||
|
||
A null byte is quite different conceptually from a null pointer,
|
||
although both are represented by the integer constant ‘0’.
|
||
|
||
A “string literal” appears in C program source as a multibyte string
|
||
between double-quote characters (‘"’). If the initial double-quote
|
||
character is immediately preceded by a capital ‘L’ (ell) character (as
|
||
in ‘L"foo"’), it is a wide string literal. String literals can also
|
||
contribute to “string concatenation”: ‘"a" "b"’ is the same as ‘"ab"’.
|
||
For wide strings one can use either ‘L"a" L"b"’ or ‘L"a" "b"’.
|
||
Modification of string literals is not allowed by the GNU C compiler,
|
||
because literals are placed in read-only storage.
|
||
|
||
Arrays that are declared ‘const’ cannot be modified either. It’s
|
||
generally good style to declare non-modifiable string pointers to be of
|
||
type ‘const char *’, since this often allows the C compiler to detect
|
||
accidental modifications as well as providing some amount of
|
||
documentation about what your program intends to do with the string.
|
||
|
||
The amount of memory allocated for a byte array may extend past the
|
||
null byte that marks the end of the string that the array contains. In
|
||
this document, the term “allocated size” is always used to refer to the
|
||
total amount of memory allocated for an array, while the term “length”
|
||
refers to the number of bytes up to (but not including) the terminating
|
||
null byte. Wide strings are similar, except their sizes and lengths
|
||
count wide characters, not bytes.
|
||
|
||
A notorious source of program bugs is trying to put more bytes into a
|
||
string than fit in its allocated size. When writing code that extends
|
||
strings or moves bytes into a pre-allocated array, you should be very
|
||
careful to keep track of the length of the text and make explicit checks
|
||
for overflowing the array. Many of the library functions _do not_ do
|
||
this for you! Remember also that you need to allocate an extra byte to
|
||
hold the null byte that marks the end of the string.
|
||
|
||
Originally strings were sequences of bytes where each byte
|
||
represented a single character. This is still true today if the strings
|
||
are encoded using a single-byte character encoding. Things are
|
||
different if the strings are encoded using a multibyte encoding (for
|
||
more information on encodings see *note Extended Char Intro::). There
|
||
is no difference in the programming interface for these two kind of
|
||
strings; the programmer has to be aware of this and interpret the byte
|
||
sequences accordingly.
|
||
|
||
But since there is no separate interface taking care of these
|
||
differences the byte-based string functions are sometimes hard to use.
|
||
Since the count parameters of these functions specify bytes a call to
|
||
‘memcpy’ could cut a multibyte character in the middle and put an
|
||
incomplete (and therefore unusable) byte sequence in the target buffer.
|
||
|
||
To avoid these problems later versions of the ISO C standard
|
||
introduce a second set of functions which are operating on “wide
|
||
characters” (*note Extended Char Intro::). These functions don’t have
|
||
the problems the single-byte versions have since every wide character is
|
||
a legal, interpretable value. This does not mean that cutting wide
|
||
strings at arbitrary points is without problems. It normally is for
|
||
alphabet-based languages (except for non-normalized text) but languages
|
||
based on syllables still have the problem that more than one wide
|
||
character is necessary to complete a logical unit. This is a higher
|
||
level problem which the C library functions are not designed to solve.
|
||
But it is at least good that no invalid byte sequences can be created.
|
||
Also, the higher level functions can also much more easily operate on
|
||
wide characters than on multibyte characters so that a common strategy
|
||
is to use wide characters internally whenever text is more than simply
|
||
copied.
|
||
|
||
The remaining of this chapter will discuss the functions for handling
|
||
wide strings in parallel with the discussion of strings since there is
|
||
almost always an exact equivalent available.
|
||
|
||
|
||
File: libc.info, Node: String/Array Conventions, Next: String Length, Prev: Representation of Strings, Up: String and Array Utilities
|
||
|
||
5.2 String and Array Conventions
|
||
================================
|
||
|
||
This chapter describes both functions that work on arbitrary arrays or
|
||
blocks of memory, and functions that are specific to strings and wide
|
||
strings.
|
||
|
||
Functions that operate on arbitrary blocks of memory have names
|
||
beginning with ‘mem’ and ‘wmem’ (such as ‘memcpy’ and ‘wmemcpy’) and
|
||
invariably take an argument which specifies the size (in bytes and wide
|
||
characters respectively) of the block of memory to operate on. The
|
||
array arguments and return values for these functions have type ‘void *’
|
||
or ‘wchar_t’. As a matter of style, the elements of the arrays used
|
||
with the ‘mem’ functions are referred to as “bytes”. You can pass any
|
||
kind of pointer to these functions, and the ‘sizeof’ operator is useful
|
||
in computing the value for the size argument. Parameters to the ‘wmem’
|
||
functions must be of type ‘wchar_t *’. These functions are not really
|
||
usable with anything but arrays of this type.
|
||
|
||
In contrast, functions that operate specifically on strings and wide
|
||
strings have names beginning with ‘str’ and ‘wcs’ respectively (such as
|
||
‘strcpy’ and ‘wcscpy’) and look for a terminating null byte or null wide
|
||
character instead of requiring an explicit size argument to be passed.
|
||
(Some of these functions accept a specified maximum length, but they
|
||
also check for premature termination.) The array arguments and return
|
||
values for these functions have type ‘char *’ and ‘wchar_t *’
|
||
respectively, and the array elements are referred to as “bytes” and
|
||
“wide characters”.
|
||
|
||
In many cases, there are both ‘mem’ and ‘str’/‘wcs’ versions of a
|
||
function. The one that is more appropriate to use depends on the exact
|
||
situation. When your program is manipulating arbitrary arrays or blocks
|
||
of storage, then you should always use the ‘mem’ functions. On the
|
||
other hand, when you are manipulating strings it is usually more
|
||
convenient to use the ‘str’/‘wcs’ functions, unless you already know the
|
||
length of the string in advance. The ‘wmem’ functions should be used
|
||
for wide character arrays with known size.
|
||
|
||
Some of the memory and string functions take single characters as
|
||
arguments. Since a value of type ‘char’ is automatically promoted into
|
||
a value of type ‘int’ when used as a parameter, the functions are
|
||
declared with ‘int’ as the type of the parameter in question. In case
|
||
of the wide character functions the situation is similar: the parameter
|
||
type for a single wide character is ‘wint_t’ and not ‘wchar_t’. This
|
||
would for many implementations not be necessary since ‘wchar_t’ is large
|
||
enough to not be automatically promoted, but since the ISO C standard
|
||
does not require such a choice of types the ‘wint_t’ type is used.
|
||
|
||
|
||
File: libc.info, Node: String Length, Next: Copying Strings and Arrays, Prev: String/Array Conventions, Up: String and Array Utilities
|
||
|
||
5.3 String Length
|
||
=================
|
||
|
||
You can get the length of a string using the ‘strlen’ function. This
|
||
function is declared in the header file ‘string.h’.
|
||
|
||
-- Function: size_t strlen (const char *S)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘strlen’ function returns the length of the string S in bytes.
|
||
(In other words, it returns the offset of the terminating null byte
|
||
within the array.)
|
||
|
||
For example,
|
||
strlen ("hello, world")
|
||
⇒ 12
|
||
|
||
When applied to an array, the ‘strlen’ function returns the length
|
||
of the string stored there, not its allocated size. You can get
|
||
the allocated size of the array that holds a string using the
|
||
‘sizeof’ operator:
|
||
|
||
char string[32] = "hello, world";
|
||
sizeof (string)
|
||
⇒ 32
|
||
strlen (string)
|
||
⇒ 12
|
||
|
||
But beware, this will not work unless STRING is the array itself,
|
||
not a pointer to it. For example:
|
||
|
||
char string[32] = "hello, world";
|
||
char *ptr = string;
|
||
sizeof (string)
|
||
⇒ 32
|
||
sizeof (ptr)
|
||
⇒ 4 /* (on a machine with 4 byte pointers) */
|
||
|
||
This is an easy mistake to make when you are working with functions
|
||
that take string arguments; those arguments are always pointers,
|
||
not arrays.
|
||
|
||
It must also be noted that for multibyte encoded strings the return
|
||
value does not have to correspond to the number of characters in
|
||
the string. To get this value the string can be converted to wide
|
||
characters and ‘wcslen’ can be used or something like the following
|
||
code can be used:
|
||
|
||
/* The input is in ‘string’.
|
||
The length is expected in ‘n’. */
|
||
{
|
||
mbstate_t t;
|
||
char *scopy = string;
|
||
/* In initial state. */
|
||
memset (&t, '\0', sizeof (t));
|
||
/* Determine number of characters. */
|
||
n = mbsrtowcs (NULL, &scopy, strlen (scopy), &t);
|
||
}
|
||
|
||
This is cumbersome to do so if the number of characters (as opposed
|
||
to bytes) is needed often it is better to work with wide
|
||
characters.
|
||
|
||
The wide character equivalent is declared in ‘wchar.h’.
|
||
|
||
-- Function: size_t wcslen (const wchar_t *WS)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘wcslen’ function is the wide character equivalent to ‘strlen’.
|
||
The return value is the number of wide characters in the wide
|
||
string pointed to by WS (this is also the offset of the terminating
|
||
null wide character of WS).
|
||
|
||
Since there are no multi wide character sequences making up one
|
||
wide character the return value is not only the offset in the
|
||
array, it is also the number of wide characters.
|
||
|
||
This function was introduced in Amendment 1 to ISO C90.
|
||
|
||
-- Function: size_t strnlen (const char *S, size_t MAXLEN)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
If the array S of size MAXLEN contains a null byte, the ‘strnlen’
|
||
function returns the length of the string S in bytes. Otherwise it
|
||
returns MAXLEN. Therefore this function is equivalent to ‘(strlen
|
||
(S) < MAXLEN ? strlen (S) : MAXLEN)’ but it is more efficient and
|
||
works even if S is not null-terminated so long as MAXLEN does not
|
||
exceed the size of S’s array.
|
||
|
||
char string[32] = "hello, world";
|
||
strnlen (string, 32)
|
||
⇒ 12
|
||
strnlen (string, 5)
|
||
⇒ 5
|
||
|
||
This function is a GNU extension and is declared in ‘string.h’.
|
||
|
||
-- Function: size_t wcsnlen (const wchar_t *WS, size_t MAXLEN)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘wcsnlen’ is the wide character equivalent to ‘strnlen’. The
|
||
MAXLEN parameter specifies the maximum number of wide characters.
|
||
|
||
This function is a GNU extension and is declared in ‘wchar.h’.
|
||
|
||
|
||
File: libc.info, Node: Copying Strings and Arrays, Next: Concatenating Strings, Prev: String Length, Up: String and Array Utilities
|
||
|
||
5.4 Copying Strings and Arrays
|
||
==============================
|
||
|
||
You can use the functions described in this section to copy the contents
|
||
of strings, wide strings, and arrays. The ‘str’ and ‘mem’ functions are
|
||
declared in ‘string.h’ while the ‘w’ functions are declared in
|
||
‘wchar.h’.
|
||
|
||
A helpful way to remember the ordering of the arguments to the
|
||
functions in this section is that it corresponds to an assignment
|
||
expression, with the destination array specified to the left of the
|
||
source array. Most of these functions return the address of the
|
||
destination array; a few return the address of the destination’s
|
||
terminating null, or of just past the destination.
|
||
|
||
Most of these functions do not work properly if the source and
|
||
destination arrays overlap. For example, if the beginning of the
|
||
destination array overlaps the end of the source array, the original
|
||
contents of that part of the source array may get overwritten before it
|
||
is copied. Even worse, in the case of the string functions, the null
|
||
byte marking the end of the string may be lost, and the copy function
|
||
might get stuck in a loop trashing all the memory allocated to your
|
||
program.
|
||
|
||
All functions that have problems copying between overlapping arrays
|
||
are explicitly identified in this manual. In addition to functions in
|
||
this section, there are a few others like ‘sprintf’ (*note Formatted
|
||
Output Functions::) and ‘scanf’ (*note Formatted Input Functions::).
|
||
|
||
-- Function: void * memcpy (void *restrict TO, const void *restrict
|
||
FROM, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘memcpy’ function copies SIZE bytes from the object beginning
|
||
at FROM into the object beginning at TO. The behavior of this
|
||
function is undefined if the two arrays TO and FROM overlap; use
|
||
‘memmove’ instead if overlapping is possible.
|
||
|
||
The value returned by ‘memcpy’ is the value of TO.
|
||
|
||
Here is an example of how you might use ‘memcpy’ to copy the
|
||
contents of an array:
|
||
|
||
struct foo *oldarray, *newarray;
|
||
int arraysize;
|
||
...
|
||
memcpy (new, old, arraysize * sizeof (struct foo));
|
||
|
||
-- Function: wchar_t * wmemcpy (wchar_t *restrict WTO, const wchar_t
|
||
*restrict WFROM, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘wmemcpy’ function copies SIZE wide characters from the object
|
||
beginning at WFROM into the object beginning at WTO. The behavior
|
||
of this function is undefined if the two arrays WTO and WFROM
|
||
overlap; use ‘wmemmove’ instead if overlapping is possible.
|
||
|
||
The following is a possible implementation of ‘wmemcpy’ but there
|
||
are more optimizations possible.
|
||
|
||
wchar_t *
|
||
wmemcpy (wchar_t *restrict wto, const wchar_t *restrict wfrom,
|
||
size_t size)
|
||
{
|
||
return (wchar_t *) memcpy (wto, wfrom, size * sizeof (wchar_t));
|
||
}
|
||
|
||
The value returned by ‘wmemcpy’ is the value of WTO.
|
||
|
||
This function was introduced in Amendment 1 to ISO C90.
|
||
|
||
-- Function: void * mempcpy (void *restrict TO, const void *restrict
|
||
FROM, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘mempcpy’ function is nearly identical to the ‘memcpy’
|
||
function. It copies SIZE bytes from the object beginning at ‘from’
|
||
into the object pointed to by TO. But instead of returning the
|
||
value of TO it returns a pointer to the byte following the last
|
||
written byte in the object beginning at TO. I.e., the value is
|
||
‘((void *) ((char *) TO + SIZE))’.
|
||
|
||
This function is useful in situations where a number of objects
|
||
shall be copied to consecutive memory positions.
|
||
|
||
void *
|
||
combine (void *o1, size_t s1, void *o2, size_t s2)
|
||
{
|
||
void *result = malloc (s1 + s2);
|
||
if (result != NULL)
|
||
mempcpy (mempcpy (result, o1, s1), o2, s2);
|
||
return result;
|
||
}
|
||
|
||
This function is a GNU extension.
|
||
|
||
-- Function: wchar_t * wmempcpy (wchar_t *restrict WTO, const wchar_t
|
||
*restrict WFROM, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘wmempcpy’ function is nearly identical to the ‘wmemcpy’
|
||
function. It copies SIZE wide characters from the object beginning
|
||
at ‘wfrom’ into the object pointed to by WTO. But instead of
|
||
returning the value of WTO it returns a pointer to the wide
|
||
character following the last written wide character in the object
|
||
beginning at WTO. I.e., the value is ‘WTO + SIZE’.
|
||
|
||
This function is useful in situations where a number of objects
|
||
shall be copied to consecutive memory positions.
|
||
|
||
The following is a possible implementation of ‘wmemcpy’ but there
|
||
are more optimizations possible.
|
||
|
||
wchar_t *
|
||
wmempcpy (wchar_t *restrict wto, const wchar_t *restrict wfrom,
|
||
size_t size)
|
||
{
|
||
return (wchar_t *) mempcpy (wto, wfrom, size * sizeof (wchar_t));
|
||
}
|
||
|
||
This function is a GNU extension.
|
||
|
||
-- Function: void * memmove (void *TO, const void *FROM, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘memmove’ copies the SIZE bytes at FROM into the SIZE bytes at TO,
|
||
even if those two blocks of space overlap. In the case of overlap,
|
||
‘memmove’ is careful to copy the original values of the bytes in
|
||
the block at FROM, including those bytes which also belong to the
|
||
block at TO.
|
||
|
||
The value returned by ‘memmove’ is the value of TO.
|
||
|
||
-- Function: wchar_t * wmemmove (wchar_t *WTO, const wchar_t *WFROM,
|
||
size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘wmemmove’ copies the SIZE wide characters at WFROM into the SIZE
|
||
wide characters at WTO, even if those two blocks of space overlap.
|
||
In the case of overlap, ‘wmemmove’ is careful to copy the original
|
||
values of the wide characters in the block at WFROM, including
|
||
those wide characters which also belong to the block at WTO.
|
||
|
||
The following is a possible implementation of ‘wmemcpy’ but there
|
||
are more optimizations possible.
|
||
|
||
wchar_t *
|
||
wmempcpy (wchar_t *restrict wto, const wchar_t *restrict wfrom,
|
||
size_t size)
|
||
{
|
||
return (wchar_t *) mempcpy (wto, wfrom, size * sizeof (wchar_t));
|
||
}
|
||
|
||
The value returned by ‘wmemmove’ is the value of WTO.
|
||
|
||
This function is a GNU extension.
|
||
|
||
-- Function: void * memccpy (void *restrict TO, const void *restrict
|
||
FROM, int C, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function copies no more than SIZE bytes from FROM to TO,
|
||
stopping if a byte matching C is found. The return value is a
|
||
pointer into TO one byte past where C was copied, or a null pointer
|
||
if no byte matching C appeared in the first SIZE bytes of FROM.
|
||
|
||
-- Function: void * memset (void *BLOCK, int C, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function copies the value of C (converted to an ‘unsigned
|
||
char’) into each of the first SIZE bytes of the object beginning at
|
||
BLOCK. It returns the value of BLOCK.
|
||
|
||
-- Function: wchar_t * wmemset (wchar_t *BLOCK, wchar_t WC, size_t
|
||
SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function copies the value of WC into each of the first SIZE
|
||
wide characters of the object beginning at BLOCK. It returns the
|
||
value of BLOCK.
|
||
|
||
-- Function: char * strcpy (char *restrict TO, const char *restrict
|
||
FROM)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This copies bytes from the string FROM (up to and including the
|
||
terminating null byte) into the string TO. Like ‘memcpy’, this
|
||
function has undefined results if the strings overlap. The return
|
||
value is the value of TO.
|
||
|
||
-- Function: wchar_t * wcscpy (wchar_t *restrict WTO, const wchar_t
|
||
*restrict WFROM)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This copies wide characters from the wide string WFROM (up to and
|
||
including the terminating null wide character) into the string WTO.
|
||
Like ‘wmemcpy’, this function has undefined results if the strings
|
||
overlap. The return value is the value of WTO.
|
||
|
||
-- Function: char * strdup (const char *S)
|
||
|
||
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
|
||
POSIX Safety Concepts::.
|
||
|
||
This function copies the string S into a newly allocated string.
|
||
The string is allocated using ‘malloc’; see *note Unconstrained
|
||
Allocation::. If ‘malloc’ cannot allocate space for the new
|
||
string, ‘strdup’ returns a null pointer. Otherwise it returns a
|
||
pointer to the new string.
|
||
|
||
-- Function: wchar_t * wcsdup (const wchar_t *WS)
|
||
|
||
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
|
||
POSIX Safety Concepts::.
|
||
|
||
This function copies the wide string WS into a newly allocated
|
||
string. The string is allocated using ‘malloc’; see *note
|
||
Unconstrained Allocation::. If ‘malloc’ cannot allocate space for
|
||
the new string, ‘wcsdup’ returns a null pointer. Otherwise it
|
||
returns a pointer to the new wide string.
|
||
|
||
This function is a GNU extension.
|
||
|
||
-- Function: char * stpcpy (char *restrict TO, const char *restrict
|
||
FROM)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function is like ‘strcpy’, except that it returns a pointer to
|
||
the end of the string TO (that is, the address of the terminating
|
||
null byte ‘to + strlen (from)’) rather than the beginning.
|
||
|
||
For example, this program uses ‘stpcpy’ to concatenate ‘foo’ and
|
||
‘bar’ to produce ‘foobar’, which it then prints.
|
||
|
||
|
||
#include <string.h>
|
||
#include <stdio.h>
|
||
|
||
int
|
||
main (void)
|
||
{
|
||
char buffer[10];
|
||
char *to = buffer;
|
||
to = stpcpy (to, "foo");
|
||
to = stpcpy (to, "bar");
|
||
puts (buffer);
|
||
return 0;
|
||
}
|
||
|
||
This function is part of POSIX.1-2008 and later editions, but was
|
||
available in the GNU C Library and other systems as an extension
|
||
long before it was standardized.
|
||
|
||
Its behavior is undefined if the strings overlap. The function is
|
||
declared in ‘string.h’.
|
||
|
||
-- Function: wchar_t * wcpcpy (wchar_t *restrict WTO, const wchar_t
|
||
*restrict WFROM)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function is like ‘wcscpy’, except that it returns a pointer to
|
||
the end of the string WTO (that is, the address of the terminating
|
||
null wide character ‘wto + wcslen (wfrom)’) rather than the
|
||
beginning.
|
||
|
||
This function is not part of ISO or POSIX but was found useful
|
||
while developing the GNU C Library itself.
|
||
|
||
The behavior of ‘wcpcpy’ is undefined if the strings overlap.
|
||
|
||
‘wcpcpy’ is a GNU extension and is declared in ‘wchar.h’.
|
||
|
||
-- Macro: char * strdupa (const char *S)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This macro is similar to ‘strdup’ but allocates the new string
|
||
using ‘alloca’ instead of ‘malloc’ (*note Variable Size
|
||
Automatic::). This means of course the returned string has the
|
||
same limitations as any block of memory allocated using ‘alloca’.
|
||
|
||
For obvious reasons ‘strdupa’ is implemented only as a macro; you
|
||
cannot get the address of this function. Despite this limitation
|
||
it is a useful function. The following code shows a situation
|
||
where using ‘malloc’ would be a lot more expensive.
|
||
|
||
|
||
#include <paths.h>
|
||
#include <string.h>
|
||
#include <stdio.h>
|
||
|
||
const char path[] = _PATH_STDPATH;
|
||
|
||
int
|
||
main (void)
|
||
{
|
||
char *wr_path = strdupa (path);
|
||
char *cp = strtok (wr_path, ":");
|
||
|
||
while (cp != NULL)
|
||
{
|
||
puts (cp);
|
||
cp = strtok (NULL, ":");
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
Please note that calling ‘strtok’ using PATH directly is invalid.
|
||
It is also not allowed to call ‘strdupa’ in the argument list of
|
||
‘strtok’ since ‘strdupa’ uses ‘alloca’ (*note Variable Size
|
||
Automatic::) can interfere with the parameter passing.
|
||
|
||
This function is only available if GNU CC is used.
|
||
|
||
-- Function: void bcopy (const void *FROM, void *TO, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This is a partially obsolete alternative for ‘memmove’, derived
|
||
from BSD. Note that it is not quite equivalent to ‘memmove’,
|
||
because the arguments are not in the same order and there is no
|
||
return value.
|
||
|
||
-- Function: void bzero (void *BLOCK, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This is a partially obsolete alternative for ‘memset’, derived from
|
||
BSD. Note that it is not as general as ‘memset’, because the only
|
||
value it can store is zero.
|
||
|
||
|
||
File: libc.info, Node: Concatenating Strings, Next: Truncating Strings, Prev: Copying Strings and Arrays, Up: String and Array Utilities
|
||
|
||
5.5 Concatenating Strings
|
||
=========================
|
||
|
||
The functions described in this section concatenate the contents of a
|
||
string or wide string to another. They follow the string-copying
|
||
functions in their conventions. *Note Copying Strings and Arrays::.
|
||
‘strcat’ is declared in the header file ‘string.h’ while ‘wcscat’ is
|
||
declared in ‘wchar.h’.
|
||
|
||
-- Function: char * strcat (char *restrict TO, const char *restrict
|
||
FROM)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘strcat’ function is similar to ‘strcpy’, except that the bytes
|
||
from FROM are concatenated or appended to the end of TO, instead of
|
||
overwriting it. That is, the first byte from FROM overwrites the
|
||
null byte marking the end of TO.
|
||
|
||
An equivalent definition for ‘strcat’ would be:
|
||
|
||
char *
|
||
strcat (char *restrict to, const char *restrict from)
|
||
{
|
||
strcpy (to + strlen (to), from);
|
||
return to;
|
||
}
|
||
|
||
This function has undefined results if the strings overlap.
|
||
|
||
As noted below, this function has significant performance issues.
|
||
|
||
-- Function: wchar_t * wcscat (wchar_t *restrict WTO, const wchar_t
|
||
*restrict WFROM)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘wcscat’ function is similar to ‘wcscpy’, except that the wide
|
||
characters from WFROM are concatenated or appended to the end of
|
||
WTO, instead of overwriting it. That is, the first wide character
|
||
from WFROM overwrites the null wide character marking the end of
|
||
WTO.
|
||
|
||
An equivalent definition for ‘wcscat’ would be:
|
||
|
||
wchar_t *
|
||
wcscat (wchar_t *wto, const wchar_t *wfrom)
|
||
{
|
||
wcscpy (wto + wcslen (wto), wfrom);
|
||
return wto;
|
||
}
|
||
|
||
This function has undefined results if the strings overlap.
|
||
|
||
As noted below, this function has significant performance issues.
|
||
|
||
Programmers using the ‘strcat’ or ‘wcscat’ function (or the ‘strncat’
|
||
or ‘wcsncat’ functions defined in a later section, for that matter) can
|
||
easily be recognized as lazy and reckless. In almost all situations the
|
||
lengths of the participating strings are known (it better should be
|
||
since how can one otherwise ensure the allocated size of the buffer is
|
||
sufficient?) Or at least, one could know them if one keeps track of the
|
||
results of the various function calls. But then it is very inefficient
|
||
to use ‘strcat’/‘wcscat’. A lot of time is wasted finding the end of
|
||
the destination string so that the actual copying can start. This is a
|
||
common example:
|
||
|
||
/* This function concatenates arbitrarily many strings. The last
|
||
parameter must be ‘NULL’. */
|
||
char *
|
||
concat (const char *str, ...)
|
||
{
|
||
va_list ap, ap2;
|
||
size_t total = 1;
|
||
const char *s;
|
||
char *result;
|
||
|
||
va_start (ap, str);
|
||
va_copy (ap2, ap);
|
||
|
||
/* Determine how much space we need. */
|
||
for (s = str; s != NULL; s = va_arg (ap, const char *))
|
||
total += strlen (s);
|
||
|
||
va_end (ap);
|
||
|
||
result = (char *) malloc (total);
|
||
if (result != NULL)
|
||
{
|
||
result[0] = '\0';
|
||
|
||
/* Copy the strings. */
|
||
for (s = str; s != NULL; s = va_arg (ap2, const char *))
|
||
strcat (result, s);
|
||
}
|
||
|
||
va_end (ap2);
|
||
|
||
return result;
|
||
}
|
||
|
||
This looks quite simple, especially the second loop where the strings
|
||
are actually copied. But these innocent lines hide a major performance
|
||
penalty. Just imagine that ten strings of 100 bytes each have to be
|
||
concatenated. For the second string we search the already stored 100
|
||
bytes for the end of the string so that we can append the next string.
|
||
For all strings in total the comparisons necessary to find the end of
|
||
the intermediate results sums up to 5500! If we combine the copying
|
||
with the search for the allocation we can write this function more
|
||
efficiently:
|
||
|
||
char *
|
||
concat (const char *str, ...)
|
||
{
|
||
va_list ap;
|
||
size_t allocated = 100;
|
||
char *result = (char *) malloc (allocated);
|
||
|
||
if (result != NULL)
|
||
{
|
||
char *newp;
|
||
char *wp;
|
||
const char *s;
|
||
|
||
va_start (ap, str);
|
||
|
||
wp = result;
|
||
for (s = str; s != NULL; s = va_arg (ap, const char *))
|
||
{
|
||
size_t len = strlen (s);
|
||
|
||
/* Resize the allocated memory if necessary. */
|
||
if (wp + len + 1 > result + allocated)
|
||
{
|
||
allocated = (allocated + len) * 2;
|
||
newp = (char *) realloc (result, allocated);
|
||
if (newp == NULL)
|
||
{
|
||
free (result);
|
||
return NULL;
|
||
}
|
||
wp = newp + (wp - result);
|
||
result = newp;
|
||
}
|
||
|
||
wp = mempcpy (wp, s, len);
|
||
}
|
||
|
||
/* Terminate the result string. */
|
||
*wp++ = '\0';
|
||
|
||
/* Resize memory to the optimal size. */
|
||
newp = realloc (result, wp - result);
|
||
if (newp != NULL)
|
||
result = newp;
|
||
|
||
va_end (ap);
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
With a bit more knowledge about the input strings one could fine-tune
|
||
the memory allocation. The difference we are pointing to here is that
|
||
we don’t use ‘strcat’ anymore. We always keep track of the length of
|
||
the current intermediate result so we can save ourselves the search for
|
||
the end of the string and use ‘mempcpy’. Please note that we also don’t
|
||
use ‘stpcpy’ which might seem more natural since we are handling
|
||
strings. But this is not necessary since we already know the length of
|
||
the string and therefore can use the faster memory copying function.
|
||
The example would work for wide characters the same way.
|
||
|
||
Whenever a programmer feels the need to use ‘strcat’ she or he should
|
||
think twice and look through the program to see whether the code cannot
|
||
be rewritten to take advantage of already calculated results. Again: it
|
||
is almost always unnecessary to use ‘strcat’.
|
||
|
||
|
||
File: libc.info, Node: Truncating Strings, Next: String/Array Comparison, Prev: Concatenating Strings, Up: String and Array Utilities
|
||
|
||
5.6 Truncating Strings while Copying
|
||
====================================
|
||
|
||
The functions described in this section copy or concatenate the
|
||
possibly-truncated contents of a string or array to another, and
|
||
similarly for wide strings. They follow the string-copying functions in
|
||
their header conventions. *Note Copying Strings and Arrays::. The
|
||
‘str’ functions are declared in the header file ‘string.h’ and the ‘wc’
|
||
functions are declared in the file ‘wchar.h’.
|
||
|
||
-- Function: char * strncpy (char *restrict TO, const char *restrict
|
||
FROM, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function is similar to ‘strcpy’ but always copies exactly SIZE
|
||
bytes into TO.
|
||
|
||
If FROM does not contain a null byte in its first SIZE bytes,
|
||
‘strncpy’ copies just the first SIZE bytes. In this case no null
|
||
terminator is written into TO.
|
||
|
||
Otherwise FROM must be a string with length less than SIZE. In
|
||
this case ‘strncpy’ copies all of FROM, followed by enough null
|
||
bytes to add up to SIZE bytes in all.
|
||
|
||
The behavior of ‘strncpy’ is undefined if the strings overlap.
|
||
|
||
This function was designed for now-rarely-used arrays consisting of
|
||
non-null bytes followed by zero or more null bytes. It needs to
|
||
set all SIZE bytes of the destination, even when SIZE is much
|
||
greater than the length of FROM. As noted below, this function is
|
||
generally a poor choice for processing text.
|
||
|
||
-- Function: wchar_t * wcsncpy (wchar_t *restrict WTO, const wchar_t
|
||
*restrict WFROM, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function is similar to ‘wcscpy’ but always copies exactly SIZE
|
||
wide characters into WTO.
|
||
|
||
If WFROM does not contain a null wide character in its first SIZE
|
||
wide characters, then ‘wcsncpy’ copies just the first SIZE wide
|
||
characters. In this case no null terminator is written into WTO.
|
||
|
||
Otherwise WFROM must be a wide string with length less than SIZE.
|
||
In this case ‘wcsncpy’ copies all of WFROM, followed by enough null
|
||
wide characters to add up to SIZE wide characters in all.
|
||
|
||
The behavior of ‘wcsncpy’ is undefined if the strings overlap.
|
||
|
||
This function is the wide-character counterpart of ‘strncpy’ and
|
||
suffers from most of the problems that ‘strncpy’ does. For
|
||
example, as noted below, this function is generally a poor choice
|
||
for processing text.
|
||
|
||
-- Function: char * strndup (const char *S, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
|
||
POSIX Safety Concepts::.
|
||
|
||
This function is similar to ‘strdup’ but always copies at most SIZE
|
||
bytes into the newly allocated string.
|
||
|
||
If the length of S is more than SIZE, then ‘strndup’ copies just
|
||
the first SIZE bytes and adds a closing null byte. Otherwise all
|
||
bytes are copied and the string is terminated.
|
||
|
||
This function differs from ‘strncpy’ in that it always terminates
|
||
the destination string.
|
||
|
||
As noted below, this function is generally a poor choice for
|
||
processing text.
|
||
|
||
‘strndup’ is a GNU extension.
|
||
|
||
-- Macro: char * strndupa (const char *S, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function is similar to ‘strndup’ but like ‘strdupa’ it
|
||
allocates the new string using ‘alloca’ *note Variable Size
|
||
Automatic::. The same advantages and limitations of ‘strdupa’ are
|
||
valid for ‘strndupa’, too.
|
||
|
||
This function is implemented only as a macro, just like ‘strdupa’.
|
||
Just as ‘strdupa’ this macro also must not be used inside the
|
||
parameter list in a function call.
|
||
|
||
As noted below, this function is generally a poor choice for
|
||
processing text.
|
||
|
||
‘strndupa’ is only available if GNU CC is used.
|
||
|
||
-- Function: char * stpncpy (char *restrict TO, const char *restrict
|
||
FROM, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function is similar to ‘stpcpy’ but copies always exactly SIZE
|
||
bytes into TO.
|
||
|
||
If the length of FROM is more than SIZE, then ‘stpncpy’ copies just
|
||
the first SIZE bytes and returns a pointer to the byte directly
|
||
following the one which was copied last. Note that in this case
|
||
there is no null terminator written into TO.
|
||
|
||
If the length of FROM is less than SIZE, then ‘stpncpy’ copies all
|
||
of FROM, followed by enough null bytes to add up to SIZE bytes in
|
||
all. This behavior is rarely useful, but it is implemented to be
|
||
useful in contexts where this behavior of the ‘strncpy’ is used.
|
||
‘stpncpy’ returns a pointer to the _first_ written null byte.
|
||
|
||
This function is not part of ISO or POSIX but was found useful
|
||
while developing the GNU C Library itself.
|
||
|
||
Its behavior is undefined if the strings overlap. The function is
|
||
declared in ‘string.h’.
|
||
|
||
As noted below, this function is generally a poor choice for
|
||
processing text.
|
||
|
||
-- Function: wchar_t * wcpncpy (wchar_t *restrict WTO, const wchar_t
|
||
*restrict WFROM, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function is similar to ‘wcpcpy’ but copies always exactly
|
||
WSIZE wide characters into WTO.
|
||
|
||
If the length of WFROM is more than SIZE, then ‘wcpncpy’ copies
|
||
just the first SIZE wide characters and returns a pointer to the
|
||
wide character directly following the last non-null wide character
|
||
which was copied last. Note that in this case there is no null
|
||
terminator written into WTO.
|
||
|
||
If the length of WFROM is less than SIZE, then ‘wcpncpy’ copies all
|
||
of WFROM, followed by enough null wide characters to add up to SIZE
|
||
wide characters in all. This behavior is rarely useful, but it is
|
||
implemented to be useful in contexts where this behavior of the
|
||
‘wcsncpy’ is used. ‘wcpncpy’ returns a pointer to the _first_
|
||
written null wide character.
|
||
|
||
This function is not part of ISO or POSIX but was found useful
|
||
while developing the GNU C Library itself.
|
||
|
||
Its behavior is undefined if the strings overlap.
|
||
|
||
As noted below, this function is generally a poor choice for
|
||
processing text.
|
||
|
||
‘wcpncpy’ is a GNU extension.
|
||
|
||
-- Function: char * strncat (char *restrict TO, const char *restrict
|
||
FROM, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function is like ‘strcat’ except that not more than SIZE bytes
|
||
from FROM are appended to the end of TO, and FROM need not be
|
||
null-terminated. A single null byte is also always appended to TO,
|
||
so the total allocated size of TO must be at least ‘SIZE + 1’ bytes
|
||
longer than its initial length.
|
||
|
||
The ‘strncat’ function could be implemented like this:
|
||
|
||
char *
|
||
strncat (char *to, const char *from, size_t size)
|
||
{
|
||
size_t len = strlen (to);
|
||
memcpy (to + len, from, strnlen (from, size));
|
||
to[len + strnlen (from, size)] = '\0';
|
||
return to;
|
||
}
|
||
|
||
The behavior of ‘strncat’ is undefined if the strings overlap.
|
||
|
||
As a companion to ‘strncpy’, ‘strncat’ was designed for
|
||
now-rarely-used arrays consisting of non-null bytes followed by
|
||
zero or more null bytes. As noted below, this function is
|
||
generally a poor choice for processing text. Also, this function
|
||
has significant performance issues. *Note Concatenating Strings::.
|
||
|
||
-- Function: wchar_t * wcsncat (wchar_t *restrict WTO, const wchar_t
|
||
*restrict WFROM, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function is like ‘wcscat’ except that not more than SIZE wide
|
||
characters from FROM are appended to the end of TO, and FROM need
|
||
not be null-terminated. A single null wide character is also
|
||
always appended to TO, so the total allocated size of TO must be at
|
||
least ‘wcsnlen (WFROM, SIZE) + 1’ wide characters longer than its
|
||
initial length.
|
||
|
||
The ‘wcsncat’ function could be implemented like this:
|
||
|
||
wchar_t *
|
||
wcsncat (wchar_t *restrict wto, const wchar_t *restrict wfrom,
|
||
size_t size)
|
||
{
|
||
size_t len = wcslen (wto);
|
||
memcpy (wto + len, wfrom, wcsnlen (wfrom, size) * sizeof (wchar_t));
|
||
wto[len + wcsnlen (wfrom, size)] = L'\0';
|
||
return wto;
|
||
}
|
||
|
||
The behavior of ‘wcsncat’ is undefined if the strings overlap.
|
||
|
||
As noted below, this function is generally a poor choice for
|
||
processing text. Also, this function has significant performance
|
||
issues. *Note Concatenating Strings::.
|
||
|
||
Because these functions can abruptly truncate strings or wide
|
||
strings, they are generally poor choices for processing text. When
|
||
coping or concatening multibyte strings, they can truncate within a
|
||
multibyte character so that the result is not a valid multibyte string.
|
||
When combining or concatenating multibyte or wide strings, they may
|
||
truncate the output after a combining character, resulting in a
|
||
corrupted grapheme. They can cause bugs even when processing
|
||
single-byte strings: for example, when calculating an ASCII-only user
|
||
name, a truncated name can identify the wrong user.
|
||
|
||
Although some buffer overruns can be prevented by manually replacing
|
||
calls to copying functions with calls to truncation functions, there are
|
||
often easier and safer automatic techniques that cause buffer overruns
|
||
to reliably terminate a program, such as GCC’s ‘-fcheck-pointer-bounds’
|
||
and ‘-fsanitize=address’ options. *Note Options for Debugging Your
|
||
Program or GCC: (gcc)Debugging Options. Because truncation functions
|
||
can mask application bugs that would otherwise be caught by the
|
||
automatic techniques, these functions should be used only when the
|
||
application’s underlying logic requires truncation.
|
||
|
||
*Note:* GNU programs should not truncate strings or wide strings to
|
||
fit arbitrary size limits. *Note Writing Robust Programs:
|
||
(standards)Semantics. Instead of string-truncation functions, it is
|
||
usually better to use dynamic memory allocation (*note Unconstrained
|
||
Allocation::) and functions such as ‘strdup’ or ‘asprintf’ to construct
|
||
strings.
|
||
|
||
|
||
File: libc.info, Node: String/Array Comparison, Next: Collation Functions, Prev: Truncating Strings, Up: String and Array Utilities
|
||
|
||
5.7 String/Array Comparison
|
||
===========================
|
||
|
||
You can use the functions in this section to perform comparisons on the
|
||
contents of strings and arrays. As well as checking for equality, these
|
||
functions can also be used as the ordering functions for sorting
|
||
operations. *Note Searching and Sorting::, for an example of this.
|
||
|
||
Unlike most comparison operations in C, the string comparison
|
||
functions return a nonzero value if the strings are _not_ equivalent
|
||
rather than if they are. The sign of the value indicates the relative
|
||
ordering of the first part of the strings that are not equivalent: a
|
||
negative value indicates that the first string is “less” than the
|
||
second, while a positive value indicates that the first string is
|
||
“greater”.
|
||
|
||
The most common use of these functions is to check only for equality.
|
||
This is canonically done with an expression like ‘! strcmp (s1, s2)’.
|
||
|
||
All of these functions are declared in the header file ‘string.h’.
|
||
|
||
-- Function: int memcmp (const void *A1, const void *A2, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The function ‘memcmp’ compares the SIZE bytes of memory beginning
|
||
at A1 against the SIZE bytes of memory beginning at A2. The value
|
||
returned has the same sign as the difference between the first
|
||
differing pair of bytes (interpreted as ‘unsigned char’ objects,
|
||
then promoted to ‘int’).
|
||
|
||
If the contents of the two blocks are equal, ‘memcmp’ returns ‘0’.
|
||
|
||
-- Function: int wmemcmp (const wchar_t *A1, const wchar_t *A2, size_t
|
||
SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The function ‘wmemcmp’ compares the SIZE wide characters beginning
|
||
at A1 against the SIZE wide characters beginning at A2. The value
|
||
returned is smaller than or larger than zero depending on whether
|
||
the first differing wide character is A1 is smaller or larger than
|
||
the corresponding wide character in A2.
|
||
|
||
If the contents of the two blocks are equal, ‘wmemcmp’ returns ‘0’.
|
||
|
||
On arbitrary arrays, the ‘memcmp’ function is mostly useful for
|
||
testing equality. It usually isn’t meaningful to do byte-wise ordering
|
||
comparisons on arrays of things other than bytes. For example, a
|
||
byte-wise comparison on the bytes that make up floating-point numbers
|
||
isn’t likely to tell you anything about the relationship between the
|
||
values of the floating-point numbers.
|
||
|
||
‘wmemcmp’ is really only useful to compare arrays of type ‘wchar_t’
|
||
since the function looks at ‘sizeof (wchar_t)’ bytes at a time and this
|
||
number of bytes is system dependent.
|
||
|
||
You should also be careful about using ‘memcmp’ to compare objects
|
||
that can contain “holes”, such as the padding inserted into structure
|
||
objects to enforce alignment requirements, extra space at the end of
|
||
unions, and extra bytes at the ends of strings whose length is less than
|
||
their allocated size. The contents of these “holes” are indeterminate
|
||
and may cause strange behavior when performing byte-wise comparisons.
|
||
For more predictable results, perform an explicit component-wise
|
||
comparison.
|
||
|
||
For example, given a structure type definition like:
|
||
|
||
struct foo
|
||
{
|
||
unsigned char tag;
|
||
union
|
||
{
|
||
double f;
|
||
long i;
|
||
char *p;
|
||
} value;
|
||
};
|
||
|
||
you are better off writing a specialized comparison function to compare
|
||
‘struct foo’ objects instead of comparing them with ‘memcmp’.
|
||
|
||
-- Function: int strcmp (const char *S1, const char *S2)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘strcmp’ function compares the string S1 against S2, returning
|
||
a value that has the same sign as the difference between the first
|
||
differing pair of bytes (interpreted as ‘unsigned char’ objects,
|
||
then promoted to ‘int’).
|
||
|
||
If the two strings are equal, ‘strcmp’ returns ‘0’.
|
||
|
||
A consequence of the ordering used by ‘strcmp’ is that if S1 is an
|
||
initial substring of S2, then S1 is considered to be “less than”
|
||
S2.
|
||
|
||
‘strcmp’ does not take sorting conventions of the language the
|
||
strings are written in into account. To get that one has to use
|
||
‘strcoll’.
|
||
|
||
-- Function: int wcscmp (const wchar_t *WS1, const wchar_t *WS2)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘wcscmp’ function compares the wide string WS1 against WS2.
|
||
The value returned is smaller than or larger than zero depending on
|
||
whether the first differing wide character is WS1 is smaller or
|
||
larger than the corresponding wide character in WS2.
|
||
|
||
If the two strings are equal, ‘wcscmp’ returns ‘0’.
|
||
|
||
A consequence of the ordering used by ‘wcscmp’ is that if WS1 is an
|
||
initial substring of WS2, then WS1 is considered to be “less than”
|
||
WS2.
|
||
|
||
‘wcscmp’ does not take sorting conventions of the language the
|
||
strings are written in into account. To get that one has to use
|
||
‘wcscoll’.
|
||
|
||
-- Function: int strcasecmp (const char *S1, const char *S2)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
This function is like ‘strcmp’, except that differences in case are
|
||
ignored, and its arguments must be multibyte strings. How
|
||
uppercase and lowercase characters are related is determined by the
|
||
currently selected locale. In the standard ‘"C"’ locale the
|
||
characters Ä and ä do not match but in a locale which regards these
|
||
characters as parts of the alphabet they do match.
|
||
|
||
‘strcasecmp’ is derived from BSD.
|
||
|
||
-- Function: int wcscasecmp (const wchar_t *WS1, const wchar_t *WS2)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
This function is like ‘wcscmp’, except that differences in case are
|
||
ignored. How uppercase and lowercase characters are related is
|
||
determined by the currently selected locale. In the standard ‘"C"’
|
||
locale the characters Ä and ä do not match but in a locale which
|
||
regards these characters as parts of the alphabet they do match.
|
||
|
||
‘wcscasecmp’ is a GNU extension.
|
||
|
||
-- Function: int strncmp (const char *S1, const char *S2, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function is the similar to ‘strcmp’, except that no more than
|
||
SIZE bytes are compared. In other words, if the two strings are
|
||
the same in their first SIZE bytes, the return value is zero.
|
||
|
||
-- Function: int wcsncmp (const wchar_t *WS1, const wchar_t *WS2,
|
||
size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function is similar to ‘wcscmp’, except that no more than SIZE
|
||
wide characters are compared. In other words, if the two strings
|
||
are the same in their first SIZE wide characters, the return value
|
||
is zero.
|
||
|
||
-- Function: int strncasecmp (const char *S1, const char *S2, size_t N)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
This function is like ‘strncmp’, except that differences in case
|
||
are ignored, and the compared parts of the arguments should consist
|
||
of valid multibyte characters. Like ‘strcasecmp’, it is locale
|
||
dependent how uppercase and lowercase characters are related.
|
||
|
||
‘strncasecmp’ is a GNU extension.
|
||
|
||
-- Function: int wcsncasecmp (const wchar_t *WS1, const wchar_t *S2,
|
||
size_t N)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
This function is like ‘wcsncmp’, except that differences in case
|
||
are ignored. Like ‘wcscasecmp’, it is locale dependent how
|
||
uppercase and lowercase characters are related.
|
||
|
||
‘wcsncasecmp’ is a GNU extension.
|
||
|
||
Here are some examples showing the use of ‘strcmp’ and ‘strncmp’
|
||
(equivalent examples can be constructed for the wide character
|
||
functions). These examples assume the use of the ASCII character set.
|
||
(If some other character set—say, EBCDIC—is used instead, then the
|
||
glyphs are associated with different numeric codes, and the return
|
||
values and ordering may differ.)
|
||
|
||
strcmp ("hello", "hello")
|
||
⇒ 0 /* These two strings are the same. */
|
||
strcmp ("hello", "Hello")
|
||
⇒ 32 /* Comparisons are case-sensitive. */
|
||
strcmp ("hello", "world")
|
||
⇒ -15 /* The byte ‘'h'’ comes before ‘'w'’. */
|
||
strcmp ("hello", "hello, world")
|
||
⇒ -44 /* Comparing a null byte against a comma. */
|
||
strncmp ("hello", "hello, world", 5)
|
||
⇒ 0 /* The initial 5 bytes are the same. */
|
||
strncmp ("hello, world", "hello, stupid world!!!", 5)
|
||
⇒ 0 /* The initial 5 bytes are the same. */
|
||
|
||
-- Function: int strverscmp (const char *S1, const char *S2)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
The ‘strverscmp’ function compares the string S1 against S2,
|
||
considering them as holding indices/version numbers. The return
|
||
value follows the same conventions as found in the ‘strcmp’
|
||
function. In fact, if S1 and S2 contain no digits, ‘strverscmp’
|
||
behaves like ‘strcmp’ (in the sense that the sign of the result is
|
||
the same).
|
||
|
||
The comparison algorithm which the ‘strverscmp’ function implements
|
||
differs slightly from other version-comparison algorithms. The
|
||
implementation is based on a finite-state machine, whose behavior
|
||
is approximated below.
|
||
|
||
• The input strings are each split into sequences of non-digits
|
||
and digits. These sequences can be empty at the beginning and
|
||
end of the string. Digits are determined by the ‘isdigit’
|
||
function and are thus subject to the current locale.
|
||
|
||
• Comparison starts with a (possibly empty) non-digit sequence.
|
||
The first non-equal sequences of non-digits or digits
|
||
determines the outcome of the comparison.
|
||
|
||
• Corresponding non-digit sequences in both strings are compared
|
||
lexicographically if their lengths are equal. If the lengths
|
||
differ, the shorter non-digit sequence is extended with the
|
||
input string character immediately following it (which may be
|
||
the null terminator), the other sequence is truncated to be of
|
||
the same (extended) length, and these two sequences are
|
||
compared lexicographically. In the last case, the sequence
|
||
comparison determines the result of the function because the
|
||
extension character (or some character before it) is
|
||
necessarily different from the character at the same offset in
|
||
the other input string.
|
||
|
||
• For two sequences of digits, the number of leading zeros is
|
||
counted (which can be zero). If the count differs, the string
|
||
with more leading zeros in the digit sequence is considered
|
||
smaller than the other string.
|
||
|
||
• If the two sequences of digits have no leading zeros, they are
|
||
compared as integers, that is, the string with the longer
|
||
digit sequence is deemed larger, and if both sequences are of
|
||
equal length, they are compared lexicographically.
|
||
|
||
• If both digit sequences start with a zero and have an equal
|
||
number of leading zeros, they are compared lexicographically
|
||
if their lengths are the same. If the lengths differ, the
|
||
shorter sequence is extended with the following character in
|
||
its input string, and the other sequence is truncated to the
|
||
same length, and both sequences are compared lexicographically
|
||
(similar to the non-digit sequence case above).
|
||
|
||
The treatment of leading zeros and the tie-breaking extension
|
||
characters (which in effect propagate across non-digit/digit
|
||
sequence boundaries) differs from other version-comparison
|
||
algorithms.
|
||
|
||
strverscmp ("no digit", "no digit")
|
||
⇒ 0 /* same behavior as strcmp. */
|
||
strverscmp ("item#99", "item#100")
|
||
⇒ <0 /* same prefix, but 99 < 100. */
|
||
strverscmp ("alpha1", "alpha001")
|
||
⇒ >0 /* different number of leading zeros (0 and 2). */
|
||
strverscmp ("part1_f012", "part1_f01")
|
||
⇒ >0 /* lexicographical comparison with leading zeros. */
|
||
strverscmp ("foo.009", "foo.0")
|
||
⇒ <0 /* different number of leading zeros (2 and 1). */
|
||
|
||
‘strverscmp’ is a GNU extension.
|
||
|
||
-- Function: int bcmp (const void *A1, const void *A2, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This is an obsolete alias for ‘memcmp’, derived from BSD.
|
||
|
||
|
||
File: libc.info, Node: Collation Functions, Next: Search Functions, Prev: String/Array Comparison, Up: String and Array Utilities
|
||
|
||
5.8 Collation Functions
|
||
=======================
|
||
|
||
In some locales, the conventions for lexicographic ordering differ from
|
||
the strict numeric ordering of character codes. For example, in Spanish
|
||
most glyphs with diacritical marks such as accents are not considered
|
||
distinct letters for the purposes of collation. On the other hand, the
|
||
two-character sequence ‘ll’ is treated as a single letter that is
|
||
collated immediately after ‘l’.
|
||
|
||
You can use the functions ‘strcoll’ and ‘strxfrm’ (declared in the
|
||
headers file ‘string.h’) and ‘wcscoll’ and ‘wcsxfrm’ (declared in the
|
||
headers file ‘wchar’) to compare strings using a collation ordering
|
||
appropriate for the current locale. The locale used by these functions
|
||
in particular can be specified by setting the locale for the
|
||
‘LC_COLLATE’ category; see *note Locales::.
|
||
|
||
In the standard C locale, the collation sequence for ‘strcoll’ is the
|
||
same as that for ‘strcmp’. Similarly, ‘wcscoll’ and ‘wcscmp’ are the
|
||
same in this situation.
|
||
|
||
Effectively, the way these functions work is by applying a mapping to
|
||
transform the characters in a multibyte string to a byte sequence that
|
||
represents the string’s position in the collating sequence of the
|
||
current locale. Comparing two such byte sequences in a simple fashion
|
||
is equivalent to comparing the strings with the locale’s collating
|
||
sequence.
|
||
|
||
The functions ‘strcoll’ and ‘wcscoll’ perform this translation
|
||
implicitly, in order to do one comparison. By contrast, ‘strxfrm’ and
|
||
‘wcsxfrm’ perform the mapping explicitly. If you are making multiple
|
||
comparisons using the same string or set of strings, it is likely to be
|
||
more efficient to use ‘strxfrm’ or ‘wcsxfrm’ to transform all the
|
||
strings just once, and subsequently compare the transformed strings with
|
||
‘strcmp’ or ‘wcscmp’.
|
||
|
||
-- Function: int strcoll (const char *S1, const char *S2)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
|
||
*Note POSIX Safety Concepts::.
|
||
|
||
The ‘strcoll’ function is similar to ‘strcmp’ but uses the
|
||
collating sequence of the current locale for collation (the
|
||
‘LC_COLLATE’ locale). The arguments are multibyte strings.
|
||
|
||
-- Function: int wcscoll (const wchar_t *WS1, const wchar_t *WS2)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
|
||
*Note POSIX Safety Concepts::.
|
||
|
||
The ‘wcscoll’ function is similar to ‘wcscmp’ but uses the
|
||
collating sequence of the current locale for collation (the
|
||
‘LC_COLLATE’ locale).
|
||
|
||
Here is an example of sorting an array of strings, using ‘strcoll’ to
|
||
compare them. The actual sort algorithm is not written here; it comes
|
||
from ‘qsort’ (*note Array Sort Function::). The job of the code shown
|
||
here is to say how to compare the strings while sorting them. (Later on
|
||
in this section, we will show a way to do this more efficiently using
|
||
‘strxfrm’.)
|
||
|
||
/* This is the comparison function used with ‘qsort’. */
|
||
|
||
int
|
||
compare_elements (const void *v1, const void *v2)
|
||
{
|
||
char * const *p1 = v1;
|
||
char * const *p2 = v2;
|
||
|
||
return strcoll (*p1, *p2);
|
||
}
|
||
|
||
/* This is the entry point—the function to sort
|
||
strings using the locale’s collating sequence. */
|
||
|
||
void
|
||
sort_strings (char **array, int nstrings)
|
||
{
|
||
/* Sort ‘temp_array’ by comparing the strings. */
|
||
qsort (array, nstrings,
|
||
sizeof (char *), compare_elements);
|
||
}
|
||
|
||
-- Function: size_t strxfrm (char *restrict TO, const char *restrict
|
||
FROM, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
|
||
*Note POSIX Safety Concepts::.
|
||
|
||
The function ‘strxfrm’ transforms the multibyte string FROM using
|
||
the collation transformation determined by the locale currently
|
||
selected for collation, and stores the transformed string in the
|
||
array TO. Up to SIZE bytes (including a terminating null byte) are
|
||
stored.
|
||
|
||
The behavior is undefined if the strings TO and FROM overlap; see
|
||
*note Copying Strings and Arrays::.
|
||
|
||
The return value is the length of the entire transformed string.
|
||
This value is not affected by the value of SIZE, but if it is
|
||
greater or equal than SIZE, it means that the transformed string
|
||
did not entirely fit in the array TO. In this case, only as much
|
||
of the string as actually fits was stored. To get the whole
|
||
transformed string, call ‘strxfrm’ again with a bigger output
|
||
array.
|
||
|
||
The transformed string may be longer than the original string, and
|
||
it may also be shorter.
|
||
|
||
If SIZE is zero, no bytes are stored in TO. In this case,
|
||
‘strxfrm’ simply returns the number of bytes that would be the
|
||
length of the transformed string. This is useful for determining
|
||
what size the allocated array should be. It does not matter what
|
||
TO is if SIZE is zero; TO may even be a null pointer.
|
||
|
||
-- Function: size_t wcsxfrm (wchar_t *restrict WTO, const wchar_t
|
||
*WFROM, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
|
||
*Note POSIX Safety Concepts::.
|
||
|
||
The function ‘wcsxfrm’ transforms wide string WFROM using the
|
||
collation transformation determined by the locale currently
|
||
selected for collation, and stores the transformed string in the
|
||
array WTO. Up to SIZE wide characters (including a terminating
|
||
null wide character) are stored.
|
||
|
||
The behavior is undefined if the strings WTO and WFROM overlap; see
|
||
*note Copying Strings and Arrays::.
|
||
|
||
The return value is the length of the entire transformed wide
|
||
string. This value is not affected by the value of SIZE, but if it
|
||
is greater or equal than SIZE, it means that the transformed wide
|
||
string did not entirely fit in the array WTO. In this case, only
|
||
as much of the wide string as actually fits was stored. To get the
|
||
whole transformed wide string, call ‘wcsxfrm’ again with a bigger
|
||
output array.
|
||
|
||
The transformed wide string may be longer than the original wide
|
||
string, and it may also be shorter.
|
||
|
||
If SIZE is zero, no wide characters are stored in TO. In this
|
||
case, ‘wcsxfrm’ simply returns the number of wide characters that
|
||
would be the length of the transformed wide string. This is useful
|
||
for determining what size the allocated array should be (remember
|
||
to multiply with ‘sizeof (wchar_t)’). It does not matter what WTO
|
||
is if SIZE is zero; WTO may even be a null pointer.
|
||
|
||
Here is an example of how you can use ‘strxfrm’ when you plan to do
|
||
many comparisons. It does the same thing as the previous example, but
|
||
much faster, because it has to transform each string only once, no
|
||
matter how many times it is compared with other strings. Even the time
|
||
needed to allocate and free storage is much less than the time we save,
|
||
when there are many strings.
|
||
|
||
struct sorter { char *input; char *transformed; };
|
||
|
||
/* This is the comparison function used with ‘qsort’
|
||
to sort an array of ‘struct sorter’. */
|
||
|
||
int
|
||
compare_elements (const void *v1, const void *v2)
|
||
{
|
||
const struct sorter *p1 = v1;
|
||
const struct sorter *p2 = v2;
|
||
|
||
return strcmp (p1->transformed, p2->transformed);
|
||
}
|
||
|
||
/* This is the entry point—the function to sort
|
||
strings using the locale’s collating sequence. */
|
||
|
||
void
|
||
sort_strings_fast (char **array, int nstrings)
|
||
{
|
||
struct sorter temp_array[nstrings];
|
||
int i;
|
||
|
||
/* Set up ‘temp_array’. Each element contains
|
||
one input string and its transformed string. */
|
||
for (i = 0; i < nstrings; i++)
|
||
{
|
||
size_t length = strlen (array[i]) * 2;
|
||
char *transformed;
|
||
size_t transformed_length;
|
||
|
||
temp_array[i].input = array[i];
|
||
|
||
/* First try a buffer perhaps big enough. */
|
||
transformed = (char *) xmalloc (length);
|
||
|
||
/* Transform ‘array[i]’. */
|
||
transformed_length = strxfrm (transformed, array[i], length);
|
||
|
||
/* If the buffer was not large enough, resize it
|
||
and try again. */
|
||
if (transformed_length >= length)
|
||
{
|
||
/* Allocate the needed space. +1 for terminating
|
||
‘'\0'’ byte. */
|
||
transformed = (char *) xrealloc (transformed,
|
||
transformed_length + 1);
|
||
|
||
/* The return value is not interesting because we know
|
||
how long the transformed string is. */
|
||
(void) strxfrm (transformed, array[i],
|
||
transformed_length + 1);
|
||
}
|
||
|
||
temp_array[i].transformed = transformed;
|
||
}
|
||
|
||
/* Sort ‘temp_array’ by comparing transformed strings. */
|
||
qsort (temp_array, nstrings,
|
||
sizeof (struct sorter), compare_elements);
|
||
|
||
/* Put the elements back in the permanent array
|
||
in their sorted order. */
|
||
for (i = 0; i < nstrings; i++)
|
||
array[i] = temp_array[i].input;
|
||
|
||
/* Free the strings we allocated. */
|
||
for (i = 0; i < nstrings; i++)
|
||
free (temp_array[i].transformed);
|
||
}
|
||
|
||
The interesting part of this code for the wide character version
|
||
would look like this:
|
||
|
||
void
|
||
sort_strings_fast (wchar_t **array, int nstrings)
|
||
{
|
||
...
|
||
/* Transform ‘array[i]’. */
|
||
transformed_length = wcsxfrm (transformed, array[i], length);
|
||
|
||
/* If the buffer was not large enough, resize it
|
||
and try again. */
|
||
if (transformed_length >= length)
|
||
{
|
||
/* Allocate the needed space. +1 for terminating
|
||
‘L'\0'’ wide character. */
|
||
transformed = (wchar_t *) xrealloc (transformed,
|
||
(transformed_length + 1)
|
||
* sizeof (wchar_t));
|
||
|
||
/* The return value is not interesting because we know
|
||
how long the transformed string is. */
|
||
(void) wcsxfrm (transformed, array[i],
|
||
transformed_length + 1);
|
||
}
|
||
...
|
||
|
||
Note the additional multiplication with ‘sizeof (wchar_t)’ in the
|
||
‘realloc’ call.
|
||
|
||
*Compatibility Note:* The string collation functions are a new
|
||
feature of ISO C90. Older C dialects have no equivalent feature. The
|
||
wide character versions were introduced in Amendment 1 to ISO C90.
|
||
|
||
|
||
File: libc.info, Node: Search Functions, Next: Finding Tokens in a String, Prev: Collation Functions, Up: String and Array Utilities
|
||
|
||
5.9 Search Functions
|
||
====================
|
||
|
||
This section describes library functions which perform various kinds of
|
||
searching operations on strings and arrays. These functions are
|
||
declared in the header file ‘string.h’.
|
||
|
||
-- Function: void * memchr (const void *BLOCK, int C, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function finds the first occurrence of the byte C (converted
|
||
to an ‘unsigned char’) in the initial SIZE bytes of the object
|
||
beginning at BLOCK. The return value is a pointer to the located
|
||
byte, or a null pointer if no match was found.
|
||
|
||
-- Function: wchar_t * wmemchr (const wchar_t *BLOCK, wchar_t WC,
|
||
size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function finds the first occurrence of the wide character WC
|
||
in the initial SIZE wide characters of the object beginning at
|
||
BLOCK. The return value is a pointer to the located wide
|
||
character, or a null pointer if no match was found.
|
||
|
||
-- Function: void * rawmemchr (const void *BLOCK, int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Often the ‘memchr’ function is used with the knowledge that the
|
||
byte C is available in the memory block specified by the
|
||
parameters. But this means that the SIZE parameter is not really
|
||
needed and that the tests performed with it at runtime (to check
|
||
whether the end of the block is reached) are not needed.
|
||
|
||
The ‘rawmemchr’ function exists for just this situation which is
|
||
surprisingly frequent. The interface is similar to ‘memchr’ except
|
||
that the SIZE parameter is missing. The function will look beyond
|
||
the end of the block pointed to by BLOCK in case the programmer
|
||
made an error in assuming that the byte C is present in the block.
|
||
In this case the result is unspecified. Otherwise the return value
|
||
is a pointer to the located byte.
|
||
|
||
This function is of special interest when looking for the end of a
|
||
string. Since all strings are terminated by a null byte a call
|
||
like
|
||
|
||
rawmemchr (str, '\0')
|
||
|
||
will never go beyond the end of the string.
|
||
|
||
This function is a GNU extension.
|
||
|
||
-- Function: void * memrchr (const void *BLOCK, int C, size_t SIZE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The function ‘memrchr’ is like ‘memchr’, except that it searches
|
||
backwards from the end of the block defined by BLOCK and SIZE
|
||
(instead of forwards from the front).
|
||
|
||
This function is a GNU extension.
|
||
|
||
-- Function: char * strchr (const char *STRING, int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘strchr’ function finds the first occurrence of the byte C
|
||
(converted to a ‘char’) in the string beginning at STRING. The
|
||
return value is a pointer to the located byte, or a null pointer if
|
||
no match was found.
|
||
|
||
For example,
|
||
strchr ("hello, world", 'l')
|
||
⇒ "llo, world"
|
||
strchr ("hello, world", '?')
|
||
⇒ NULL
|
||
|
||
The terminating null byte is considered to be part of the string,
|
||
so you can use this function get a pointer to the end of a string
|
||
by specifying zero as the value of the C argument.
|
||
|
||
When ‘strchr’ returns a null pointer, it does not let you know the
|
||
position of the terminating null byte it has found. If you need
|
||
that information, it is better (but less portable) to use
|
||
‘strchrnul’ than to search for it a second time.
|
||
|
||
-- Function: wchar_t * wcschr (const wchar_t *WSTRING, int WC)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘wcschr’ function finds the first occurrence of the wide
|
||
character WC in the wide string beginning at WSTRING. The return
|
||
value is a pointer to the located wide character, or a null pointer
|
||
if no match was found.
|
||
|
||
The terminating null wide character is considered to be part of the
|
||
wide string, so you can use this function get a pointer to the end
|
||
of a wide string by specifying a null wide character as the value
|
||
of the WC argument. It would be better (but less portable) to use
|
||
‘wcschrnul’ in this case, though.
|
||
|
||
-- Function: char * strchrnul (const char *STRING, int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘strchrnul’ is the same as ‘strchr’ except that if it does not find
|
||
the byte, it returns a pointer to string’s terminating null byte
|
||
rather than a null pointer.
|
||
|
||
This function is a GNU extension.
|
||
|
||
-- Function: wchar_t * wcschrnul (const wchar_t *WSTRING, wchar_t WC)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘wcschrnul’ is the same as ‘wcschr’ except that if it does not find
|
||
the wide character, it returns a pointer to the wide string’s
|
||
terminating null wide character rather than a null pointer.
|
||
|
||
This function is a GNU extension.
|
||
|
||
One useful, but unusual, use of the ‘strchr’ function is when one
|
||
wants to have a pointer pointing to the null byte terminating a string.
|
||
This is often written in this way:
|
||
|
||
s += strlen (s);
|
||
|
||
This is almost optimal but the addition operation duplicated a bit of
|
||
the work already done in the ‘strlen’ function. A better solution is
|
||
this:
|
||
|
||
s = strchr (s, '\0');
|
||
|
||
There is no restriction on the second parameter of ‘strchr’ so it
|
||
could very well also be zero. Those readers thinking very hard about
|
||
this might now point out that the ‘strchr’ function is more expensive
|
||
than the ‘strlen’ function since we have two abort criteria. This is
|
||
right. But in the GNU C Library the implementation of ‘strchr’ is
|
||
optimized in a special way so that ‘strchr’ actually is faster.
|
||
|
||
-- Function: char * strrchr (const char *STRING, int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The function ‘strrchr’ is like ‘strchr’, except that it searches
|
||
backwards from the end of the string STRING (instead of forwards
|
||
from the front).
|
||
|
||
For example,
|
||
strrchr ("hello, world", 'l')
|
||
⇒ "ld"
|
||
|
||
-- Function: wchar_t * wcsrchr (const wchar_t *WSTRING, wchar_t C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The function ‘wcsrchr’ is like ‘wcschr’, except that it searches
|
||
backwards from the end of the string WSTRING (instead of forwards
|
||
from the front).
|
||
|
||
-- Function: char * strstr (const char *HAYSTACK, const char *NEEDLE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This is like ‘strchr’, except that it searches HAYSTACK for a
|
||
substring NEEDLE rather than just a single byte. It returns a
|
||
pointer into the string HAYSTACK that is the first byte of the
|
||
substring, or a null pointer if no match was found. If NEEDLE is
|
||
an empty string, the function returns HAYSTACK.
|
||
|
||
For example,
|
||
strstr ("hello, world", "l")
|
||
⇒ "llo, world"
|
||
strstr ("hello, world", "wo")
|
||
⇒ "world"
|
||
|
||
-- Function: wchar_t * wcsstr (const wchar_t *HAYSTACK, const wchar_t
|
||
*NEEDLE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This is like ‘wcschr’, except that it searches HAYSTACK for a
|
||
substring NEEDLE rather than just a single wide character. It
|
||
returns a pointer into the string HAYSTACK that is the first wide
|
||
character of the substring, or a null pointer if no match was
|
||
found. If NEEDLE is an empty string, the function returns
|
||
HAYSTACK.
|
||
|
||
-- Function: wchar_t * wcswcs (const wchar_t *HAYSTACK, const wchar_t
|
||
*NEEDLE)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘wcswcs’ is a deprecated alias for ‘wcsstr’. This is the name
|
||
originally used in the X/Open Portability Guide before the
|
||
Amendment 1 to ISO C90 was published.
|
||
|
||
-- Function: char * strcasestr (const char *HAYSTACK, const char
|
||
*NEEDLE)
|
||
|
||
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
||
Safety Concepts::.
|
||
|
||
This is like ‘strstr’, except that it ignores case in searching for
|
||
the substring. Like ‘strcasecmp’, it is locale dependent how
|
||
uppercase and lowercase characters are related, and arguments are
|
||
multibyte strings.
|
||
|
||
For example,
|
||
strcasestr ("hello, world", "L")
|
||
⇒ "llo, world"
|
||
strcasestr ("hello, World", "wo")
|
||
⇒ "World"
|
||
|
||
-- Function: void * memmem (const void *HAYSTACK, size_t HAYSTACK-LEN,
|
||
const void *NEEDLE, size_t NEEDLE-LEN)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This is like ‘strstr’, but NEEDLE and HAYSTACK are byte arrays
|
||
rather than strings. NEEDLE-LEN is the length of NEEDLE and
|
||
HAYSTACK-LEN is the length of HAYSTACK.
|
||
|
||
This function is a GNU extension.
|
||
|
||
-- Function: size_t strspn (const char *STRING, const char *SKIPSET)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘strspn’ (“string span”) function returns the length of the
|
||
initial substring of STRING that consists entirely of bytes that
|
||
are members of the set specified by the string SKIPSET. The order
|
||
of the bytes in SKIPSET is not important.
|
||
|
||
For example,
|
||
strspn ("hello, world", "abcdefghijklmnopqrstuvwxyz")
|
||
⇒ 5
|
||
|
||
In a multibyte string, characters consisting of more than one byte
|
||
are not treated as single entities. Each byte is treated
|
||
separately. The function is not locale-dependent.
|
||
|
||
-- Function: size_t wcsspn (const wchar_t *WSTRING, const wchar_t
|
||
*SKIPSET)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘wcsspn’ (“wide character string span”) function returns the
|
||
length of the initial substring of WSTRING that consists entirely
|
||
of wide characters that are members of the set specified by the
|
||
string SKIPSET. The order of the wide characters in SKIPSET is not
|
||
important.
|
||
|
||
-- Function: size_t strcspn (const char *STRING, const char *STOPSET)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘strcspn’ (“string complement span”) function returns the
|
||
length of the initial substring of STRING that consists entirely of
|
||
bytes that are _not_ members of the set specified by the string
|
||
STOPSET. (In other words, it returns the offset of the first byte
|
||
in STRING that is a member of the set STOPSET.)
|
||
|
||
For example,
|
||
strcspn ("hello, world", " \t\n,.;!?")
|
||
⇒ 5
|
||
|
||
In a multibyte string, characters consisting of more than one byte
|
||
are not treated as a single entities. Each byte is treated
|
||
separately. The function is not locale-dependent.
|
||
|
||
-- Function: size_t wcscspn (const wchar_t *WSTRING, const wchar_t
|
||
*STOPSET)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘wcscspn’ (“wide character string complement span”) function
|
||
returns the length of the initial substring of WSTRING that
|
||
consists entirely of wide characters that are _not_ members of the
|
||
set specified by the string STOPSET. (In other words, it returns
|
||
the offset of the first wide character in STRING that is a member
|
||
of the set STOPSET.)
|
||
|
||
-- Function: char * strpbrk (const char *STRING, const char *STOPSET)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘strpbrk’ (“string pointer break”) function is related to
|
||
‘strcspn’, except that it returns a pointer to the first byte in
|
||
STRING that is a member of the set STOPSET instead of the length of
|
||
the initial substring. It returns a null pointer if no such byte
|
||
from STOPSET is found.
|
||
|
||
For example,
|
||
|
||
strpbrk ("hello, world", " \t\n,.;!?")
|
||
⇒ ", world"
|
||
|
||
In a multibyte string, characters consisting of more than one byte
|
||
are not treated as single entities. Each byte is treated
|
||
separately. The function is not locale-dependent.
|
||
|
||
-- Function: wchar_t * wcspbrk (const wchar_t *WSTRING, const wchar_t
|
||
*STOPSET)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘wcspbrk’ (“wide character string pointer break”) function is
|
||
related to ‘wcscspn’, except that it returns a pointer to the first
|
||
wide character in WSTRING that is a member of the set STOPSET
|
||
instead of the length of the initial substring. It returns a null
|
||
pointer if no such wide character from STOPSET is found.
|
||
|
||
5.9.1 Compatibility String Search Functions
|
||
-------------------------------------------
|
||
|
||
-- Function: char * index (const char *STRING, int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘index’ is another name for ‘strchr’; they are exactly the same.
|
||
New code should always use ‘strchr’ since this name is defined in
|
||
ISO C while ‘index’ is a BSD invention which never was available on
|
||
System V derived systems.
|
||
|
||
-- Function: char * rindex (const char *STRING, int C)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘rindex’ is another name for ‘strrchr’; they are exactly the same.
|
||
New code should always use ‘strrchr’ since this name is defined in
|
||
ISO C while ‘rindex’ is a BSD invention which never was available
|
||
on System V derived systems.
|
||
|
||
|
||
File: libc.info, Node: Finding Tokens in a String, Next: Erasing Sensitive Data, Prev: Search Functions, Up: String and Array Utilities
|
||
|
||
5.10 Finding Tokens in a String
|
||
===============================
|
||
|
||
It’s fairly common for programs to have a need to do some simple kinds
|
||
of lexical analysis and parsing, such as splitting a command string up
|
||
into tokens. You can do this with the ‘strtok’ function, declared in
|
||
the header file ‘string.h’.
|
||
|
||
-- Function: char * strtok (char *restrict NEWSTRING, const char
|
||
*restrict DELIMITERS)
|
||
|
||
Preliminary: | MT-Unsafe race:strtok | AS-Unsafe | AC-Safe | *Note
|
||
POSIX Safety Concepts::.
|
||
|
||
A string can be split into tokens by making a series of calls to
|
||
the function ‘strtok’.
|
||
|
||
The string to be split up is passed as the NEWSTRING argument on
|
||
the first call only. The ‘strtok’ function uses this to set up
|
||
some internal state information. Subsequent calls to get
|
||
additional tokens from the same string are indicated by passing a
|
||
null pointer as the NEWSTRING argument. Calling ‘strtok’ with
|
||
another non-null NEWSTRING argument reinitializes the state
|
||
information. It is guaranteed that no other library function ever
|
||
calls ‘strtok’ behind your back (which would mess up this internal
|
||
state information).
|
||
|
||
The DELIMITERS argument is a string that specifies a set of
|
||
delimiters that may surround the token being extracted. All the
|
||
initial bytes that are members of this set are discarded. The
|
||
first byte that is _not_ a member of this set of delimiters marks
|
||
the beginning of the next token. The end of the token is found by
|
||
looking for the next byte that is a member of the delimiter set.
|
||
This byte in the original string NEWSTRING is overwritten by a null
|
||
byte, and the pointer to the beginning of the token in NEWSTRING is
|
||
returned.
|
||
|
||
On the next call to ‘strtok’, the searching begins at the next byte
|
||
beyond the one that marked the end of the previous token. Note
|
||
that the set of delimiters DELIMITERS do not have to be the same on
|
||
every call in a series of calls to ‘strtok’.
|
||
|
||
If the end of the string NEWSTRING is reached, or if the remainder
|
||
of string consists only of delimiter bytes, ‘strtok’ returns a null
|
||
pointer.
|
||
|
||
In a multibyte string, characters consisting of more than one byte
|
||
are not treated as single entities. Each byte is treated
|
||
separately. The function is not locale-dependent.
|
||
|
||
-- Function: wchar_t * wcstok (wchar_t *NEWSTRING, const wchar_t
|
||
*DELIMITERS, wchar_t **SAVE_PTR)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
A string can be split into tokens by making a series of calls to
|
||
the function ‘wcstok’.
|
||
|
||
The string to be split up is passed as the NEWSTRING argument on
|
||
the first call only. The ‘wcstok’ function uses this to set up
|
||
some internal state information. Subsequent calls to get
|
||
additional tokens from the same wide string are indicated by
|
||
passing a null pointer as the NEWSTRING argument, which causes the
|
||
pointer previously stored in SAVE_PTR to be used instead.
|
||
|
||
The DELIMITERS argument is a wide string that specifies a set of
|
||
delimiters that may surround the token being extracted. All the
|
||
initial wide characters that are members of this set are discarded.
|
||
The first wide character that is _not_ a member of this set of
|
||
delimiters marks the beginning of the next token. The end of the
|
||
token is found by looking for the next wide character that is a
|
||
member of the delimiter set. This wide character in the original
|
||
wide string NEWSTRING is overwritten by a null wide character, the
|
||
pointer past the overwritten wide character is saved in SAVE_PTR,
|
||
and the pointer to the beginning of the token in NEWSTRING is
|
||
returned.
|
||
|
||
On the next call to ‘wcstok’, the searching begins at the next wide
|
||
character beyond the one that marked the end of the previous token.
|
||
Note that the set of delimiters DELIMITERS do not have to be the
|
||
same on every call in a series of calls to ‘wcstok’.
|
||
|
||
If the end of the wide string NEWSTRING is reached, or if the
|
||
remainder of string consists only of delimiter wide characters,
|
||
‘wcstok’ returns a null pointer.
|
||
|
||
*Warning:* Since ‘strtok’ and ‘wcstok’ alter the string they is
|
||
parsing, you should always copy the string to a temporary buffer before
|
||
parsing it with ‘strtok’/‘wcstok’ (*note Copying Strings and Arrays::).
|
||
If you allow ‘strtok’ or ‘wcstok’ to modify a string that came from
|
||
another part of your program, you are asking for trouble; that string
|
||
might be used for other purposes after ‘strtok’ or ‘wcstok’ has modified
|
||
it, and it would not have the expected value.
|
||
|
||
The string that you are operating on might even be a constant. Then
|
||
when ‘strtok’ or ‘wcstok’ tries to modify it, your program will get a
|
||
fatal signal for writing in read-only memory. *Note Program Error
|
||
Signals::. Even if the operation of ‘strtok’ or ‘wcstok’ would not
|
||
require a modification of the string (e.g., if there is exactly one
|
||
token) the string can (and in the GNU C Library case will) be modified.
|
||
|
||
This is a special case of a general principle: if a part of a program
|
||
does not have as its purpose the modification of a certain data
|
||
structure, then it is error-prone to modify the data structure
|
||
temporarily.
|
||
|
||
The function ‘strtok’ is not reentrant, whereas ‘wcstok’ is. *Note
|
||
Nonreentrancy::, for a discussion of where and why reentrancy is
|
||
important.
|
||
|
||
Here is a simple example showing the use of ‘strtok’.
|
||
|
||
#include <string.h>
|
||
#include <stddef.h>
|
||
|
||
...
|
||
|
||
const char string[] = "words separated by spaces -- and, punctuation!";
|
||
const char delimiters[] = " .,;:!-";
|
||
char *token, *cp;
|
||
|
||
...
|
||
|
||
cp = strdupa (string); /* Make writable copy. */
|
||
token = strtok (cp, delimiters); /* token => "words" */
|
||
token = strtok (NULL, delimiters); /* token => "separated" */
|
||
token = strtok (NULL, delimiters); /* token => "by" */
|
||
token = strtok (NULL, delimiters); /* token => "spaces" */
|
||
token = strtok (NULL, delimiters); /* token => "and" */
|
||
token = strtok (NULL, delimiters); /* token => "punctuation" */
|
||
token = strtok (NULL, delimiters); /* token => NULL */
|
||
|
||
The GNU C Library contains two more functions for tokenizing a string
|
||
which overcome the limitation of non-reentrancy. They are not available
|
||
available for wide strings.
|
||
|
||
-- Function: char * strtok_r (char *NEWSTRING, const char *DELIMITERS,
|
||
char **SAVE_PTR)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
Just like ‘strtok’, this function splits the string into several
|
||
tokens which can be accessed by successive calls to ‘strtok_r’.
|
||
The difference is that, as in ‘wcstok’, the information about the
|
||
next token is stored in the space pointed to by the third argument,
|
||
SAVE_PTR, which is a pointer to a string pointer. Calling
|
||
‘strtok_r’ with a null pointer for NEWSTRING and leaving SAVE_PTR
|
||
between the calls unchanged does the job without hindering
|
||
reentrancy.
|
||
|
||
This function is defined in POSIX.1 and can be found on many
|
||
systems which support multi-threading.
|
||
|
||
-- Function: char * strsep (char **STRING_PTR, const char *DELIMITER)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This function has a similar functionality as ‘strtok_r’ with the
|
||
NEWSTRING argument replaced by the SAVE_PTR argument. The
|
||
initialization of the moving pointer has to be done by the user.
|
||
Successive calls to ‘strsep’ move the pointer along the tokens
|
||
separated by DELIMITER, returning the address of the next token and
|
||
updating STRING_PTR to point to the beginning of the next token.
|
||
|
||
One difference between ‘strsep’ and ‘strtok_r’ is that if the input
|
||
string contains more than one byte from DELIMITER in a row ‘strsep’
|
||
returns an empty string for each pair of bytes from DELIMITER.
|
||
This means that a program normally should test for ‘strsep’
|
||
returning an empty string before processing it.
|
||
|
||
This function was introduced in 4.3BSD and therefore is widely
|
||
available.
|
||
|
||
Here is how the above example looks like when ‘strsep’ is used.
|
||
|
||
#include <string.h>
|
||
#include <stddef.h>
|
||
|
||
...
|
||
|
||
const char string[] = "words separated by spaces -- and, punctuation!";
|
||
const char delimiters[] = " .,;:!-";
|
||
char *running;
|
||
char *token;
|
||
|
||
...
|
||
|
||
running = strdupa (string);
|
||
token = strsep (&running, delimiters); /* token => "words" */
|
||
token = strsep (&running, delimiters); /* token => "separated" */
|
||
token = strsep (&running, delimiters); /* token => "by" */
|
||
token = strsep (&running, delimiters); /* token => "spaces" */
|
||
token = strsep (&running, delimiters); /* token => "" */
|
||
token = strsep (&running, delimiters); /* token => "" */
|
||
token = strsep (&running, delimiters); /* token => "" */
|
||
token = strsep (&running, delimiters); /* token => "and" */
|
||
token = strsep (&running, delimiters); /* token => "" */
|
||
token = strsep (&running, delimiters); /* token => "punctuation" */
|
||
token = strsep (&running, delimiters); /* token => "" */
|
||
token = strsep (&running, delimiters); /* token => NULL */
|
||
|
||
-- Function: char * basename (const char *FILENAME)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The GNU version of the ‘basename’ function returns the last
|
||
component of the path in FILENAME. This function is the preferred
|
||
usage, since it does not modify the argument, FILENAME, and
|
||
respects trailing slashes. The prototype for ‘basename’ can be
|
||
found in ‘string.h’. Note, this function is overridden by the XPG
|
||
version, if ‘libgen.h’ is included.
|
||
|
||
Example of using GNU ‘basename’:
|
||
|
||
#include <string.h>
|
||
|
||
int
|
||
main (int argc, char *argv[])
|
||
{
|
||
char *prog = basename (argv[0]);
|
||
|
||
if (argc < 2)
|
||
{
|
||
fprintf (stderr, "Usage %s <arg>\n", prog);
|
||
exit (1);
|
||
}
|
||
|
||
...
|
||
}
|
||
|
||
*Portability Note:* This function may produce different results on
|
||
different systems.
|
||
|
||
-- Function: char * basename (char *PATH)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
This is the standard XPG defined ‘basename’. It is similar in
|
||
spirit to the GNU version, but may modify the PATH by removing
|
||
trailing ’/’ bytes. If the PATH is made up entirely of ’/’ bytes,
|
||
then "/" will be returned. Also, if PATH is ‘NULL’ or an empty
|
||
string, then "." is returned. The prototype for the XPG version
|
||
can be found in ‘libgen.h’.
|
||
|
||
Example of using XPG ‘basename’:
|
||
|
||
#include <libgen.h>
|
||
|
||
int
|
||
main (int argc, char *argv[])
|
||
{
|
||
char *prog;
|
||
char *path = strdupa (argv[0]);
|
||
|
||
prog = basename (path);
|
||
|
||
if (argc < 2)
|
||
{
|
||
fprintf (stderr, "Usage %s <arg>\n", prog);
|
||
exit (1);
|
||
}
|
||
|
||
...
|
||
|
||
}
|
||
|
||
-- Function: char * dirname (char *PATH)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The ‘dirname’ function is the compliment to the XPG version of
|
||
‘basename’. It returns the parent directory of the file specified
|
||
by PATH. If PATH is ‘NULL’, an empty string, or contains no ’/’
|
||
bytes, then "." is returned. The prototype for this function can
|
||
be found in ‘libgen.h’.
|
||
|
||
|
||
File: libc.info, Node: Erasing Sensitive Data, Next: Shuffling Bytes, Prev: Finding Tokens in a String, Up: String and Array Utilities
|
||
|
||
5.11 Erasing Sensitive Data
|
||
===========================
|
||
|
||
Sensitive data, such as cryptographic keys, should be erased from memory
|
||
after use, to reduce the risk that a bug will expose it to the outside
|
||
world. However, compiler optimizations may determine that an erasure
|
||
operation is “unnecessary,” and remove it from the generated code,
|
||
because no _correct_ program could access the variable or heap object
|
||
containing the sensitive data after it’s deallocated. Since erasure is
|
||
a precaution against bugs, this optimization is inappropriate.
|
||
|
||
The function ‘explicit_bzero’ erases a block of memory, and
|
||
guarantees that the compiler will not remove the erasure as
|
||
“unnecessary.”
|
||
|
||
#include <string.h>
|
||
|
||
extern void encrypt (const char *key, const char *in,
|
||
char *out, size_t n);
|
||
extern void genkey (const char *phrase, char *key);
|
||
|
||
void encrypt_with_phrase (const char *phrase, const char *in,
|
||
char *out, size_t n)
|
||
{
|
||
char key[16];
|
||
genkey (phrase, key);
|
||
encrypt (key, in, out, n);
|
||
explicit_bzero (key, 16);
|
||
}
|
||
|
||
In this example, if ‘memset’, ‘bzero’, or a hand-written loop had been
|
||
used, the compiler might remove them as “unnecessary.”
|
||
|
||
*Warning:* ‘explicit_bzero’ does not guarantee that sensitive data is
|
||
_completely_ erased from the computer’s memory. There may be copies in
|
||
temporary storage areas, such as registers and “scratch” stack space;
|
||
since these are invisible to the source code, a library function cannot
|
||
erase them.
|
||
|
||
Also, ‘explicit_bzero’ only operates on RAM. If a sensitive data
|
||
object never needs to have its address taken other than to call
|
||
‘explicit_bzero’, it might be stored entirely in CPU registers _until_
|
||
the call to ‘explicit_bzero’. Then it will be copied into RAM, the copy
|
||
will be erased, and the original will remain intact. Data in RAM is
|
||
more likely to be exposed by a bug than data in registers, so this
|
||
creates a brief window where the data is at greater risk of exposure
|
||
than it would have been if the program didn’t try to erase it at all.
|
||
|
||
Declaring sensitive variables as ‘volatile’ will make both the above
|
||
problems _worse_; a ‘volatile’ variable will be stored in memory for its
|
||
entire lifetime, and the compiler will make _more_ copies of it than it
|
||
would otherwise have. Attempting to erase a normal variable “by hand”
|
||
through a ‘volatile’-qualified pointer doesn’t work at all—because the
|
||
variable itself is not ‘volatile’, some compilers will ignore the
|
||
qualification on the pointer and remove the erasure anyway.
|
||
|
||
Having said all that, in most situations, using ‘explicit_bzero’ is
|
||
better than not using it. At present, the only way to do a more
|
||
thorough job is to write the entire sensitive operation in assembly
|
||
language. We anticipate that future compilers will recognize calls to
|
||
‘explicit_bzero’ and take appropriate steps to erase all the copies of
|
||
the affected data, whereever they may be.
|
||
|
||
-- Function: void explicit_bzero (void *BLOCK, size_t LEN)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘explicit_bzero’ writes zero into LEN bytes of memory beginning at
|
||
BLOCK, just as ‘bzero’ would. The zeroes are always written, even
|
||
if the compiler could determine that this is “unnecessary” because
|
||
no correct program could read them back.
|
||
|
||
*Note:* The _only_ optimization that ‘explicit_bzero’ disables is
|
||
removal of “unnecessary” writes to memory. The compiler can
|
||
perform all the other optimizations that it could for a call to
|
||
‘memset’. For instance, it may replace the function call with
|
||
inline memory writes, and it may assume that BLOCK cannot be a null
|
||
pointer.
|
||
|
||
*Portability Note:* This function first appeared in OpenBSD 5.5 and
|
||
has not been standardized. Other systems may provide the same
|
||
functionality under a different name, such as ‘explicit_memset’,
|
||
‘memset_s’, or ‘SecureZeroMemory’.
|
||
|
||
The GNU C Library declares this function in ‘string.h’, but on
|
||
other systems it may be in ‘strings.h’ instead.
|
||
|
||
|
||
File: libc.info, Node: Shuffling Bytes, Next: Obfuscating Data, Prev: Erasing Sensitive Data, Up: String and Array Utilities
|
||
|
||
5.12 Shuffling Bytes
|
||
====================
|
||
|
||
The function below addresses the perennial programming quandary: “How do
|
||
I take good data in string form and painlessly turn it into garbage?”
|
||
This is not a difficult thing to code for oneself, but the authors of
|
||
the GNU C Library wish to make it as convenient as possible.
|
||
|
||
To _erase_ data, use ‘explicit_bzero’ (*note Erasing Sensitive
|
||
Data::); to obfuscate it reversibly, use ‘memfrob’ (*note Obfuscating
|
||
Data::).
|
||
|
||
-- Function: char * strfry (char *STRING)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
‘strfry’ performs an in-place shuffle on STRING. Each character is
|
||
swapped to a position selected at random, within the portion of the
|
||
string starting with the character’s original position. (This is
|
||
the Fisher-Yates algorithm for unbiased shuffling.)
|
||
|
||
Calling ‘strfry’ will not disturb any of the random number
|
||
generators that have global state (*note Pseudo-Random Numbers::).
|
||
|
||
The return value of ‘strfry’ is always STRING.
|
||
|
||
*Portability Note:* This function is unique to the GNU C Library.
|
||
It is declared in ‘string.h’.
|
||
|
||
|
||
File: libc.info, Node: Obfuscating Data, Next: Encode Binary Data, Prev: Shuffling Bytes, Up: String and Array Utilities
|
||
|
||
5.13 Obfuscating Data
|
||
=====================
|
||
|
||
The ‘memfrob’ function reversibly obfuscates an array of binary data.
|
||
This is not true encryption; the obfuscated data still bears a clear
|
||
relationship to the original, and no secret key is required to undo the
|
||
obfuscation. It is analogous to the “Rot13” cipher used on Usenet for
|
||
obscuring offensive jokes, spoilers for works of fiction, and so on, but
|
||
it can be applied to arbitrary binary data.
|
||
|
||
Programs that need true encryption—a transformation that completely
|
||
obscures the original and cannot be reversed without knowledge of a
|
||
secret key—should use a dedicated cryptography library, such as
|
||
libgcrypt.
|
||
|
||
Programs that need to _destroy_ data should use ‘explicit_bzero’
|
||
(*note Erasing Sensitive Data::), or possibly ‘strfry’ (*note Shuffling
|
||
Bytes::).
|
||
|
||
-- Function: void * memfrob (void *MEM, size_t LENGTH)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The function ‘memfrob’ obfuscates LENGTH bytes of data beginning at
|
||
MEM, in place. Each byte is bitwise xor-ed with the binary pattern
|
||
00101010 (hexadecimal 0x2A). The return value is always MEM.
|
||
|
||
‘memfrob’ a second time on the same data returns it to its original
|
||
state.
|
||
|
||
*Portability Note:* This function is unique to the GNU C Library.
|
||
It is declared in ‘string.h’.
|
||
|
||
|
||
File: libc.info, Node: Encode Binary Data, Next: Argz and Envz Vectors, Prev: Obfuscating Data, Up: String and Array Utilities
|
||
|
||
5.14 Encode Binary Data
|
||
=======================
|
||
|
||
To store or transfer binary data in environments which only support text
|
||
one has to encode the binary data by mapping the input bytes to bytes in
|
||
the range allowed for storing or transferring. SVID systems (and
|
||
nowadays XPG compliant systems) provide minimal support for this task.
|
||
|
||
-- Function: char * l64a (long int N)
|
||
|
||
Preliminary: | MT-Unsafe race:l64a | AS-Unsafe | AC-Safe | *Note
|
||
POSIX Safety Concepts::.
|
||
|
||
This function encodes a 32-bit input value using bytes from the
|
||
basic character set. It returns a pointer to a 7 byte buffer which
|
||
contains an encoded version of N. To encode a series of bytes the
|
||
user must copy the returned string to a destination buffer. It
|
||
returns the empty string if N is zero, which is somewhat bizarre
|
||
but mandated by the standard.
|
||
*Warning:* Since a static buffer is used this function should not
|
||
be used in multi-threaded programs. There is no thread-safe
|
||
alternative to this function in the C library.
|
||
*Compatibility Note:* The XPG standard states that the return value
|
||
of ‘l64a’ is undefined if N is negative. In the GNU
|
||
implementation, ‘l64a’ treats its argument as unsigned, so it will
|
||
return a sensible encoding for any nonzero N; however, portable
|
||
programs should not rely on this.
|
||
|
||
To encode a large buffer ‘l64a’ must be called in a loop, once for
|
||
each 32-bit word of the buffer. For example, one could do
|
||
something like this:
|
||
|
||
char *
|
||
encode (const void *buf, size_t len)
|
||
{
|
||
/* We know in advance how long the buffer has to be. */
|
||
unsigned char *in = (unsigned char *) buf;
|
||
char *out = malloc (6 + ((len + 3) / 4) * 6 + 1);
|
||
char *cp = out, *p;
|
||
|
||
/* Encode the length. */
|
||
/* Using ‘htonl’ is necessary so that the data can be
|
||
decoded even on machines with different byte order.
|
||
‘l64a’ can return a string shorter than 6 bytes, so
|
||
we pad it with encoding of 0 ('.') at the end by
|
||
hand. */
|
||
|
||
p = stpcpy (cp, l64a (htonl (len)));
|
||
cp = mempcpy (p, "......", 6 - (p - cp));
|
||
|
||
while (len > 3)
|
||
{
|
||
unsigned long int n = *in++;
|
||
n = (n << 8) | *in++;
|
||
n = (n << 8) | *in++;
|
||
n = (n << 8) | *in++;
|
||
len -= 4;
|
||
p = stpcpy (cp, l64a (htonl (n)));
|
||
cp = mempcpy (p, "......", 6 - (p - cp));
|
||
}
|
||
if (len > 0)
|
||
{
|
||
unsigned long int n = *in++;
|
||
if (--len > 0)
|
||
{
|
||
n = (n << 8) | *in++;
|
||
if (--len > 0)
|
||
n = (n << 8) | *in;
|
||
}
|
||
cp = stpcpy (cp, l64a (htonl (n)));
|
||
}
|
||
*cp = '\0';
|
||
return out;
|
||
}
|
||
|
||
It is strange that the library does not provide the complete
|
||
functionality needed but so be it.
|
||
|
||
To decode data produced with ‘l64a’ the following function should be
|
||
used.
|
||
|
||
-- Function: long int a64l (const char *STRING)
|
||
|
||
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
||
Concepts::.
|
||
|
||
The parameter STRING should contain a string which was produced by
|
||
a call to ‘l64a’. The function processes at least 6 bytes of this
|
||
string, and decodes the bytes it finds according to the table
|
||
below. It stops decoding when it finds a byte not in the table,
|
||
rather like ‘atoi’; if you have a buffer which has been broken into
|
||
lines, you must be careful to skip over the end-of-line bytes.
|
||
|
||
The decoded number is returned as a ‘long int’ value.
|
||
|
||
The ‘l64a’ and ‘a64l’ functions use a base 64 encoding, in which each
|
||
byte of an encoded string represents six bits of an input word. These
|
||
symbols are used for the base 64 digits:
|
||
|
||
0 1 2 3 4 5 6 7
|
||
0 ‘.’ ‘/’ ‘0’ ‘1’ ‘2’ ‘3’ ‘4’ ‘5’
|
||
8 ‘6’ ‘7’ ‘8’ ‘9’ ‘A’ ‘B’ ‘C’ ‘D’
|
||
16 ‘E’ ‘F’ ‘G’ ‘H’ ‘I’ ‘J’ ‘K’ ‘L’
|
||
24 ‘M’ ‘N’ ‘O’ ‘P’ ‘Q’ ‘R’ ‘S’ ‘T’
|
||
32 ‘U’ ‘V’ ‘W’ ‘X’ ‘Y’ ‘Z’ ‘a’ ‘b’
|
||
40 ‘c’ ‘d’ ‘e’ ‘f’ ‘g’ ‘h’ ‘i’ ‘j’
|
||
48 ‘k’ ‘l’ ‘m’ ‘n’ ‘o’ ‘p’ ‘q’ ‘r’
|
||
56 ‘s’ ‘t’ ‘u’ ‘v’ ‘w’ ‘x’ ‘y’ ‘z’
|
||
|
||
This encoding scheme is not standard. There are some other encoding
|
||
methods which are much more widely used (UU encoding, MIME encoding).
|
||
Generally, it is better to use one of these encodings.
|
||
|