9060 lines
369 KiB
Plaintext
9060 lines
369 KiB
Plaintext
|
This is
|
|||
|
/tmp/dgboter/bbs/rhev-vm7--rhe6x86_64/buildbot/rhe6x86_64--arm-none-linux-gnueabihf/build/build-arm-none-linux-gnueabihf/obj/glibc/manual/libc.info,
|
|||
|
produced by makeinfo version 4.13 from libc.texinfo.
|
|||
|
|
|||
|
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_DIRECTORY: (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.
|
|||
|
* getcpu: (libc)CPU Affinity.
|
|||
|
* getcwd: (libc)Working Directory.
|
|||
|
* getdate: (libc)General Time String Parsing.
|
|||
|
* getdate_r: (libc)General Time String Parsing.
|
|||
|
* getdelim: (libc)Line Input.
|
|||
|
* getdents64: (libc)Low-level Directory Access.
|
|||
|
* 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.
|
|||
|
* gettid: (libc)Process Identification.
|
|||
|
* 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_cond_clockwait: (libc)Default Thread Attributes.
|
|||
|
* 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_rwlock_clockrdlock: (libc)Default Thread Attributes.
|
|||
|
* pthread_rwlock_clockwrlock: (libc)Default Thread Attributes.
|
|||
|
* 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_clockwait: (libc)Default Thread Attributes.
|
|||
|
* 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.
|
|||
|
* tgkill: (libc)Signaling Another Process.
|
|||
|
* 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.
|
|||
|
* twalk_r: (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
|
|||
|
|
|||
|
This file documents the GNU C Library.
|
|||
|
|
|||
|
This is `The GNU C Library Reference Manual', for version 2.30
|
|||
|
(GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)).
|
|||
|
|
|||
|
Copyright (C) 1993-2019 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."
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Locale Information, Next: Formatting Numbers, Prev: Locale Names, Up: Locales
|
|||
|
|
|||
|
7.7 Accessing Locale Information
|
|||
|
================================
|
|||
|
|
|||
|
There are several ways to access locale information. The simplest way
|
|||
|
is to let the C library itself do the work. Several of the functions
|
|||
|
in this library implicitly access the locale data, and use what
|
|||
|
information is provided by the currently selected locale. This is how
|
|||
|
the locale model is meant to work normally.
|
|||
|
|
|||
|
As an example take the `strftime' function, which is meant to nicely
|
|||
|
format date and time information (*note Formatting Calendar Time::).
|
|||
|
Part of the standard information contained in the `LC_TIME' category is
|
|||
|
the names of the months. Instead of requiring the programmer to take
|
|||
|
care of providing the translations the `strftime' function does this
|
|||
|
all by itself. `%A' in the format string is replaced by the
|
|||
|
appropriate weekday name of the locale currently selected by `LC_TIME'.
|
|||
|
This is an easy example, and wherever possible functions do things
|
|||
|
automatically in this way.
|
|||
|
|
|||
|
But there are quite often situations when there is simply no function
|
|||
|
to perform the task, or it is simply not possible to do the work
|
|||
|
automatically. For these cases it is necessary to access the
|
|||
|
information in the locale directly. To do this the C library provides
|
|||
|
two functions: `localeconv' and `nl_langinfo'. The former is part of
|
|||
|
ISO C and therefore portable, but has a brain-damaged interface. The
|
|||
|
second is part of the Unix interface and is portable in as far as the
|
|||
|
system follows the Unix standards.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* The Lame Way to Locale Data:: ISO C's `localeconv'.
|
|||
|
* The Elegant and Fast Way:: X/Open's `nl_langinfo'.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: The Lame Way to Locale Data, Next: The Elegant and Fast Way, Up: Locale Information
|
|||
|
|
|||
|
7.7.1 `localeconv': It is portable but ...
|
|||
|
------------------------------------------
|
|||
|
|
|||
|
Together with the `setlocale' function the ISO C people invented the
|
|||
|
`localeconv' function. It is a masterpiece of poor design. It is
|
|||
|
expensive to use, not extensible, and not generally usable as it
|
|||
|
provides access to only `LC_MONETARY' and `LC_NUMERIC' related
|
|||
|
information. Nevertheless, if it is applicable to a given situation it
|
|||
|
should be used since it is very portable. The function `strfmon'
|
|||
|
formats monetary amounts according to the selected locale using this
|
|||
|
information.
|
|||
|
|
|||
|
-- Function: struct lconv * localeconv (void)
|
|||
|
Preliminary: | MT-Unsafe race:localeconv locale | AS-Unsafe |
|
|||
|
AC-Safe | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `localeconv' function returns a pointer to a structure whose
|
|||
|
components contain information about how numeric and monetary
|
|||
|
values should be formatted in the current locale.
|
|||
|
|
|||
|
You should not modify the structure or its contents. The
|
|||
|
structure might be overwritten by subsequent calls to
|
|||
|
`localeconv', or by calls to `setlocale', but no other function in
|
|||
|
the library overwrites this value.
|
|||
|
|
|||
|
-- Data Type: struct lconv
|
|||
|
`localeconv''s return value is of this data type. Its elements are
|
|||
|
described in the following subsections.
|
|||
|
|
|||
|
If a member of the structure `struct lconv' has type `char', and the
|
|||
|
value is `CHAR_MAX', it means that the current locale has no value for
|
|||
|
that parameter.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* General Numeric:: Parameters for formatting numbers and
|
|||
|
currency amounts.
|
|||
|
* Currency Symbol:: How to print the symbol that identifies an
|
|||
|
amount of money (e.g. `$').
|
|||
|
* Sign of Money Amount:: How to print the (positive or negative) sign
|
|||
|
for a monetary amount, if one exists.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: General Numeric, Next: Currency Symbol, Up: The Lame Way to Locale Data
|
|||
|
|
|||
|
7.7.1.1 Generic Numeric Formatting Parameters
|
|||
|
.............................................
|
|||
|
|
|||
|
These are the standard members of `struct lconv'; there may be others.
|
|||
|
|
|||
|
`char *decimal_point'
|
|||
|
`char *mon_decimal_point'
|
|||
|
These are the decimal-point separators used in formatting
|
|||
|
non-monetary and monetary quantities, respectively. In the `C'
|
|||
|
locale, the value of `decimal_point' is `"."', and the value of
|
|||
|
`mon_decimal_point' is `""'.
|
|||
|
|
|||
|
`char *thousands_sep'
|
|||
|
`char *mon_thousands_sep'
|
|||
|
These are the separators used to delimit groups of digits to the
|
|||
|
left of the decimal point in formatting non-monetary and monetary
|
|||
|
quantities, respectively. In the `C' locale, both members have a
|
|||
|
value of `""' (the empty string).
|
|||
|
|
|||
|
`char *grouping'
|
|||
|
`char *mon_grouping'
|
|||
|
These are strings that specify how to group the digits to the left
|
|||
|
of the decimal point. `grouping' applies to non-monetary
|
|||
|
quantities and `mon_grouping' applies to monetary quantities. Use
|
|||
|
either `thousands_sep' or `mon_thousands_sep' to separate the digit
|
|||
|
groups.
|
|||
|
|
|||
|
Each member of these strings is to be interpreted as an integer
|
|||
|
value of type `char'. Successive numbers (from left to right)
|
|||
|
give the sizes of successive groups (from right to left, starting
|
|||
|
at the decimal point.) The last member is either `0', in which
|
|||
|
case the previous member is used over and over again for all the
|
|||
|
remaining groups, or `CHAR_MAX', in which case there is no more
|
|||
|
grouping--or, put another way, any remaining digits form one large
|
|||
|
group without separators.
|
|||
|
|
|||
|
For example, if `grouping' is `"\04\03\02"', the correct grouping
|
|||
|
for the number `123456787654321' is `12', `34', `56', `78', `765',
|
|||
|
`4321'. This uses a group of 4 digits at the end, preceded by a
|
|||
|
group of 3 digits, preceded by groups of 2 digits (as many as
|
|||
|
needed). With a separator of `,', the number would be printed as
|
|||
|
`12,34,56,78,765,4321'.
|
|||
|
|
|||
|
A value of `"\03"' indicates repeated groups of three digits, as
|
|||
|
normally used in the U.S.
|
|||
|
|
|||
|
In the standard `C' locale, both `grouping' and `mon_grouping'
|
|||
|
have a value of `""'. This value specifies no grouping at all.
|
|||
|
|
|||
|
`char int_frac_digits'
|
|||
|
`char frac_digits'
|
|||
|
These are small integers indicating how many fractional digits (to
|
|||
|
the right of the decimal point) should be displayed in a monetary
|
|||
|
value in international and local formats, respectively. (Most
|
|||
|
often, both members have the same value.)
|
|||
|
|
|||
|
In the standard `C' locale, both of these members have the value
|
|||
|
`CHAR_MAX', meaning "unspecified". The ISO standard doesn't say
|
|||
|
what to do when you find this value; we recommend printing no
|
|||
|
fractional digits. (This locale also specifies the empty string
|
|||
|
for `mon_decimal_point', so printing any fractional digits would be
|
|||
|
confusing!)
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Currency Symbol, Next: Sign of Money Amount, Prev: General Numeric, Up: The Lame Way to Locale Data
|
|||
|
|
|||
|
7.7.1.2 Printing the Currency Symbol
|
|||
|
....................................
|
|||
|
|
|||
|
These members of the `struct lconv' structure specify how to print the
|
|||
|
symbol to identify a monetary value--the international analog of `$'
|
|||
|
for US dollars.
|
|||
|
|
|||
|
Each country has two standard currency symbols. The "local currency
|
|||
|
symbol" is used commonly within the country, while the "international
|
|||
|
currency symbol" is used internationally to refer to that country's
|
|||
|
currency when it is necessary to indicate the country unambiguously.
|
|||
|
|
|||
|
For example, many countries use the dollar as their monetary unit,
|
|||
|
and when dealing with international currencies it's important to specify
|
|||
|
that one is dealing with (say) Canadian dollars instead of U.S. dollars
|
|||
|
or Australian dollars. But when the context is known to be Canada,
|
|||
|
there is no need to make this explicit--dollar amounts are implicitly
|
|||
|
assumed to be in Canadian dollars.
|
|||
|
|
|||
|
`char *currency_symbol'
|
|||
|
The local currency symbol for the selected locale.
|
|||
|
|
|||
|
In the standard `C' locale, this member has a value of `""' (the
|
|||
|
empty string), meaning "unspecified". The ISO standard doesn't
|
|||
|
say what to do when you find this value; we recommend you simply
|
|||
|
print the empty string as you would print any other string pointed
|
|||
|
to by this variable.
|
|||
|
|
|||
|
`char *int_curr_symbol'
|
|||
|
The international currency symbol for the selected locale.
|
|||
|
|
|||
|
The value of `int_curr_symbol' should normally consist of a
|
|||
|
three-letter abbreviation determined by the international standard
|
|||
|
`ISO 4217 Codes for the Representation of Currency and Funds',
|
|||
|
followed by a one-character separator (often a space).
|
|||
|
|
|||
|
In the standard `C' locale, this member has a value of `""' (the
|
|||
|
empty string), meaning "unspecified". We recommend you simply
|
|||
|
print the empty string as you would print any other string pointed
|
|||
|
to by this variable.
|
|||
|
|
|||
|
`char p_cs_precedes'
|
|||
|
`char n_cs_precedes'
|
|||
|
`char int_p_cs_precedes'
|
|||
|
`char int_n_cs_precedes'
|
|||
|
These members are `1' if the `currency_symbol' or
|
|||
|
`int_curr_symbol' strings should precede the value of a monetary
|
|||
|
amount, or `0' if the strings should follow the value. The
|
|||
|
`p_cs_precedes' and `int_p_cs_precedes' members apply to positive
|
|||
|
amounts (or zero), and the `n_cs_precedes' and `int_n_cs_precedes'
|
|||
|
members apply to negative amounts.
|
|||
|
|
|||
|
In the standard `C' locale, all of these members have a value of
|
|||
|
`CHAR_MAX', meaning "unspecified". The ISO standard doesn't say
|
|||
|
what to do when you find this value. We recommend printing the
|
|||
|
currency symbol before the amount, which is right for most
|
|||
|
countries. In other words, treat all nonzero values alike in
|
|||
|
these members.
|
|||
|
|
|||
|
The members with the `int_' prefix apply to the `int_curr_symbol'
|
|||
|
while the other two apply to `currency_symbol'.
|
|||
|
|
|||
|
`char p_sep_by_space'
|
|||
|
`char n_sep_by_space'
|
|||
|
`char int_p_sep_by_space'
|
|||
|
`char int_n_sep_by_space'
|
|||
|
These members are `1' if a space should appear between the
|
|||
|
`currency_symbol' or `int_curr_symbol' strings and the amount, or
|
|||
|
`0' if no space should appear. The `p_sep_by_space' and
|
|||
|
`int_p_sep_by_space' members apply to positive amounts (or zero),
|
|||
|
and the `n_sep_by_space' and `int_n_sep_by_space' members apply to
|
|||
|
negative amounts.
|
|||
|
|
|||
|
In the standard `C' locale, all of these members have a value of
|
|||
|
`CHAR_MAX', meaning "unspecified". The ISO standard doesn't say
|
|||
|
what you should do when you find this value; we suggest you treat
|
|||
|
it as 1 (print a space). In other words, treat all nonzero values
|
|||
|
alike in these members.
|
|||
|
|
|||
|
The members with the `int_' prefix apply to the `int_curr_symbol'
|
|||
|
while the other two apply to `currency_symbol'. There is one
|
|||
|
specialty with the `int_curr_symbol', though. Since all legal
|
|||
|
values contain a space at the end of the string one either prints
|
|||
|
this space (if the currency symbol must appear in front and must
|
|||
|
be separated) or one has to avoid printing this character at all
|
|||
|
(especially when at the end of the string).
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Sign of Money Amount, Prev: Currency Symbol, Up: The Lame Way to Locale Data
|
|||
|
|
|||
|
7.7.1.3 Printing the Sign of a Monetary Amount
|
|||
|
..............................................
|
|||
|
|
|||
|
These members of the `struct lconv' structure specify how to print the
|
|||
|
sign (if any) of a monetary value.
|
|||
|
|
|||
|
`char *positive_sign'
|
|||
|
`char *negative_sign'
|
|||
|
These are strings used to indicate positive (or zero) and negative
|
|||
|
monetary quantities, respectively.
|
|||
|
|
|||
|
In the standard `C' locale, both of these members have a value of
|
|||
|
`""' (the empty string), meaning "unspecified".
|
|||
|
|
|||
|
The ISO standard doesn't say what to do when you find this value;
|
|||
|
we recommend printing `positive_sign' as you find it, even if it is
|
|||
|
empty. For a negative value, print `negative_sign' as you find it
|
|||
|
unless both it and `positive_sign' are empty, in which case print
|
|||
|
`-' instead. (Failing to indicate the sign at all seems rather
|
|||
|
unreasonable.)
|
|||
|
|
|||
|
`char p_sign_posn'
|
|||
|
`char n_sign_posn'
|
|||
|
`char int_p_sign_posn'
|
|||
|
`char int_n_sign_posn'
|
|||
|
These members are small integers that indicate how to position the
|
|||
|
sign for nonnegative and negative monetary quantities,
|
|||
|
respectively. (The string used for the sign is what was specified
|
|||
|
with `positive_sign' or `negative_sign'.) The possible values are
|
|||
|
as follows:
|
|||
|
|
|||
|
`0'
|
|||
|
The currency symbol and quantity should be surrounded by
|
|||
|
parentheses.
|
|||
|
|
|||
|
`1'
|
|||
|
Print the sign string before the quantity and currency symbol.
|
|||
|
|
|||
|
`2'
|
|||
|
Print the sign string after the quantity and currency symbol.
|
|||
|
|
|||
|
`3'
|
|||
|
Print the sign string right before the currency symbol.
|
|||
|
|
|||
|
`4'
|
|||
|
Print the sign string right after the currency symbol.
|
|||
|
|
|||
|
`CHAR_MAX'
|
|||
|
"Unspecified". Both members have this value in the standard
|
|||
|
`C' locale.
|
|||
|
|
|||
|
The ISO standard doesn't say what you should do when the value is
|
|||
|
`CHAR_MAX'. We recommend you print the sign after the currency
|
|||
|
symbol.
|
|||
|
|
|||
|
The members with the `int_' prefix apply to the `int_curr_symbol'
|
|||
|
while the other two apply to `currency_symbol'.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: The Elegant and Fast Way, Prev: The Lame Way to Locale Data, Up: Locale Information
|
|||
|
|
|||
|
7.7.2 Pinpoint Access to Locale Data
|
|||
|
------------------------------------
|
|||
|
|
|||
|
When writing the X/Open Portability Guide the authors realized that the
|
|||
|
`localeconv' function is not enough to provide reasonable access to
|
|||
|
locale information. The information which was meant to be available in
|
|||
|
the locale (as later specified in the POSIX.1 standard) requires more
|
|||
|
ways to access it. Therefore the `nl_langinfo' function was introduced.
|
|||
|
|
|||
|
-- Function: char * nl_langinfo (nl_item ITEM)
|
|||
|
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
|
|||
|
Safety Concepts::.
|
|||
|
|
|||
|
The `nl_langinfo' function can be used to access individual
|
|||
|
elements of the locale categories. Unlike the `localeconv'
|
|||
|
function, which returns all the information, `nl_langinfo' lets
|
|||
|
the caller select what information it requires. This is very fast
|
|||
|
and it is not a problem to call this function multiple times.
|
|||
|
|
|||
|
A second advantage is that in addition to the numeric and monetary
|
|||
|
formatting information, information from the `LC_TIME' and
|
|||
|
`LC_MESSAGES' categories is available.
|
|||
|
|
|||
|
The type `nl_item' is defined in `nl_types.h'. The argument ITEM
|
|||
|
is a numeric value defined in the header `langinfo.h'. The X/Open
|
|||
|
standard defines the following values:
|
|||
|
|
|||
|
`CODESET'
|
|||
|
`nl_langinfo' returns a string with the name of the coded
|
|||
|
character set used in the selected locale.
|
|||
|
|
|||
|
`ABDAY_1'
|
|||
|
`ABDAY_2'
|
|||
|
`ABDAY_3'
|
|||
|
`ABDAY_4'
|
|||
|
`ABDAY_5'
|
|||
|
`ABDAY_6'
|
|||
|
`ABDAY_7'
|
|||
|
`nl_langinfo' returns the abbreviated weekday name. `ABDAY_1'
|
|||
|
corresponds to Sunday.
|
|||
|
|
|||
|
`DAY_1'
|
|||
|
`DAY_2'
|
|||
|
`DAY_3'
|
|||
|
`DAY_4'
|
|||
|
`DAY_5'
|
|||
|
`DAY_6'
|
|||
|
`DAY_7'
|
|||
|
Similar to `ABDAY_1', etc., but here the return value is the
|
|||
|
unabbreviated weekday name.
|
|||
|
|
|||
|
`ABMON_1'
|
|||
|
`ABMON_2'
|
|||
|
`ABMON_3'
|
|||
|
`ABMON_4'
|
|||
|
`ABMON_5'
|
|||
|
`ABMON_6'
|
|||
|
`ABMON_7'
|
|||
|
`ABMON_8'
|
|||
|
`ABMON_9'
|
|||
|
`ABMON_10'
|
|||
|
`ABMON_11'
|
|||
|
`ABMON_12'
|
|||
|
The return value is the abbreviated name of the month, in the
|
|||
|
grammatical form used when the month forms part of a complete
|
|||
|
date. `ABMON_1' corresponds to January.
|
|||
|
|
|||
|
`MON_1'
|
|||
|
`MON_2'
|
|||
|
`MON_3'
|
|||
|
`MON_4'
|
|||
|
`MON_5'
|
|||
|
`MON_6'
|
|||
|
`MON_7'
|
|||
|
`MON_8'
|
|||
|
`MON_9'
|
|||
|
`MON_10'
|
|||
|
`MON_11'
|
|||
|
`MON_12'
|
|||
|
Similar to `ABMON_1', etc., but here the month names are not
|
|||
|
abbreviated. Here the first value `MON_1' also corresponds to
|
|||
|
January.
|
|||
|
|
|||
|
`ALTMON_1'
|
|||
|
`ALTMON_2'
|
|||
|
`ALTMON_3'
|
|||
|
`ALTMON_4'
|
|||
|
`ALTMON_5'
|
|||
|
`ALTMON_6'
|
|||
|
`ALTMON_7'
|
|||
|
`ALTMON_8'
|
|||
|
`ALTMON_9'
|
|||
|
`ALTMON_10'
|
|||
|
`ALTMON_11'
|
|||
|
`ALTMON_12'
|
|||
|
Similar to `MON_1', etc., but here the month names are in the
|
|||
|
grammatical form used when the month is named by itself. The
|
|||
|
`strftime' functions use these month names for the conversion
|
|||
|
specifier `%OB' (*note Formatting Calendar Time::).
|
|||
|
|
|||
|
Note that not all languages need two different forms of the
|
|||
|
month names, so the strings returned for `MON_...' and
|
|||
|
`ALTMON_...' may or may not be the same, depending on the
|
|||
|
locale.
|
|||
|
|
|||
|
*NB:* `ABALTMON_...' constants corresponding to the `%Ob'
|
|||
|
conversion specifier are not currently provided, but are
|
|||
|
expected to be in a future release. In the meantime, it is
|
|||
|
possible to use `_NL_ABALTMON_...'.
|
|||
|
|
|||
|
`AM_STR'
|
|||
|
`PM_STR'
|
|||
|
The return values are strings which can be used in the
|
|||
|
representation of time as an hour from 1 to 12 plus an am/pm
|
|||
|
specifier.
|
|||
|
|
|||
|
Note that in locales which do not use this time representation
|
|||
|
these strings might be empty, in which case the am/pm format
|
|||
|
cannot be used at all.
|
|||
|
|
|||
|
`D_T_FMT'
|
|||
|
The return value can be used as a format string for
|
|||
|
`strftime' to represent time and date in a locale-specific
|
|||
|
way.
|
|||
|
|
|||
|
`D_FMT'
|
|||
|
The return value can be used as a format string for
|
|||
|
`strftime' to represent a date in a locale-specific way.
|
|||
|
|
|||
|
`T_FMT'
|
|||
|
The return value can be used as a format string for
|
|||
|
`strftime' to represent time in a locale-specific way.
|
|||
|
|
|||
|
`T_FMT_AMPM'
|
|||
|
The return value can be used as a format string for
|
|||
|
`strftime' to represent time in the am/pm format.
|
|||
|
|
|||
|
Note that if the am/pm format does not make any sense for the
|
|||
|
selected locale, the return value might be the same as the
|
|||
|
one for `T_FMT'.
|
|||
|
|
|||
|
`ERA'
|
|||
|
The return value represents the era used in the current
|
|||
|
locale.
|
|||
|
|
|||
|
Most locales do not define this value. An example of a
|
|||
|
locale which does define this value is the Japanese one. In
|
|||
|
Japan, the traditional representation of dates includes the
|
|||
|
name of the era corresponding to the then-emperor's reign.
|
|||
|
|
|||
|
Normally it should not be necessary to use this value
|
|||
|
directly. Specifying the `E' modifier in their format
|
|||
|
strings causes the `strftime' functions to use this
|
|||
|
information. The format of the returned string is not
|
|||
|
specified, and therefore you should not assume knowledge of
|
|||
|
it on different systems.
|
|||
|
|
|||
|
`ERA_YEAR'
|
|||
|
The return value gives the year in the relevant era of the
|
|||
|
locale. As for `ERA' it should not be necessary to use this
|
|||
|
value directly.
|
|||
|
|
|||
|
`ERA_D_T_FMT'
|
|||
|
This return value can be used as a format string for
|
|||
|
`strftime' to represent dates and times in a locale-specific
|
|||
|
era-based way.
|
|||
|
|
|||
|
`ERA_D_FMT'
|
|||
|
This return value can be used as a format string for
|
|||
|
`strftime' to represent a date in a locale-specific era-based
|
|||
|
way.
|
|||
|
|
|||
|
`ERA_T_FMT'
|
|||
|
This return value can be used as a format string for
|
|||
|
`strftime' to represent time in a locale-specific era-based
|
|||
|
way.
|
|||
|
|
|||
|
`ALT_DIGITS'
|
|||
|
The return value is a representation of up to 100 values used
|
|||
|
to represent the values 0 to 99. As for `ERA' this value is
|
|||
|
not intended to be used directly, but instead indirectly
|
|||
|
through the `strftime' function. When the modifier `O' is
|
|||
|
used in a format which would otherwise use numerals to
|
|||
|
represent hours, minutes, seconds, weekdays, months, or
|
|||
|
weeks, the appropriate value for the locale is used instead.
|
|||
|
|
|||
|
`INT_CURR_SYMBOL'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`int_curr_symbol' element of the `struct lconv'.
|
|||
|
|
|||
|
`CURRENCY_SYMBOL'
|
|||
|
`CRNCYSTR'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`currency_symbol' element of the `struct lconv'.
|
|||
|
|
|||
|
`CRNCYSTR' is a deprecated alias still required by Unix98.
|
|||
|
|
|||
|
`MON_DECIMAL_POINT'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`mon_decimal_point' element of the `struct lconv'.
|
|||
|
|
|||
|
`MON_THOUSANDS_SEP'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`mon_thousands_sep' element of the `struct lconv'.
|
|||
|
|
|||
|
`MON_GROUPING'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`mon_grouping' element of the `struct lconv'.
|
|||
|
|
|||
|
`POSITIVE_SIGN'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`positive_sign' element of the `struct lconv'.
|
|||
|
|
|||
|
`NEGATIVE_SIGN'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`negative_sign' element of the `struct lconv'.
|
|||
|
|
|||
|
`INT_FRAC_DIGITS'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`int_frac_digits' element of the `struct lconv'.
|
|||
|
|
|||
|
`FRAC_DIGITS'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`frac_digits' element of the `struct lconv'.
|
|||
|
|
|||
|
`P_CS_PRECEDES'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`p_cs_precedes' element of the `struct lconv'.
|
|||
|
|
|||
|
`P_SEP_BY_SPACE'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`p_sep_by_space' element of the `struct lconv'.
|
|||
|
|
|||
|
`N_CS_PRECEDES'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`n_cs_precedes' element of the `struct lconv'.
|
|||
|
|
|||
|
`N_SEP_BY_SPACE'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`n_sep_by_space' element of the `struct lconv'.
|
|||
|
|
|||
|
`P_SIGN_POSN'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`p_sign_posn' element of the `struct lconv'.
|
|||
|
|
|||
|
`N_SIGN_POSN'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`n_sign_posn' element of the `struct lconv'.
|
|||
|
|
|||
|
`INT_P_CS_PRECEDES'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`int_p_cs_precedes' element of the `struct lconv'.
|
|||
|
|
|||
|
`INT_P_SEP_BY_SPACE'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`int_p_sep_by_space' element of the `struct lconv'.
|
|||
|
|
|||
|
`INT_N_CS_PRECEDES'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`int_n_cs_precedes' element of the `struct lconv'.
|
|||
|
|
|||
|
`INT_N_SEP_BY_SPACE'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`int_n_sep_by_space' element of the `struct lconv'.
|
|||
|
|
|||
|
`INT_P_SIGN_POSN'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`int_p_sign_posn' element of the `struct lconv'.
|
|||
|
|
|||
|
`INT_N_SIGN_POSN'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`int_n_sign_posn' element of the `struct lconv'.
|
|||
|
|
|||
|
`DECIMAL_POINT'
|
|||
|
`RADIXCHAR'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`decimal_point' element of the `struct lconv'.
|
|||
|
|
|||
|
The name `RADIXCHAR' is a deprecated alias still used in
|
|||
|
Unix98.
|
|||
|
|
|||
|
`THOUSANDS_SEP'
|
|||
|
`THOUSEP'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`thousands_sep' element of the `struct lconv'.
|
|||
|
|
|||
|
The name `THOUSEP' is a deprecated alias still used in Unix98.
|
|||
|
|
|||
|
`GROUPING'
|
|||
|
The same as the value returned by `localeconv' in the
|
|||
|
`grouping' element of the `struct lconv'.
|
|||
|
|
|||
|
`YESEXPR'
|
|||
|
The return value is a regular expression which can be used
|
|||
|
with the `regex' function to recognize a positive response to
|
|||
|
a yes/no question. The GNU C Library provides the `rpmatch'
|
|||
|
function for easier handling in applications.
|
|||
|
|
|||
|
`NOEXPR'
|
|||
|
The return value is a regular expression which can be used
|
|||
|
with the `regex' function to recognize a negative response to
|
|||
|
a yes/no question.
|
|||
|
|
|||
|
`YESSTR'
|
|||
|
The return value is a locale-specific translation of the
|
|||
|
positive response to a yes/no question.
|
|||
|
|
|||
|
Using this value is deprecated since it is a very special
|
|||
|
case of message translation, and is better handled by the
|
|||
|
message translation functions (*note Message Translation::).
|
|||
|
|
|||
|
The use of this symbol is deprecated. Instead message
|
|||
|
translation should be used.
|
|||
|
|
|||
|
`NOSTR'
|
|||
|
The return value is a locale-specific translation of the
|
|||
|
negative response to a yes/no question. What is said for
|
|||
|
`YESSTR' is also true here.
|
|||
|
|
|||
|
The use of this symbol is deprecated. Instead message
|
|||
|
translation should be used.
|
|||
|
|
|||
|
The file `langinfo.h' defines a lot more symbols but none of them
|
|||
|
are official. Using them is not portable, and the format of the
|
|||
|
return values might change. Therefore we recommended you not use
|
|||
|
them.
|
|||
|
|
|||
|
Note that the return value for any valid argument can be used in
|
|||
|
all situations (with the possible exception of the am/pm time
|
|||
|
formatting codes). If the user has not selected any locale for the
|
|||
|
appropriate category, `nl_langinfo' returns the information from
|
|||
|
the `"C"' locale. It is therefore possible to use this function as
|
|||
|
shown in the example below.
|
|||
|
|
|||
|
If the argument ITEM is not valid, a pointer to an empty string is
|
|||
|
returned.
|
|||
|
|
|||
|
An example of `nl_langinfo' usage is a function which has to print a
|
|||
|
given date and time in a locale-specific way. At first one might think
|
|||
|
that, since `strftime' internally uses the locale information, writing
|
|||
|
something like the following is enough:
|
|||
|
|
|||
|
size_t
|
|||
|
i18n_time_n_data (char *s, size_t len, const struct tm *tp)
|
|||
|
{
|
|||
|
return strftime (s, len, "%X %D", tp);
|
|||
|
}
|
|||
|
|
|||
|
The format contains no weekday or month names and therefore is
|
|||
|
internationally usable. Wrong! The output produced is something like
|
|||
|
`"hh:mm:ss MM/DD/YY"'. This format is only recognizable in the USA.
|
|||
|
Other countries use different formats. Therefore the function should
|
|||
|
be rewritten like this:
|
|||
|
|
|||
|
size_t
|
|||
|
i18n_time_n_data (char *s, size_t len, const struct tm *tp)
|
|||
|
{
|
|||
|
return strftime (s, len, nl_langinfo (D_T_FMT), tp);
|
|||
|
}
|
|||
|
|
|||
|
Now it uses the date and time format of the locale selected when the
|
|||
|
program runs. If the user selects the locale correctly there should
|
|||
|
never be a misunderstanding over the time and date format.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Formatting Numbers, Next: Yes-or-No Questions, Prev: Locale Information, Up: Locales
|
|||
|
|
|||
|
7.8 A dedicated function to format numbers
|
|||
|
==========================================
|
|||
|
|
|||
|
We have seen that the structure returned by `localeconv' as well as the
|
|||
|
values given to `nl_langinfo' allow you to retrieve the various pieces
|
|||
|
of locale-specific information to format numbers and monetary amounts.
|
|||
|
We have also seen that the underlying rules are quite complex.
|
|||
|
|
|||
|
Therefore the X/Open standards introduce a function which uses such
|
|||
|
locale information, making it easier for the user to format numbers
|
|||
|
according to these rules.
|
|||
|
|
|||
|
-- Function: ssize_t strfmon (char *S, size_t MAXSIZE, const char
|
|||
|
*FORMAT, ...)
|
|||
|
Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
|
|||
|
*Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `strfmon' function is similar to the `strftime' function in
|
|||
|
that it takes a buffer, its size, a format string, and values to
|
|||
|
write into the buffer as text in a form specified by the format
|
|||
|
string. Like `strftime', the function also returns the number of
|
|||
|
bytes written into the buffer.
|
|||
|
|
|||
|
There are two differences: `strfmon' can take more than one
|
|||
|
argument, and, of course, the format specification is different.
|
|||
|
Like `strftime', the format string consists of normal text, which
|
|||
|
is output as is, and format specifiers, which are indicated by a
|
|||
|
`%'. Immediately after the `%', you can optionally specify
|
|||
|
various flags and formatting information before the main
|
|||
|
formatting character, in a similar way to `printf':
|
|||
|
|
|||
|
* Immediately following the `%' there can be one or more of the
|
|||
|
following flags:
|
|||
|
`=F'
|
|||
|
The single byte character F is used for this field as
|
|||
|
the numeric fill character. By default this character
|
|||
|
is a space character. Filling with this character is
|
|||
|
only performed if a left precision is specified. It is
|
|||
|
not just to fill to the given field width.
|
|||
|
|
|||
|
`^'
|
|||
|
The number is printed without grouping the digits
|
|||
|
according to the rules of the current locale. By
|
|||
|
default grouping is enabled.
|
|||
|
|
|||
|
`+', `('
|
|||
|
At most one of these flags can be used. They select
|
|||
|
which format to represent the sign of a currency amount.
|
|||
|
By default, and if `+' is given, the locale equivalent
|
|||
|
of +/- is used. If `(' is given, negative amounts are
|
|||
|
enclosed in parentheses. The exact format is determined
|
|||
|
by the values of the `LC_MONETARY' category of the
|
|||
|
locale selected at program runtime.
|
|||
|
|
|||
|
`!'
|
|||
|
The output will not contain the currency symbol.
|
|||
|
|
|||
|
`-'
|
|||
|
The output will be formatted left-justified instead of
|
|||
|
right-justified if it does not fill the entire field
|
|||
|
width.
|
|||
|
|
|||
|
The next part of the specification is an optional field width. If
|
|||
|
no width is specified 0 is taken. During output, the function
|
|||
|
first determines how much space is required. If it requires at
|
|||
|
least as many characters as given by the field width, it is output
|
|||
|
using as much space as necessary. Otherwise, it is extended to
|
|||
|
use the full width by filling with the space character. The
|
|||
|
presence or absence of the `-' flag determines the side at which
|
|||
|
such padding occurs. If present, the spaces are added at the
|
|||
|
right making the output left-justified, and vice versa.
|
|||
|
|
|||
|
So far the format looks familiar, being similar to the `printf' and
|
|||
|
`strftime' formats. However, the next two optional fields
|
|||
|
introduce something new. The first one is a `#' character followed
|
|||
|
by a decimal digit string. The value of the digit string
|
|||
|
specifies the number of _digit_ positions to the left of the
|
|||
|
decimal point (or equivalent). This does _not_ include the
|
|||
|
grouping character when the `^' flag is not given. If the space
|
|||
|
needed to print the number does not fill the whole width, the
|
|||
|
field is padded at the left side with the fill character, which
|
|||
|
can be selected using the `=' flag and by default is a space. For
|
|||
|
example, if the field width is selected as 6 and the number is
|
|||
|
123, the fill character is `*' the result will be `***123'.
|
|||
|
|
|||
|
The second optional field starts with a `.' (period) and consists
|
|||
|
of another decimal digit string. Its value describes the number of
|
|||
|
characters printed after the decimal point. The default is
|
|||
|
selected from the current locale (`frac_digits',
|
|||
|
`int_frac_digits', see *note General Numeric::). If the exact
|
|||
|
representation needs more digits than given by the field width,
|
|||
|
the displayed value is rounded. If the number of fractional
|
|||
|
digits is selected to be zero, no decimal point is printed.
|
|||
|
|
|||
|
As a GNU extension, the `strfmon' implementation in the GNU C
|
|||
|
Library allows an optional `L' next as a format modifier. If this
|
|||
|
modifier is given, the argument is expected to be a `long double'
|
|||
|
instead of a `double' value.
|
|||
|
|
|||
|
Finally, the last component is a format specifier. There are three
|
|||
|
specifiers defined:
|
|||
|
|
|||
|
`i'
|
|||
|
Use the locale's rules for formatting an international
|
|||
|
currency value.
|
|||
|
|
|||
|
`n'
|
|||
|
Use the locale's rules for formatting a national currency
|
|||
|
value.
|
|||
|
|
|||
|
`%'
|
|||
|
Place a `%' in the output. There must be no flag, width
|
|||
|
specifier or modifier given, only `%%' is allowed.
|
|||
|
|
|||
|
As for `printf', the function reads the format string from left to
|
|||
|
right and uses the values passed to the function following the
|
|||
|
format string. The values are expected to be either of type
|
|||
|
`double' or `long double', depending on the presence of the
|
|||
|
modifier `L'. The result is stored in the buffer pointed to by S.
|
|||
|
At most MAXSIZE characters are stored.
|
|||
|
|
|||
|
The return value of the function is the number of characters
|
|||
|
stored in S, including the terminating `NULL' byte. If the number
|
|||
|
of characters stored would exceed MAXSIZE, the function returns -1
|
|||
|
and the content of the buffer S is unspecified. In this case
|
|||
|
`errno' is set to `E2BIG'.
|
|||
|
|
|||
|
A few examples should make clear how the function works. It is
|
|||
|
assumed that all the following pieces of code are executed in a program
|
|||
|
which uses the USA locale (`en_US'). The simplest form of the format
|
|||
|
is this:
|
|||
|
|
|||
|
strfmon (buf, 100, "@%n@%n@%n@", 123.45, -567.89, 12345.678);
|
|||
|
|
|||
|
The output produced is
|
|||
|
"@$123.45@-$567.89@$12,345.68@"
|
|||
|
|
|||
|
We can notice several things here. First, the widths of the output
|
|||
|
numbers are different. We have not specified a width in the format
|
|||
|
string, and so this is no wonder. Second, the third number is printed
|
|||
|
using thousands separators. The thousands separator for the `en_US'
|
|||
|
locale is a comma. The number is also rounded. .678 is rounded to .68
|
|||
|
since the format does not specify a precision and the default value in
|
|||
|
the locale is 2. Finally, note that the national currency symbol is
|
|||
|
printed since `%n' was used, not `i'. The next example shows how we
|
|||
|
can align the output.
|
|||
|
|
|||
|
strfmon (buf, 100, "@%=*11n@%=*11n@%=*11n@", 123.45, -567.89, 12345.678);
|
|||
|
|
|||
|
The output this time is:
|
|||
|
|
|||
|
"@ $123.45@ -$567.89@ $12,345.68@"
|
|||
|
|
|||
|
Two things stand out. Firstly, all fields have the same width
|
|||
|
(eleven characters) since this is the width given in the format and
|
|||
|
since no number required more characters to be printed. The second
|
|||
|
important point is that the fill character is not used. This is
|
|||
|
correct since the white space was not used to achieve a precision given
|
|||
|
by a `#' modifier, but instead to fill to the given width. The
|
|||
|
difference becomes obvious if we now add a width specification.
|
|||
|
|
|||
|
strfmon (buf, 100, "@%=*11#5n@%=*11#5n@%=*11#5n@",
|
|||
|
123.45, -567.89, 12345.678);
|
|||
|
|
|||
|
The output is
|
|||
|
|
|||
|
"@ $***123.45@-$***567.89@ $12,456.68@"
|
|||
|
|
|||
|
Here we can see that all the currency symbols are now aligned, and
|
|||
|
that the space between the currency sign and the number is filled with
|
|||
|
the selected fill character. Note that although the width is selected
|
|||
|
to be 5 and 123.45 has three digits left of the decimal point, the
|
|||
|
space is filled with three asterisks. This is correct since, as
|
|||
|
explained above, the width does not include the positions used to store
|
|||
|
thousands separators. One last example should explain the remaining
|
|||
|
functionality.
|
|||
|
|
|||
|
strfmon (buf, 100, "@%=0(16#5.3i@%=0(16#5.3i@%=0(16#5.3i@",
|
|||
|
123.45, -567.89, 12345.678);
|
|||
|
|
|||
|
This rather complex format string produces the following output:
|
|||
|
|
|||
|
"@ USD 000123,450 @(USD 000567.890)@ USD 12,345.678 @"
|
|||
|
|
|||
|
The most noticeable change is the alternative way of representing
|
|||
|
negative numbers. In financial circles this is often done using
|
|||
|
parentheses, and this is what the `(' flag selected. The fill
|
|||
|
character is now `0'. Note that this `0' character is not regarded as
|
|||
|
a numeric zero, and therefore the first and second numbers are not
|
|||
|
printed using a thousands separator. Since we used the format
|
|||
|
specifier `i' instead of `n', the international form of the currency
|
|||
|
symbol is used. This is a four letter string, in this case `"USD "'.
|
|||
|
The last point is that since the precision right of the decimal point
|
|||
|
is selected to be three, the first and second numbers are printed with
|
|||
|
an extra zero at the end and the third number is printed without
|
|||
|
rounding.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Yes-or-No Questions, Prev: Formatting Numbers, Up: Locales
|
|||
|
|
|||
|
7.9 Yes-or-No Questions
|
|||
|
=======================
|
|||
|
|
|||
|
Some non GUI programs ask a yes-or-no question. If the messages
|
|||
|
(especially the questions) are translated into foreign languages, be
|
|||
|
sure that you localize the answers too. It would be very bad habit to
|
|||
|
ask a question in one language and request the answer in another, often
|
|||
|
English.
|
|||
|
|
|||
|
The GNU C Library contains `rpmatch' to give applications easy
|
|||
|
access to the corresponding locale definitions.
|
|||
|
|
|||
|
-- Function: int rpmatch (const char *RESPONSE)
|
|||
|
Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap lock dlopen
|
|||
|
| AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The function `rpmatch' checks the string in RESPONSE for whether
|
|||
|
or not it is a correct yes-or-no answer and if yes, which one. The
|
|||
|
check uses the `YESEXPR' and `NOEXPR' data in the `LC_MESSAGES'
|
|||
|
category of the currently selected locale. The return value is as
|
|||
|
follows:
|
|||
|
|
|||
|
`1'
|
|||
|
The user entered an affirmative answer.
|
|||
|
|
|||
|
`0'
|
|||
|
The user entered a negative answer.
|
|||
|
|
|||
|
`-1'
|
|||
|
The answer matched neither the `YESEXPR' nor the `NOEXPR'
|
|||
|
regular expression.
|
|||
|
|
|||
|
This function is not standardized but available beside in the GNU
|
|||
|
C Library at least also in the IBM AIX library.
|
|||
|
|
|||
|
This function would normally be used like this:
|
|||
|
|
|||
|
...
|
|||
|
/* Use a safe default. */
|
|||
|
_Bool doit = false;
|
|||
|
|
|||
|
fputs (gettext ("Do you really want to do this? "), stdout);
|
|||
|
fflush (stdout);
|
|||
|
/* Prepare the `getline' call. */
|
|||
|
line = NULL;
|
|||
|
len = 0;
|
|||
|
while (getline (&line, &len, stdin) >= 0)
|
|||
|
{
|
|||
|
/* Check the response. */
|
|||
|
int res = rpmatch (line);
|
|||
|
if (res >= 0)
|
|||
|
{
|
|||
|
/* We got a definitive answer. */
|
|||
|
if (res > 0)
|
|||
|
doit = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
/* Free what `getline' allocated. */
|
|||
|
free (line);
|
|||
|
|
|||
|
Note that the loop continues until a read error is detected or until
|
|||
|
a definitive (positive or negative) answer is read.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Message Translation, Next: Searching and Sorting, Prev: Locales, Up: Top
|
|||
|
|
|||
|
8 Message Translation
|
|||
|
*********************
|
|||
|
|
|||
|
The program's interface with the user should be designed to ease the
|
|||
|
user's task. One way to ease the user's task is to use messages in
|
|||
|
whatever language the user prefers.
|
|||
|
|
|||
|
Printing messages in different languages can be implemented in
|
|||
|
different ways. One could add all the different languages in the
|
|||
|
source code and choose among the variants every time a message has to
|
|||
|
be printed. This is certainly not a good solution since extending the
|
|||
|
set of languages is cumbersome (the code must be changed) and the code
|
|||
|
itself can become really big with dozens of message sets.
|
|||
|
|
|||
|
A better solution is to keep the message sets for each language in
|
|||
|
separate files which are loaded at runtime depending on the language
|
|||
|
selection of the user.
|
|||
|
|
|||
|
The GNU C Library provides two different sets of functions to support
|
|||
|
message translation. The problem is that neither of the interfaces is
|
|||
|
officially defined by the POSIX standard. The `catgets' family of
|
|||
|
functions is defined in the X/Open standard but this is derived from
|
|||
|
industry decisions and therefore not necessarily based on reasonable
|
|||
|
decisions.
|
|||
|
|
|||
|
As mentioned above, the message catalog handling provides easy
|
|||
|
extendability by using external data files which contain the message
|
|||
|
translations. I.e., these files contain for each of the messages used
|
|||
|
in the program a translation for the appropriate language. So the tasks
|
|||
|
of the message handling functions are
|
|||
|
|
|||
|
* locate the external data file with the appropriate translations
|
|||
|
|
|||
|
* load the data and make it possible to address the messages
|
|||
|
|
|||
|
* map a given key to the translated message
|
|||
|
|
|||
|
The two approaches mainly differ in the implementation of this last
|
|||
|
step. Decisions made in the last step influence the rest of the design.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Message catalogs a la X/Open:: The `catgets' family of functions.
|
|||
|
* The Uniforum approach:: The `gettext' family of functions.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Message catalogs a la X/Open, Next: The Uniforum approach, Up: Message Translation
|
|||
|
|
|||
|
8.1 X/Open Message Catalog Handling
|
|||
|
===================================
|
|||
|
|
|||
|
The `catgets' functions are based on the simple scheme:
|
|||
|
|
|||
|
Associate every message to translate in the source code with a
|
|||
|
unique identifier. To retrieve a message from a catalog file
|
|||
|
solely the identifier is used.
|
|||
|
|
|||
|
This means for the author of the program that s/he will have to make
|
|||
|
sure the meaning of the identifier in the program code and in the
|
|||
|
message catalogs is always the same.
|
|||
|
|
|||
|
Before a message can be translated the catalog file must be located.
|
|||
|
The user of the program must be able to guide the responsible function
|
|||
|
to find whatever catalog the user wants. This is separated from what
|
|||
|
the programmer had in mind.
|
|||
|
|
|||
|
All the types, constants and functions for the `catgets' functions
|
|||
|
are defined/declared in the `nl_types.h' header file.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* The catgets Functions:: The `catgets' function family.
|
|||
|
* The message catalog files:: Format of the message catalog files.
|
|||
|
* The gencat program:: How to generate message catalogs files which
|
|||
|
can be used by the functions.
|
|||
|
* Common Usage:: How to use the `catgets' interface.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: The catgets Functions, Next: The message catalog files, Up: Message catalogs a la X/Open
|
|||
|
|
|||
|
8.1.1 The `catgets' function family
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
-- Function: nl_catd catopen (const char *CAT_NAME, int FLAG)
|
|||
|
Preliminary: | MT-Safe env | AS-Unsafe heap | AC-Unsafe mem |
|
|||
|
*Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `catopen' function tries to locate the message data file named
|
|||
|
CAT_NAME and loads it when found. The return value is of an
|
|||
|
opaque type and can be used in calls to the other functions to
|
|||
|
refer to this loaded catalog.
|
|||
|
|
|||
|
The return value is `(nl_catd) -1' in case the function failed and
|
|||
|
no catalog was loaded. The global variable `errno' contains a code
|
|||
|
for the error causing the failure. But even if the function call
|
|||
|
succeeded this does not mean that all messages can be translated.
|
|||
|
|
|||
|
Locating the catalog file must happen in a way which lets the user
|
|||
|
of the program influence the decision. It is up to the user to
|
|||
|
decide about the language to use and sometimes it is useful to use
|
|||
|
alternate catalog files. All this can be specified by the user by
|
|||
|
setting some environment variables.
|
|||
|
|
|||
|
The first problem is to find out where all the message catalogs are
|
|||
|
stored. Every program could have its own place to keep all the
|
|||
|
different files but usually the catalog files are grouped by
|
|||
|
languages and the catalogs for all programs are kept in the same
|
|||
|
place.
|
|||
|
|
|||
|
To tell the `catopen' function where the catalog for the program
|
|||
|
can be found the user can set the environment variable `NLSPATH' to
|
|||
|
a value which describes her/his choice. Since this value must be
|
|||
|
usable for different languages and locales it cannot be a simple
|
|||
|
string. Instead it is a format string (similar to `printf''s).
|
|||
|
An example is
|
|||
|
|
|||
|
/usr/share/locale/%L/%N:/usr/share/locale/%L/LC_MESSAGES/%N
|
|||
|
|
|||
|
First one can see that more than one directory can be specified
|
|||
|
(with the usual syntax of separating them by colons). The next
|
|||
|
things to observe are the format string, `%L' and `%N' in this
|
|||
|
case. The `catopen' function knows about several of them and the
|
|||
|
replacement for all of them is of course different.
|
|||
|
|
|||
|
`%N'
|
|||
|
This format element is substituted with the name of the
|
|||
|
catalog file. This is the value of the CAT_NAME argument
|
|||
|
given to `catgets'.
|
|||
|
|
|||
|
`%L'
|
|||
|
This format element is substituted with the name of the
|
|||
|
currently selected locale for translating messages. How this
|
|||
|
is determined is explained below.
|
|||
|
|
|||
|
`%l'
|
|||
|
(This is the lowercase ell.) This format element is
|
|||
|
substituted with the language element of the locale name.
|
|||
|
The string describing the selected locale is expected to have
|
|||
|
the form `LANG[_TERR[.CODESET]]' and this format uses the
|
|||
|
first part LANG.
|
|||
|
|
|||
|
`%t'
|
|||
|
This format element is substituted by the territory part TERR
|
|||
|
of the name of the currently selected locale. See the
|
|||
|
explanation of the format above.
|
|||
|
|
|||
|
`%c'
|
|||
|
This format element is substituted by the codeset part
|
|||
|
CODESET of the name of the currently selected locale. See
|
|||
|
the explanation of the format above.
|
|||
|
|
|||
|
`%%'
|
|||
|
Since `%' is used as a meta character there must be a way to
|
|||
|
express the `%' character in the result itself. Using `%%'
|
|||
|
does this just like it works for `printf'.
|
|||
|
|
|||
|
Using `NLSPATH' allows arbitrary directories to be searched for
|
|||
|
message catalogs while still allowing different languages to be
|
|||
|
used. If the `NLSPATH' environment variable is not set, the
|
|||
|
default value is
|
|||
|
|
|||
|
PREFIX/share/locale/%L/%N:PREFIX/share/locale/%L/LC_MESSAGES/%N
|
|||
|
|
|||
|
where PREFIX is given to `configure' while installing the GNU C
|
|||
|
Library (this value is in many cases `/usr' or the empty string).
|
|||
|
|
|||
|
The remaining problem is to decide which must be used. The value
|
|||
|
decides about the substitution of the format elements mentioned
|
|||
|
above. First of all the user can specify a path in the message
|
|||
|
catalog name (i.e., the name contains a slash character). In this
|
|||
|
situation the `NLSPATH' environment variable is not used. The
|
|||
|
catalog must exist as specified in the program, perhaps relative
|
|||
|
to the current working directory. This situation in not desirable
|
|||
|
and catalogs names never should be written this way. Beside this,
|
|||
|
this behavior is not portable to all other platforms providing the
|
|||
|
`catgets' interface.
|
|||
|
|
|||
|
Otherwise the values of environment variables from the standard
|
|||
|
environment are examined (*note Standard Environment::). Which
|
|||
|
variables are examined is decided by the FLAG parameter of
|
|||
|
`catopen'. If the value is `NL_CAT_LOCALE' (which is defined in
|
|||
|
`nl_types.h') then the `catopen' function uses the name of the
|
|||
|
locale currently selected for the `LC_MESSAGES' category.
|
|||
|
|
|||
|
If FLAG is zero the `LANG' environment variable is examined. This
|
|||
|
is a left-over from the early days when the concept of locales had
|
|||
|
not even reached the level of POSIX locales.
|
|||
|
|
|||
|
The environment variable and the locale name should have a value
|
|||
|
of the form `LANG[_TERR[.CODESET]]' as explained above. If no
|
|||
|
environment variable is set the `"C"' locale is used which
|
|||
|
prevents any translation.
|
|||
|
|
|||
|
The return value of the function is in any case a valid string.
|
|||
|
Either it is a translation from a message catalog or it is the
|
|||
|
same as the STRING parameter. So a piece of code to decide
|
|||
|
whether a translation actually happened must look like this:
|
|||
|
|
|||
|
{
|
|||
|
char *trans = catgets (desc, set, msg, input_string);
|
|||
|
if (trans == input_string)
|
|||
|
{
|
|||
|
/* Something went wrong. */
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
When an error occurs the global variable `errno' is set to
|
|||
|
|
|||
|
EBADF
|
|||
|
The catalog does not exist.
|
|||
|
|
|||
|
ENOMSG
|
|||
|
The set/message tuple does not name an existing element in the
|
|||
|
message catalog.
|
|||
|
|
|||
|
While it sometimes can be useful to test for errors programs
|
|||
|
normally will avoid any test. If the translation is not available
|
|||
|
it is no big problem if the original, untranslated message is
|
|||
|
printed. Either the user understands this as well or s/he will
|
|||
|
look for the reason why the messages are not translated.
|
|||
|
|
|||
|
Please note that the currently selected locale does not depend on a
|
|||
|
call to the `setlocale' function. It is not necessary that the locale
|
|||
|
data files for this locale exist and calling `setlocale' succeeds. The
|
|||
|
`catopen' function directly reads the values of the environment
|
|||
|
variables.
|
|||
|
|
|||
|
-- Function: char * catgets (nl_catd CATALOG_DESC, int SET, int
|
|||
|
MESSAGE, const char *STRING)
|
|||
|
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
|||
|
Concepts::.
|
|||
|
|
|||
|
The function `catgets' has to be used to access the message catalog
|
|||
|
previously opened using the `catopen' function. The CATALOG_DESC
|
|||
|
parameter must be a value previously returned by `catopen'.
|
|||
|
|
|||
|
The next two parameters, SET and MESSAGE, reflect the internal
|
|||
|
organization of the message catalog files. This will be explained
|
|||
|
in detail below. For now it is interesting to know that a catalog
|
|||
|
can consist of several sets and the messages in each thread are
|
|||
|
individually numbered using numbers. Neither the set number nor
|
|||
|
the message number must be consecutive. They can be arbitrarily
|
|||
|
chosen. But each message (unless equal to another one) must have
|
|||
|
its own unique pair of set and message numbers.
|
|||
|
|
|||
|
Since it is not guaranteed that the message catalog for the
|
|||
|
language selected by the user exists the last parameter STRING
|
|||
|
helps to handle this case gracefully. If no matching string can
|
|||
|
be found STRING is returned. This means for the programmer that
|
|||
|
|
|||
|
* the STRING parameters should contain reasonable text (this
|
|||
|
also helps to understand the program seems otherwise there
|
|||
|
would be no hint on the string which is expected to be
|
|||
|
returned.
|
|||
|
|
|||
|
* all STRING arguments should be written in the same language.
|
|||
|
|
|||
|
It is somewhat uncomfortable to write a program using the `catgets'
|
|||
|
functions if no supporting functionality is available. Since each
|
|||
|
set/message number tuple must be unique the programmer must keep lists
|
|||
|
of the messages at the same time the code is written. And the work
|
|||
|
between several people working on the same project must be coordinated.
|
|||
|
We will see how some of these problems can be relaxed a bit (*note
|
|||
|
Common Usage::).
|
|||
|
|
|||
|
-- Function: int catclose (nl_catd CATALOG_DESC)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe corrupt mem |
|
|||
|
*Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `catclose' function can be used to free the resources
|
|||
|
associated with a message catalog which previously was opened by a
|
|||
|
call to `catopen'. If the resources can be successfully freed the
|
|||
|
function returns `0'. Otherwise it returns `-1' and the global
|
|||
|
variable `errno' is set. Errors can occur if the catalog
|
|||
|
descriptor CATALOG_DESC is not valid in which case `errno' is set
|
|||
|
to `EBADF'.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: The message catalog files, Next: The gencat program, Prev: The catgets Functions, Up: Message catalogs a la X/Open
|
|||
|
|
|||
|
8.1.2 Format of the message catalog files
|
|||
|
-----------------------------------------
|
|||
|
|
|||
|
The only reasonable way to translate all the messages of a function and
|
|||
|
store the result in a message catalog file which can be read by the
|
|||
|
`catopen' function is to write all the message text to the translator
|
|||
|
and let her/him translate them all. I.e., we must have a file with
|
|||
|
entries which associate the set/message tuple with a specific
|
|||
|
translation. This file format is specified in the X/Open standard and
|
|||
|
is as follows:
|
|||
|
|
|||
|
* Lines containing only whitespace characters or empty lines are
|
|||
|
ignored.
|
|||
|
|
|||
|
* Lines which contain as the first non-whitespace character a `$'
|
|||
|
followed by a whitespace character are comment and are also
|
|||
|
ignored.
|
|||
|
|
|||
|
* If a line contains as the first non-whitespace characters the
|
|||
|
sequence `$set' followed by a whitespace character an additional
|
|||
|
argument is required to follow. This argument can either be:
|
|||
|
|
|||
|
- a number. In this case the value of this number determines
|
|||
|
the set to which the following messages are added.
|
|||
|
|
|||
|
- an identifier consisting of alphanumeric characters plus the
|
|||
|
underscore character. In this case the set get automatically
|
|||
|
a number assigned. This value is one added to the largest
|
|||
|
set number which so far appeared.
|
|||
|
|
|||
|
How to use the symbolic names is explained in section *note
|
|||
|
Common Usage::.
|
|||
|
|
|||
|
It is an error if a symbol name appears more than once. All
|
|||
|
following messages are placed in a set with this number.
|
|||
|
|
|||
|
* If a line contains as the first non-whitespace characters the
|
|||
|
sequence `$delset' followed by a whitespace character an
|
|||
|
additional argument is required to follow. This argument can
|
|||
|
either be:
|
|||
|
|
|||
|
- a number. In this case the value of this number determines
|
|||
|
the set which will be deleted.
|
|||
|
|
|||
|
- an identifier consisting of alphanumeric characters plus the
|
|||
|
underscore character. This symbolic identifier must match a
|
|||
|
name for a set which previously was defined. It is an error
|
|||
|
if the name is unknown.
|
|||
|
|
|||
|
In both cases all messages in the specified set will be removed.
|
|||
|
They will not appear in the output. But if this set is later
|
|||
|
again selected with a `$set' command again messages could be added
|
|||
|
and these messages will appear in the output.
|
|||
|
|
|||
|
* If a line contains after leading whitespaces the sequence
|
|||
|
`$quote', the quoting character used for this input file is
|
|||
|
changed to the first non-whitespace character following `$quote'.
|
|||
|
If no non-whitespace character is present before the line ends
|
|||
|
quoting is disabled.
|
|||
|
|
|||
|
By default no quoting character is used. In this mode strings are
|
|||
|
terminated with the first unescaped line break. If there is a
|
|||
|
`$quote' sequence present newline need not be escaped. Instead a
|
|||
|
string is terminated with the first unescaped appearance of the
|
|||
|
quote character.
|
|||
|
|
|||
|
A common usage of this feature would be to set the quote character
|
|||
|
to `"'. Then any appearance of the `"' in the strings must be
|
|||
|
escaped using the backslash (i.e., `\"' must be written).
|
|||
|
|
|||
|
* Any other line must start with a number or an alphanumeric
|
|||
|
identifier (with the underscore character included). The
|
|||
|
following characters (starting after the first whitespace
|
|||
|
character) will form the string which gets associated with the
|
|||
|
currently selected set and the message number represented by the
|
|||
|
number and identifier respectively.
|
|||
|
|
|||
|
If the start of the line is a number the message number is
|
|||
|
obvious. It is an error if the same message number already
|
|||
|
appeared for this set.
|
|||
|
|
|||
|
If the leading token was an identifier the message number gets
|
|||
|
automatically assigned. The value is the current maximum message
|
|||
|
number for this set plus one. It is an error if the identifier was
|
|||
|
already used for a message in this set. It is OK to reuse the
|
|||
|
identifier for a message in another thread. How to use the
|
|||
|
symbolic identifiers will be explained below (*note Common
|
|||
|
Usage::). There is one limitation with the identifier: it must
|
|||
|
not be `Set'. The reason will be explained below.
|
|||
|
|
|||
|
The text of the messages can contain escape characters. The usual
|
|||
|
bunch of characters known from the ISO C language are recognized
|
|||
|
(`\n', `\t', `\v', `\b', `\r', `\f', `\\', and `\NNN', where NNN
|
|||
|
is the octal coding of a character code).
|
|||
|
|
|||
|
*Important:* The handling of identifiers instead of numbers for the
|
|||
|
set and messages is a GNU extension. Systems strictly following the
|
|||
|
X/Open specification do not have this feature. An example for a message
|
|||
|
catalog file is this:
|
|||
|
|
|||
|
$ This is a leading comment.
|
|||
|
$quote "
|
|||
|
|
|||
|
$set SetOne
|
|||
|
1 Message with ID 1.
|
|||
|
two " Message with ID \"two\", which gets the value 2 assigned"
|
|||
|
|
|||
|
$set SetTwo
|
|||
|
$ Since the last set got the number 1 assigned this set has number 2.
|
|||
|
4000 "The numbers can be arbitrary, they need not start at one."
|
|||
|
|
|||
|
This small example shows various aspects:
|
|||
|
* Lines 1 and 9 are comments since they start with `$' followed by a
|
|||
|
whitespace.
|
|||
|
|
|||
|
* The quoting character is set to `"'. Otherwise the quotes in the
|
|||
|
message definition would have to be omitted and in this case the
|
|||
|
message with the identifier `two' would lose its leading
|
|||
|
whitespace.
|
|||
|
|
|||
|
* Mixing numbered messages with messages having symbolic names is no
|
|||
|
problem and the numbering happens automatically.
|
|||
|
|
|||
|
While this file format is pretty easy it is not the best possible for
|
|||
|
use in a running program. The `catopen' function would have to parse
|
|||
|
the file and handle syntactic errors gracefully. This is not so easy
|
|||
|
and the whole process is pretty slow. Therefore the `catgets'
|
|||
|
functions expect the data in another more compact and ready-to-use file
|
|||
|
format. There is a special program `gencat' which is explained in
|
|||
|
detail in the next section.
|
|||
|
|
|||
|
Files in this other format are not human readable. To be easy to
|
|||
|
use by programs it is a binary file. But the format is byte order
|
|||
|
independent so translation files can be shared by systems of arbitrary
|
|||
|
architecture (as long as they use the GNU C Library).
|
|||
|
|
|||
|
Details about the binary file format are not important to know since
|
|||
|
these files are always created by the `gencat' program. The sources of
|
|||
|
the GNU C Library also provide the sources for the `gencat' program and
|
|||
|
so the interested reader can look through these source files to learn
|
|||
|
about the file format.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: The gencat program, Next: Common Usage, Prev: The message catalog files, Up: Message catalogs a la X/Open
|
|||
|
|
|||
|
8.1.3 Generate Message Catalogs files
|
|||
|
-------------------------------------
|
|||
|
|
|||
|
The `gencat' program is specified in the X/Open standard and the GNU
|
|||
|
implementation follows this specification and so processes all
|
|||
|
correctly formed input files. Additionally some extension are
|
|||
|
implemented which help to work in a more reasonable way with the
|
|||
|
`catgets' functions.
|
|||
|
|
|||
|
The `gencat' program can be invoked in two ways:
|
|||
|
|
|||
|
`gencat [OPTION ...] [OUTPUT-FILE [INPUT-FILE ...]]`
|
|||
|
|
|||
|
This is the interface defined in the X/Open standard. If no
|
|||
|
INPUT-FILE parameter is given, input will be read from standard input.
|
|||
|
Multiple input files will be read as if they were concatenated. If
|
|||
|
OUTPUT-FILE is also missing, the output will be written to standard
|
|||
|
output. To provide the interface one is used to from other programs a
|
|||
|
second interface is provided.
|
|||
|
|
|||
|
`gencat [OPTION ...] -o OUTPUT-FILE [INPUT-FILE ...]`
|
|||
|
|
|||
|
The option `-o' is used to specify the output file and all file
|
|||
|
arguments are used as input files.
|
|||
|
|
|||
|
Beside this one can use `-' or `/dev/stdin' for INPUT-FILE to denote
|
|||
|
the standard input. Corresponding one can use `-' and `/dev/stdout'
|
|||
|
for OUTPUT-FILE to denote standard output. Using `-' as a file name is
|
|||
|
allowed in X/Open while using the device names is a GNU extension.
|
|||
|
|
|||
|
The `gencat' program works by concatenating all input files and then
|
|||
|
*merging* the resulting collection of message sets with a possibly
|
|||
|
existing output file. This is done by removing all messages with
|
|||
|
set/message number tuples matching any of the generated messages from
|
|||
|
the output file and then adding all the new messages. To regenerate a
|
|||
|
catalog file while ignoring the old contents therefore requires
|
|||
|
removing the output file if it exists. If the output is written to
|
|||
|
standard output no merging takes place.
|
|||
|
|
|||
|
The following table shows the options understood by the `gencat'
|
|||
|
program. The X/Open standard does not specify any options for the
|
|||
|
program so all of these are GNU extensions.
|
|||
|
|
|||
|
`-V'
|
|||
|
`--version'
|
|||
|
Print the version information and exit.
|
|||
|
|
|||
|
`-h'
|
|||
|
`--help'
|
|||
|
Print a usage message listing all available options, then exit
|
|||
|
successfully.
|
|||
|
|
|||
|
`--new'
|
|||
|
Do not merge the new messages from the input files with the old
|
|||
|
content of the output file. The old content of the output file is
|
|||
|
discarded.
|
|||
|
|
|||
|
`-H'
|
|||
|
`--header=name'
|
|||
|
This option is used to emit the symbolic names given to sets and
|
|||
|
messages in the input files for use in the program. Details about
|
|||
|
how to use this are given in the next section. The NAME parameter
|
|||
|
to this option specifies the name of the output file. It will
|
|||
|
contain a number of C preprocessor `#define's to associate a name
|
|||
|
with a number.
|
|||
|
|
|||
|
Please note that the generated file only contains the symbols from
|
|||
|
the input files. If the output is merged with the previous
|
|||
|
content of the output file the possibly existing symbols from the
|
|||
|
file(s) which generated the old output files are not in the
|
|||
|
generated header file.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Common Usage, Prev: The gencat program, Up: Message catalogs a la X/Open
|
|||
|
|
|||
|
8.1.4 How to use the `catgets' interface
|
|||
|
----------------------------------------
|
|||
|
|
|||
|
The `catgets' functions can be used in two different ways. By
|
|||
|
following slavishly the X/Open specs and not relying on the extension
|
|||
|
and by using the GNU extensions. We will take a look at the former
|
|||
|
method first to understand the benefits of extensions.
|
|||
|
|
|||
|
8.1.4.1 Not using symbolic names
|
|||
|
................................
|
|||
|
|
|||
|
Since the X/Open format of the message catalog files does not allow
|
|||
|
symbol names we have to work with numbers all the time. When we start
|
|||
|
writing a program we have to replace all appearances of translatable
|
|||
|
strings with something like
|
|||
|
|
|||
|
catgets (catdesc, set, msg, "string")
|
|||
|
|
|||
|
CATGETS is retrieved from a call to `catopen' which is normally done
|
|||
|
once at the program start. The `"string"' is the string we want to
|
|||
|
translate. The problems start with the set and message numbers.
|
|||
|
|
|||
|
In a bigger program several programmers usually work at the same
|
|||
|
time on the program and so coordinating the number allocation is
|
|||
|
crucial. Though no two different strings must be indexed by the same
|
|||
|
tuple of numbers it is highly desirable to reuse the numbers for equal
|
|||
|
strings with equal translations (please note that there might be
|
|||
|
strings which are equal in one language but have different translations
|
|||
|
due to difference contexts).
|
|||
|
|
|||
|
The allocation process can be relaxed a bit by different set numbers
|
|||
|
for different parts of the program. So the number of developers who
|
|||
|
have to coordinate the allocation can be reduced. But still lists must
|
|||
|
be keep track of the allocation and errors can easily happen. These
|
|||
|
errors cannot be discovered by the compiler or the `catgets' functions.
|
|||
|
Only the user of the program might see wrong messages printed. In the
|
|||
|
worst cases the messages are so irritating that they cannot be
|
|||
|
recognized as wrong. Think about the translations for `"true"' and
|
|||
|
`"false"' being exchanged. This could result in a disaster.
|
|||
|
|
|||
|
8.1.4.2 Using symbolic names
|
|||
|
............................
|
|||
|
|
|||
|
The problems mentioned in the last section derive from the fact that:
|
|||
|
|
|||
|
1. the numbers are allocated once and due to the possibly frequent
|
|||
|
use of them it is difficult to change a number later.
|
|||
|
|
|||
|
2. the numbers do not allow guessing anything about the string and
|
|||
|
therefore collisions can easily happen.
|
|||
|
|
|||
|
By constantly using symbolic names and by providing a method which
|
|||
|
maps the string content to a symbolic name (however this will happen)
|
|||
|
one can prevent both problems above. The cost of this is that the
|
|||
|
programmer has to write a complete message catalog file while s/he is
|
|||
|
writing the program itself.
|
|||
|
|
|||
|
This is necessary since the symbolic names must be mapped to numbers
|
|||
|
before the program sources can be compiled. In the last section it was
|
|||
|
described how to generate a header containing the mapping of the names.
|
|||
|
E.g., for the example message file given in the last section we could
|
|||
|
call the `gencat' program as follows (assume `ex.msg' contains the
|
|||
|
sources).
|
|||
|
|
|||
|
gencat -H ex.h -o ex.cat ex.msg
|
|||
|
|
|||
|
This generates a header file with the following content:
|
|||
|
|
|||
|
#define SetTwoSet 0x2 /* ex.msg:8 */
|
|||
|
|
|||
|
#define SetOneSet 0x1 /* ex.msg:4 */
|
|||
|
#define SetOnetwo 0x2 /* ex.msg:6 */
|
|||
|
|
|||
|
As can be seen the various symbols given in the source file are
|
|||
|
mangled to generate unique identifiers and these identifiers get numbers
|
|||
|
assigned. Reading the source file and knowing about the rules will
|
|||
|
allow to predict the content of the header file (it is deterministic)
|
|||
|
but this is not necessary. The `gencat' program can take care for
|
|||
|
everything. All the programmer has to do is to put the generated header
|
|||
|
file in the dependency list of the source files of her/his project and
|
|||
|
add a rule to regenerate the header if any of the input files change.
|
|||
|
|
|||
|
One word about the symbol mangling. Every symbol consists of two
|
|||
|
parts: the name of the message set plus the name of the message or the
|
|||
|
special string `Set'. So `SetOnetwo' means this macro can be used to
|
|||
|
access the translation with identifier `two' in the message set
|
|||
|
`SetOne'.
|
|||
|
|
|||
|
The other names denote the names of the message sets. The special
|
|||
|
string `Set' is used in the place of the message identifier.
|
|||
|
|
|||
|
If in the code the second string of the set `SetOne' is used the C
|
|||
|
code should look like this:
|
|||
|
|
|||
|
catgets (catdesc, SetOneSet, SetOnetwo,
|
|||
|
" Message with ID \"two\", which gets the value 2 assigned")
|
|||
|
|
|||
|
Writing the function this way will allow to change the message number
|
|||
|
and even the set number without requiring any change in the C source
|
|||
|
code. (The text of the string is normally not the same; this is only
|
|||
|
for this example.)
|
|||
|
|
|||
|
8.1.4.3 How does to this allow to develop
|
|||
|
.........................................
|
|||
|
|
|||
|
To illustrate the usual way to work with the symbolic version numbers
|
|||
|
here is a little example. Assume we want to write the very complex and
|
|||
|
famous greeting program. We start by writing the code as usual:
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
int
|
|||
|
main (void)
|
|||
|
{
|
|||
|
printf ("Hello, world!\n");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
Now we want to internationalize the message and therefore replace the
|
|||
|
message with whatever the user wants.
|
|||
|
|
|||
|
#include <nl_types.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include "msgnrs.h"
|
|||
|
int
|
|||
|
main (void)
|
|||
|
{
|
|||
|
nl_catd catdesc = catopen ("hello.cat", NL_CAT_LOCALE);
|
|||
|
printf (catgets (catdesc, SetMainSet, SetMainHello,
|
|||
|
"Hello, world!\n"));
|
|||
|
catclose (catdesc);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
We see how the catalog object is opened and the returned descriptor
|
|||
|
used in the other function calls. It is not really necessary to check
|
|||
|
for failure of any of the functions since even in these situations the
|
|||
|
functions will behave reasonable. They simply will be return a
|
|||
|
translation.
|
|||
|
|
|||
|
What remains unspecified here are the constants `SetMainSet' and
|
|||
|
`SetMainHello'. These are the symbolic names describing the message.
|
|||
|
To get the actual definitions which match the information in the
|
|||
|
catalog file we have to create the message catalog source file and
|
|||
|
process it using the `gencat' program.
|
|||
|
|
|||
|
$ Messages for the famous greeting program.
|
|||
|
$quote "
|
|||
|
|
|||
|
$set Main
|
|||
|
Hello "Hallo, Welt!\n"
|
|||
|
|
|||
|
Now we can start building the program (assume the message catalog
|
|||
|
source file is named `hello.msg' and the program source file `hello.c'):
|
|||
|
|
|||
|
% gencat -H msgnrs.h -o hello.cat hello.msg
|
|||
|
% cat msgnrs.h
|
|||
|
#define MainSet 0x1 /* hello.msg:4 */
|
|||
|
#define MainHello 0x1 /* hello.msg:5 */
|
|||
|
% gcc -o hello hello.c -I.
|
|||
|
% cp hello.cat /usr/share/locale/de/LC_MESSAGES
|
|||
|
% echo $LC_ALL
|
|||
|
de
|
|||
|
% ./hello
|
|||
|
Hallo, Welt!
|
|||
|
%
|
|||
|
|
|||
|
The call of the `gencat' program creates the missing header file
|
|||
|
`msgnrs.h' as well as the message catalog binary. The former is used
|
|||
|
in the compilation of `hello.c' while the later is placed in a
|
|||
|
directory in which the `catopen' function will try to locate it.
|
|||
|
Please check the `LC_ALL' environment variable and the default path for
|
|||
|
`catopen' presented in the description above.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: The Uniforum approach, Prev: Message catalogs a la X/Open, Up: Message Translation
|
|||
|
|
|||
|
8.2 The Uniforum approach to Message Translation
|
|||
|
================================================
|
|||
|
|
|||
|
Sun Microsystems tried to standardize a different approach to message
|
|||
|
translation in the Uniforum group. There never was a real standard
|
|||
|
defined but still the interface was used in Sun's operating systems.
|
|||
|
Since this approach fits better in the development process of free
|
|||
|
software it is also used throughout the GNU project and the GNU
|
|||
|
`gettext' package provides support for this outside the GNU C Library.
|
|||
|
|
|||
|
The code of the `libintl' from GNU `gettext' is the same as the code
|
|||
|
in the GNU C Library. So the documentation in the GNU `gettext' manual
|
|||
|
is also valid for the functionality here. The following text will
|
|||
|
describe the library functions in detail. But the numerous helper
|
|||
|
programs are not described in this manual. Instead people should read
|
|||
|
the GNU `gettext' manual (*note GNU gettext utilities: (gettext)Top.).
|
|||
|
We will only give a short overview.
|
|||
|
|
|||
|
Though the `catgets' functions are available by default on more
|
|||
|
systems the `gettext' interface is at least as portable as the former.
|
|||
|
The GNU `gettext' package can be used wherever the functions are not
|
|||
|
available.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Message catalogs with gettext:: The `gettext' family of functions.
|
|||
|
* Helper programs for gettext:: Programs to handle message catalogs
|
|||
|
for `gettext'.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Message catalogs with gettext, Next: Helper programs for gettext, Up: The Uniforum approach
|
|||
|
|
|||
|
8.2.1 The `gettext' family of functions
|
|||
|
---------------------------------------
|
|||
|
|
|||
|
The paradigms underlying the `gettext' approach to message translations
|
|||
|
is different from that of the `catgets' functions the basic
|
|||
|
functionally is equivalent. There are functions of the following
|
|||
|
categories:
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Translation with gettext:: What has to be done to translate a message.
|
|||
|
* Locating gettext catalog:: How to determine which catalog to be used.
|
|||
|
* Advanced gettext functions:: Additional functions for more complicated
|
|||
|
situations.
|
|||
|
* Charset conversion in gettext:: How to specify the output character set
|
|||
|
`gettext' uses.
|
|||
|
* GUI program problems:: How to use `gettext' in GUI programs.
|
|||
|
* Using gettextized software:: The possibilities of the user to influence
|
|||
|
the way `gettext' works.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Translation with gettext, Next: Locating gettext catalog, Up: Message catalogs with gettext
|
|||
|
|
|||
|
8.2.1.1 What has to be done to translate a message?
|
|||
|
...................................................
|
|||
|
|
|||
|
The `gettext' functions have a very simple interface. The most basic
|
|||
|
function just takes the string which shall be translated as the
|
|||
|
argument and it returns the translation. This is fundamentally
|
|||
|
different from the `catgets' approach where an extra key is necessary
|
|||
|
and the original string is only used for the error case.
|
|||
|
|
|||
|
If the string which has to be translated is the only argument this of
|
|||
|
course means the string itself is the key. I.e., the translation will
|
|||
|
be selected based on the original string. The message catalogs must
|
|||
|
therefore contain the original strings plus one translation for any such
|
|||
|
string. The task of the `gettext' function is to compare the argument
|
|||
|
string with the available strings in the catalog and return the
|
|||
|
appropriate translation. Of course this process is optimized so that
|
|||
|
this process is not more expensive than an access using an atomic key
|
|||
|
like in `catgets'.
|
|||
|
|
|||
|
The `gettext' approach has some advantages but also some
|
|||
|
disadvantages. Please see the GNU `gettext' manual for a detailed
|
|||
|
discussion of the pros and cons.
|
|||
|
|
|||
|
All the definitions and declarations for `gettext' can be found in
|
|||
|
the `libintl.h' header file. On systems where these functions are not
|
|||
|
part of the C library they can be found in a separate library named
|
|||
|
`libintl.a' (or accordingly different for shared libraries).
|
|||
|
|
|||
|
-- Function: char * gettext (const char *MSGID)
|
|||
|
Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
|
|||
|
AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `gettext' function searches the currently selected message
|
|||
|
catalogs for a string which is equal to MSGID. If there is such a
|
|||
|
string available it is returned. Otherwise the argument string
|
|||
|
MSGID is returned.
|
|||
|
|
|||
|
Please note that although the return value is `char *' the
|
|||
|
returned string must not be changed. This broken type results
|
|||
|
from the history of the function and does not reflect the way the
|
|||
|
function should be used.
|
|||
|
|
|||
|
Please note that above we wrote "message catalogs" (plural). This
|
|||
|
is a specialty of the GNU implementation of these functions and we
|
|||
|
will say more about this when we talk about the ways message
|
|||
|
catalogs are selected (*note Locating gettext catalog::).
|
|||
|
|
|||
|
The `gettext' function does not modify the value of the global
|
|||
|
`errno' variable. This is necessary to make it possible to write
|
|||
|
something like
|
|||
|
|
|||
|
printf (gettext ("Operation failed: %m\n"));
|
|||
|
|
|||
|
Here the `errno' value is used in the `printf' function while
|
|||
|
processing the `%m' format element and if the `gettext' function
|
|||
|
would change this value (it is called before `printf' is called)
|
|||
|
we would get a wrong message.
|
|||
|
|
|||
|
So there is no easy way to detect a missing message catalog besides
|
|||
|
comparing the argument string with the result. But it is normally
|
|||
|
the task of the user to react on missing catalogs. The program
|
|||
|
cannot guess when a message catalog is really necessary since for
|
|||
|
a user who speaks the language the program was developed in, the
|
|||
|
message does not need any translation.
|
|||
|
|
|||
|
The remaining two functions to access the message catalog add some
|
|||
|
functionality to select a message catalog which is not the default one.
|
|||
|
This is important if parts of the program are developed independently.
|
|||
|
Every part can have its own message catalog and all of them can be used
|
|||
|
at the same time. The C library itself is an example: internally it
|
|||
|
uses the `gettext' functions but since it must not depend on a
|
|||
|
currently selected default message catalog it must specify all ambiguous
|
|||
|
information.
|
|||
|
|
|||
|
-- Function: char * dgettext (const char *DOMAINNAME, const char
|
|||
|
*MSGID)
|
|||
|
Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
|
|||
|
AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `dgettext' function acts just like the `gettext' function. It
|
|||
|
only takes an additional first argument DOMAINNAME which guides
|
|||
|
the selection of the message catalogs which are searched for the
|
|||
|
translation. If the DOMAINNAME parameter is the null pointer the
|
|||
|
`dgettext' function is exactly equivalent to `gettext' since the
|
|||
|
default value for the domain name is used.
|
|||
|
|
|||
|
As for `gettext' the return value type is `char *' which is an
|
|||
|
anachronism. The returned string must never be modified.
|
|||
|
|
|||
|
-- Function: char * dcgettext (const char *DOMAINNAME, const char
|
|||
|
*MSGID, int CATEGORY)
|
|||
|
Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
|
|||
|
AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `dcgettext' adds another argument to those which `dgettext'
|
|||
|
takes. This argument CATEGORY specifies the last piece of
|
|||
|
information needed to localize the message catalog. I.e., the
|
|||
|
domain name and the locale category exactly specify which message
|
|||
|
catalog has to be used (relative to a given directory, see below).
|
|||
|
|
|||
|
The `dgettext' function can be expressed in terms of `dcgettext'
|
|||
|
by using
|
|||
|
|
|||
|
dcgettext (domain, string, LC_MESSAGES)
|
|||
|
|
|||
|
instead of
|
|||
|
|
|||
|
dgettext (domain, string)
|
|||
|
|
|||
|
This also shows which values are expected for the third parameter.
|
|||
|
One has to use the available selectors for the categories
|
|||
|
available in `locale.h'. Normally the available values are
|
|||
|
`LC_CTYPE', `LC_COLLATE', `LC_MESSAGES', `LC_MONETARY',
|
|||
|
`LC_NUMERIC', and `LC_TIME'. Please note that `LC_ALL' must not
|
|||
|
be used and even though the names might suggest this, there is no
|
|||
|
relation to the environment variable of this name.
|
|||
|
|
|||
|
The `dcgettext' function is only implemented for compatibility with
|
|||
|
other systems which have `gettext' functions. There is not really
|
|||
|
any situation where it is necessary (or useful) to use a different
|
|||
|
value than `LC_MESSAGES' for the CATEGORY parameter. We are
|
|||
|
dealing with messages here and any other choice can only be
|
|||
|
irritating.
|
|||
|
|
|||
|
As for `gettext' the return value type is `char *' which is an
|
|||
|
anachronism. The returned string must never be modified.
|
|||
|
|
|||
|
When using the three functions above in a program it is a frequent
|
|||
|
case that the MSGID argument is a constant string. So it is worthwhile
|
|||
|
to optimize this case. Thinking shortly about this one will realize
|
|||
|
that as long as no new message catalog is loaded the translation of a
|
|||
|
message will not change. This optimization is actually implemented by
|
|||
|
the `gettext', `dgettext' and `dcgettext' functions.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Locating gettext catalog, Next: Advanced gettext functions, Prev: Translation with gettext, Up: Message catalogs with gettext
|
|||
|
|
|||
|
8.2.1.2 How to determine which catalog to be used
|
|||
|
.................................................
|
|||
|
|
|||
|
The functions to retrieve the translations for a given message have a
|
|||
|
remarkable simple interface. But to provide the user of the program
|
|||
|
still the opportunity to select exactly the translation s/he wants and
|
|||
|
also to provide the programmer the possibility to influence the way to
|
|||
|
locate the search for catalogs files there is a quite complicated
|
|||
|
underlying mechanism which controls all this. The code is complicated
|
|||
|
the use is easy.
|
|||
|
|
|||
|
Basically we have two different tasks to perform which can also be
|
|||
|
performed by the `catgets' functions:
|
|||
|
|
|||
|
1. Locate the set of message catalogs. There are a number of files
|
|||
|
for different languages which all belong to the package. Usually
|
|||
|
they are all stored in the filesystem below a certain directory.
|
|||
|
|
|||
|
There can be arbitrarily many packages installed and they can
|
|||
|
follow different guidelines for the placement of their files.
|
|||
|
|
|||
|
2. Relative to the location specified by the package the actual
|
|||
|
translation files must be searched, based on the wishes of the
|
|||
|
user. I.e., for each language the user selects the program should
|
|||
|
be able to locate the appropriate file.
|
|||
|
|
|||
|
This is the functionality required by the specifications for
|
|||
|
`gettext' and this is also what the `catgets' functions are able to do.
|
|||
|
But there are some problems unresolved:
|
|||
|
|
|||
|
* The language to be used can be specified in several different ways.
|
|||
|
There is no generally accepted standard for this and the user
|
|||
|
always expects the program to understand what s/he means. E.g.,
|
|||
|
to select the German translation one could write `de', `german', or
|
|||
|
`deutsch' and the program should always react the same.
|
|||
|
|
|||
|
* Sometimes the specification of the user is too detailed. If s/he,
|
|||
|
e.g., specifies `de_DE.ISO-8859-1' which means German, spoken in
|
|||
|
Germany, coded using the ISO 8859-1 character set there is the
|
|||
|
possibility that a message catalog matching this exactly is not
|
|||
|
available. But there could be a catalog matching `de' and if the
|
|||
|
character set used on the machine is always ISO 8859-1 there is no
|
|||
|
reason why this later message catalog should not be used. (We
|
|||
|
call this "message inheritance".)
|
|||
|
|
|||
|
* If a catalog for a wanted language is not available it is not
|
|||
|
always the second best choice to fall back on the language of the
|
|||
|
developer and simply not translate any message. Instead a user
|
|||
|
might be better able to read the messages in another language and
|
|||
|
so the user of the program should be able to define a precedence
|
|||
|
order of languages.
|
|||
|
|
|||
|
We can divide the configuration actions in two parts: the one is
|
|||
|
performed by the programmer, the other by the user. We will start with
|
|||
|
the functions the programmer can use since the user configuration will
|
|||
|
be based on this.
|
|||
|
|
|||
|
As the functions described in the last sections already mention
|
|||
|
separate sets of messages can be selected by a "domain name". This is a
|
|||
|
simple string which should be unique for each program part that uses a
|
|||
|
separate domain. It is possible to use in one program arbitrarily many
|
|||
|
domains at the same time. E.g., the GNU C Library itself uses a domain
|
|||
|
named `libc' while the program using the C Library could use a domain
|
|||
|
named `foo'. The important point is that at any time exactly one
|
|||
|
domain is active. This is controlled with the following function.
|
|||
|
|
|||
|
-- Function: char * textdomain (const char *DOMAINNAME)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `textdomain' function sets the default domain, which is used in
|
|||
|
all future `gettext' calls, to DOMAINNAME. Please note that
|
|||
|
`dgettext' and `dcgettext' calls are not influenced if the
|
|||
|
DOMAINNAME parameter of these functions is not the null pointer.
|
|||
|
|
|||
|
Before the first call to `textdomain' the default domain is
|
|||
|
`messages'. This is the name specified in the specification of
|
|||
|
the `gettext' API. This name is as good as any other name. No
|
|||
|
program should ever really use a domain with this name since this
|
|||
|
can only lead to problems.
|
|||
|
|
|||
|
The function returns the value which is from now on taken as the
|
|||
|
default domain. If the system went out of memory the returned
|
|||
|
value is `NULL' and the global variable `errno' is set to `ENOMEM'.
|
|||
|
Despite the return value type being `char *' the return string must
|
|||
|
not be changed. It is allocated internally by the `textdomain'
|
|||
|
function.
|
|||
|
|
|||
|
If the DOMAINNAME parameter is the null pointer no new default
|
|||
|
domain is set. Instead the currently selected default domain is
|
|||
|
returned.
|
|||
|
|
|||
|
If the DOMAINNAME parameter is the empty string the default domain
|
|||
|
is reset to its initial value, the domain with the name `messages'.
|
|||
|
This possibility is questionable to use since the domain `messages'
|
|||
|
really never should be used.
|
|||
|
|
|||
|
-- Function: char * bindtextdomain (const char *DOMAINNAME, const char
|
|||
|
*DIRNAME)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
|
|||
|
POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `bindtextdomain' function can be used to specify the directory
|
|||
|
which contains the message catalogs for domain DOMAINNAME for the
|
|||
|
different languages. To be correct, this is the directory where
|
|||
|
the hierarchy of directories is expected. Details are explained
|
|||
|
below.
|
|||
|
|
|||
|
For the programmer it is important to note that the translations
|
|||
|
which come with the program have to be placed in a directory
|
|||
|
hierarchy starting at, say, `/foo/bar'. Then the program should
|
|||
|
make a `bindtextdomain' call to bind the domain for the current
|
|||
|
program to this directory. So it is made sure the catalogs are
|
|||
|
found. A correctly running program does not depend on the user
|
|||
|
setting an environment variable.
|
|||
|
|
|||
|
The `bindtextdomain' function can be used several times and if the
|
|||
|
DOMAINNAME argument is different the previously bound domains will
|
|||
|
not be overwritten.
|
|||
|
|
|||
|
If the program which wish to use `bindtextdomain' at some point of
|
|||
|
time use the `chdir' function to change the current working
|
|||
|
directory it is important that the DIRNAME strings ought to be an
|
|||
|
absolute pathname. Otherwise the addressed directory might vary
|
|||
|
with the time.
|
|||
|
|
|||
|
If the DIRNAME parameter is the null pointer `bindtextdomain'
|
|||
|
returns the currently selected directory for the domain with the
|
|||
|
name DOMAINNAME.
|
|||
|
|
|||
|
The `bindtextdomain' function returns a pointer to a string
|
|||
|
containing the name of the selected directory name. The string is
|
|||
|
allocated internally in the function and must not be changed by the
|
|||
|
user. If the system went out of core during the execution of
|
|||
|
`bindtextdomain' the return value is `NULL' and the global
|
|||
|
variable `errno' is set accordingly.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Advanced gettext functions, Next: Charset conversion in gettext, Prev: Locating gettext catalog, Up: Message catalogs with gettext
|
|||
|
|
|||
|
8.2.1.3 Additional functions for more complicated situations
|
|||
|
............................................................
|
|||
|
|
|||
|
The functions of the `gettext' family described so far (and all the
|
|||
|
`catgets' functions as well) have one problem in the real world which
|
|||
|
has been neglected completely in all existing approaches. What is
|
|||
|
meant here is the handling of plural forms.
|
|||
|
|
|||
|
Looking through Unix source code before the time anybody thought
|
|||
|
about internationalization (and, sadly, even afterwards) one can often
|
|||
|
find code similar to the following:
|
|||
|
|
|||
|
printf ("%d file%s deleted", n, n == 1 ? "" : "s");
|
|||
|
|
|||
|
After the first complaints from people internationalizing the code
|
|||
|
people either completely avoided formulations like this or used strings
|
|||
|
like `"file(s)"'. Both look unnatural and should be avoided. First
|
|||
|
tries to solve the problem correctly looked like this:
|
|||
|
|
|||
|
if (n == 1)
|
|||
|
printf ("%d file deleted", n);
|
|||
|
else
|
|||
|
printf ("%d files deleted", n);
|
|||
|
|
|||
|
But this does not solve the problem. It helps languages where the
|
|||
|
plural form of a noun is not simply constructed by adding an `s' but
|
|||
|
that is all. Once again people fell into the trap of believing the
|
|||
|
rules their language uses are universal. But the handling of plural
|
|||
|
forms differs widely between the language families. There are two
|
|||
|
things we can differ between (and even inside language families);
|
|||
|
|
|||
|
* The form how plural forms are build differs. This is a problem
|
|||
|
with language which have many irregularities. German, for
|
|||
|
instance, is a drastic case. Though English and German are part
|
|||
|
of the same language family (Germanic), the almost regular forming
|
|||
|
of plural noun forms (appending an `s') is hardly found in German.
|
|||
|
|
|||
|
* The number of plural forms differ. This is somewhat surprising for
|
|||
|
those who only have experiences with Romanic and Germanic languages
|
|||
|
since here the number is the same (there are two).
|
|||
|
|
|||
|
But other language families have only one form or many forms. More
|
|||
|
information on this in an extra section.
|
|||
|
|
|||
|
The consequence of this is that application writers should not try to
|
|||
|
solve the problem in their code. This would be localization since it is
|
|||
|
only usable for certain, hardcoded language environments. Instead the
|
|||
|
extended `gettext' interface should be used.
|
|||
|
|
|||
|
These extra functions are taking instead of the one key string two
|
|||
|
strings and a numerical argument. The idea behind this is that using
|
|||
|
the numerical argument and the first string as a key, the implementation
|
|||
|
can select using rules specified by the translator the right plural
|
|||
|
form. The two string arguments then will be used to provide a return
|
|||
|
value in case no message catalog is found (similar to the normal
|
|||
|
`gettext' behavior). In this case the rules for Germanic language are
|
|||
|
used and it is assumed that the first string argument is the singular
|
|||
|
form, the second the plural form.
|
|||
|
|
|||
|
This has the consequence that programs without language catalogs can
|
|||
|
display the correct strings only if the program itself is written using
|
|||
|
a Germanic language. This is a limitation but since the GNU C Library
|
|||
|
(as well as the GNU `gettext' package) is written as part of the GNU
|
|||
|
package and the coding standards for the GNU project require programs
|
|||
|
to be written in English, this solution nevertheless fulfills its
|
|||
|
purpose.
|
|||
|
|
|||
|
-- Function: char * ngettext (const char *MSGID1, const char *MSGID2,
|
|||
|
unsigned long int N)
|
|||
|
Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
|
|||
|
AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `ngettext' function is similar to the `gettext' function as it
|
|||
|
finds the message catalogs in the same way. But it takes two
|
|||
|
extra arguments. The MSGID1 parameter must contain the singular
|
|||
|
form of the string to be converted. It is also used as the key
|
|||
|
for the search in the catalog. The MSGID2 parameter is the plural
|
|||
|
form. The parameter N is used to determine the plural form. If no
|
|||
|
message catalog is found MSGID1 is returned if `n == 1', otherwise
|
|||
|
`msgid2'.
|
|||
|
|
|||
|
An example for the use of this function is:
|
|||
|
|
|||
|
printf (ngettext ("%d file removed", "%d files removed", n), n);
|
|||
|
|
|||
|
Please note that the numeric value N has to be passed to the
|
|||
|
`printf' function as well. It is not sufficient to pass it only to
|
|||
|
`ngettext'.
|
|||
|
|
|||
|
-- Function: char * dngettext (const char *DOMAIN, const char *MSGID1,
|
|||
|
const char *MSGID2, unsigned long int N)
|
|||
|
Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
|
|||
|
AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `dngettext' is similar to the `dgettext' function in the way
|
|||
|
the message catalog is selected. The difference is that it takes
|
|||
|
two extra parameters to provide the correct plural form. These two
|
|||
|
parameters are handled in the same way `ngettext' handles them.
|
|||
|
|
|||
|
-- Function: char * dcngettext (const char *DOMAIN, const char
|
|||
|
*MSGID1, const char *MSGID2, unsigned long int N, int
|
|||
|
CATEGORY)
|
|||
|
Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
|
|||
|
AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `dcngettext' is similar to the `dcgettext' function in the way
|
|||
|
the message catalog is selected. The difference is that it takes
|
|||
|
two extra parameters to provide the correct plural form. These two
|
|||
|
parameters are handled in the same way `ngettext' handles them.
|
|||
|
|
|||
|
The problem of plural forms
|
|||
|
...........................
|
|||
|
|
|||
|
A description of the problem can be found at the beginning of the last
|
|||
|
section. Now there is the question how to solve it. Without the input
|
|||
|
of linguists (which was not available) it was not possible to determine
|
|||
|
whether there are only a few different forms in which plural forms are
|
|||
|
formed or whether the number can increase with every new supported
|
|||
|
language.
|
|||
|
|
|||
|
Therefore the solution implemented is to allow the translator to
|
|||
|
specify the rules of how to select the plural form. Since the formula
|
|||
|
varies with every language this is the only viable solution except for
|
|||
|
hardcoding the information in the code (which still would require the
|
|||
|
possibility of extensions to not prevent the use of new languages). The
|
|||
|
details are explained in the GNU `gettext' manual. Here only a bit of
|
|||
|
information is provided.
|
|||
|
|
|||
|
The information about the plural form selection has to be stored in
|
|||
|
the header entry (the one with the empty `msgid' string). It looks
|
|||
|
like this:
|
|||
|
|
|||
|
Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;
|
|||
|
|
|||
|
The `nplurals' value must be a decimal number which specifies how
|
|||
|
many different plural forms exist for this language. The string
|
|||
|
following `plural' is an expression using the C language syntax.
|
|||
|
Exceptions are that no negative numbers are allowed, numbers must be
|
|||
|
decimal, and the only variable allowed is `n'. This expression will be
|
|||
|
evaluated whenever one of the functions `ngettext', `dngettext', or
|
|||
|
`dcngettext' is called. The numeric value passed to these functions is
|
|||
|
then substituted for all uses of the variable `n' in the expression.
|
|||
|
The resulting value then must be greater or equal to zero and smaller
|
|||
|
than the value given as the value of `nplurals'.
|
|||
|
|
|||
|
The following rules are known at this point. The language with families
|
|||
|
are listed. But this does not necessarily mean the information can be
|
|||
|
generalized for the whole family (as can be easily seen in the table
|
|||
|
below).(1)
|
|||
|
|
|||
|
Only one form:
|
|||
|
Some languages only require one single form. There is no
|
|||
|
distinction between the singular and plural form. An appropriate
|
|||
|
header entry would look like this:
|
|||
|
|
|||
|
Plural-Forms: nplurals=1; plural=0;
|
|||
|
|
|||
|
Languages with this property include:
|
|||
|
|
|||
|
Finno-Ugric family
|
|||
|
Hungarian
|
|||
|
|
|||
|
Asian family
|
|||
|
Japanese, Korean
|
|||
|
|
|||
|
Turkic/Altaic family
|
|||
|
Turkish
|
|||
|
|
|||
|
Two forms, singular used for one only
|
|||
|
This is the form used in most existing programs since it is what
|
|||
|
English uses. A header entry would look like this:
|
|||
|
|
|||
|
Plural-Forms: nplurals=2; plural=n != 1;
|
|||
|
|
|||
|
(Note: this uses the feature of C expressions that boolean
|
|||
|
expressions have to value zero or one.)
|
|||
|
|
|||
|
Languages with this property include:
|
|||
|
|
|||
|
Germanic family
|
|||
|
Danish, Dutch, English, German, Norwegian, Swedish
|
|||
|
|
|||
|
Finno-Ugric family
|
|||
|
Estonian, Finnish
|
|||
|
|
|||
|
Latin/Greek family
|
|||
|
Greek
|
|||
|
|
|||
|
Semitic family
|
|||
|
Hebrew
|
|||
|
|
|||
|
Romance family
|
|||
|
Italian, Portuguese, Spanish
|
|||
|
|
|||
|
Artificial
|
|||
|
Esperanto
|
|||
|
|
|||
|
Two forms, singular used for zero and one
|
|||
|
Exceptional case in the language family. The header entry would
|
|||
|
be:
|
|||
|
|
|||
|
Plural-Forms: nplurals=2; plural=n>1;
|
|||
|
|
|||
|
Languages with this property include:
|
|||
|
|
|||
|
Romanic family
|
|||
|
French, Brazilian Portuguese
|
|||
|
|
|||
|
Three forms, special case for zero
|
|||
|
The header entry would be:
|
|||
|
|
|||
|
Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;
|
|||
|
|
|||
|
Languages with this property include:
|
|||
|
|
|||
|
Baltic family
|
|||
|
Latvian
|
|||
|
|
|||
|
Three forms, special cases for one and two
|
|||
|
The header entry would be:
|
|||
|
|
|||
|
Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;
|
|||
|
|
|||
|
Languages with this property include:
|
|||
|
|
|||
|
Celtic
|
|||
|
Gaeilge (Irish)
|
|||
|
|
|||
|
Three forms, special case for numbers ending in 1[2-9]
|
|||
|
The header entry would look like this:
|
|||
|
|
|||
|
Plural-Forms: nplurals=3; \
|
|||
|
plural=n%10==1 && n%100!=11 ? 0 : \
|
|||
|
n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2;
|
|||
|
|
|||
|
Languages with this property include:
|
|||
|
|
|||
|
Baltic family
|
|||
|
Lithuanian
|
|||
|
|
|||
|
Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]
|
|||
|
The header entry would look like this:
|
|||
|
|
|||
|
Plural-Forms: nplurals=3; \
|
|||
|
plural=n%100/10==1 ? 2 : n%10==1 ? 0 : (n+9)%10>3 ? 2 : 1;
|
|||
|
|
|||
|
Languages with this property include:
|
|||
|
|
|||
|
Slavic family
|
|||
|
Croatian, Czech, Russian, Ukrainian
|
|||
|
|
|||
|
Three forms, special cases for 1 and 2, 3, 4
|
|||
|
The header entry would look like this:
|
|||
|
|
|||
|
Plural-Forms: nplurals=3; \
|
|||
|
plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;
|
|||
|
|
|||
|
Languages with this property include:
|
|||
|
|
|||
|
Slavic family
|
|||
|
Slovak
|
|||
|
|
|||
|
Three forms, special case for one and some numbers ending in 2, 3, or 4
|
|||
|
The header entry would look like this:
|
|||
|
|
|||
|
Plural-Forms: nplurals=3; \
|
|||
|
plural=n==1 ? 0 : \
|
|||
|
n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
|
|||
|
|
|||
|
Languages with this property include:
|
|||
|
|
|||
|
Slavic family
|
|||
|
Polish
|
|||
|
|
|||
|
Four forms, special case for one and all numbers ending in 02, 03, or 04
|
|||
|
The header entry would look like this:
|
|||
|
|
|||
|
Plural-Forms: nplurals=4; \
|
|||
|
plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;
|
|||
|
|
|||
|
Languages with this property include:
|
|||
|
|
|||
|
Slavic family
|
|||
|
Slovenian
|
|||
|
|
|||
|
---------- Footnotes ----------
|
|||
|
|
|||
|
(1) Additions are welcome. Send appropriate information to
|
|||
|
<bug-glibc-manual@gnu.org>.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Charset conversion in gettext, Next: GUI program problems, Prev: Advanced gettext functions, Up: Message catalogs with gettext
|
|||
|
|
|||
|
8.2.1.4 How to specify the output character set `gettext' uses
|
|||
|
..............................................................
|
|||
|
|
|||
|
`gettext' not only looks up a translation in a message catalog, it also
|
|||
|
converts the translation on the fly to the desired output character
|
|||
|
set. This is useful if the user is working in a different character set
|
|||
|
than the translator who created the message catalog, because it avoids
|
|||
|
distributing variants of message catalogs which differ only in the
|
|||
|
character set.
|
|||
|
|
|||
|
The output character set is, by default, the value of `nl_langinfo
|
|||
|
(CODESET)', which depends on the `LC_CTYPE' part of the current locale.
|
|||
|
But programs which store strings in a locale independent way (e.g.
|
|||
|
UTF-8) can request that `gettext' and related functions return the
|
|||
|
translations in that encoding, by use of the `bind_textdomain_codeset'
|
|||
|
function.
|
|||
|
|
|||
|
Note that the MSGID argument to `gettext' is not subject to
|
|||
|
character set conversion. Also, when `gettext' does not find a
|
|||
|
translation for MSGID, it returns MSGID unchanged - independently of
|
|||
|
the current output character set. It is therefore recommended that all
|
|||
|
MSGIDs be US-ASCII strings.
|
|||
|
|
|||
|
-- Function: char * bind_textdomain_codeset (const char *DOMAINNAME,
|
|||
|
const char *CODESET)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
|
|||
|
POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `bind_textdomain_codeset' function can be used to specify the
|
|||
|
output character set for message catalogs for domain DOMAINNAME.
|
|||
|
The CODESET argument must be a valid codeset name which can be used
|
|||
|
for the `iconv_open' function, or a null pointer.
|
|||
|
|
|||
|
If the CODESET parameter is the null pointer,
|
|||
|
`bind_textdomain_codeset' returns the currently selected codeset
|
|||
|
for the domain with the name DOMAINNAME. It returns `NULL' if no
|
|||
|
codeset has yet been selected.
|
|||
|
|
|||
|
The `bind_textdomain_codeset' function can be used several times.
|
|||
|
If used multiple times with the same DOMAINNAME argument, the
|
|||
|
later call overrides the settings made by the earlier one.
|
|||
|
|
|||
|
The `bind_textdomain_codeset' function returns a pointer to a
|
|||
|
string containing the name of the selected codeset. The string is
|
|||
|
allocated internally in the function and must not be changed by the
|
|||
|
user. If the system went out of core during the execution of
|
|||
|
`bind_textdomain_codeset', the return value is `NULL' and the
|
|||
|
global variable `errno' is set accordingly.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: GUI program problems, Next: Using gettextized software, Prev: Charset conversion in gettext, Up: Message catalogs with gettext
|
|||
|
|
|||
|
8.2.1.5 How to use `gettext' in GUI programs
|
|||
|
............................................
|
|||
|
|
|||
|
One place where the `gettext' functions, if used normally, have big
|
|||
|
problems is within programs with graphical user interfaces (GUIs). The
|
|||
|
problem is that many of the strings which have to be translated are very
|
|||
|
short. They have to appear in pull-down menus which restricts the
|
|||
|
length. But strings which are not containing entire sentences or at
|
|||
|
least large fragments of a sentence may appear in more than one
|
|||
|
situation in the program but might have different translations. This is
|
|||
|
especially true for the one-word strings which are frequently used in
|
|||
|
GUI programs.
|
|||
|
|
|||
|
As a consequence many people say that the `gettext' approach is
|
|||
|
wrong and instead `catgets' should be used which indeed does not have
|
|||
|
this problem. But there is a very simple and powerful method to handle
|
|||
|
these kind of problems with the `gettext' functions.
|
|||
|
|
|||
|
As an example consider the following fictional situation. A GUI program
|
|||
|
has a menu bar with the following entries:
|
|||
|
|
|||
|
+------------+------------+--------------------------------------+
|
|||
|
| File | Printer | |
|
|||
|
+------------+------------+--------------------------------------+
|
|||
|
| Open | | Select |
|
|||
|
| New | | Open |
|
|||
|
+----------+ | Connect |
|
|||
|
+----------+
|
|||
|
|
|||
|
To have the strings `File', `Printer', `Open', `New', `Select', and
|
|||
|
`Connect' translated there has to be at some point in the code a call
|
|||
|
to a function of the `gettext' family. But in two places the string
|
|||
|
passed into the function would be `Open'. The translations might not
|
|||
|
be the same and therefore we are in the dilemma described above.
|
|||
|
|
|||
|
One solution to this problem is to artificially extend the strings
|
|||
|
to make them unambiguous. But what would the program do if no
|
|||
|
translation is available? The extended string is not what should be
|
|||
|
printed. So we should use a slightly modified version of the functions.
|
|||
|
|
|||
|
To extend the strings a uniform method should be used. E.g., in the
|
|||
|
example above, the strings could be chosen as
|
|||
|
|
|||
|
Menu|File
|
|||
|
Menu|Printer
|
|||
|
Menu|File|Open
|
|||
|
Menu|File|New
|
|||
|
Menu|Printer|Select
|
|||
|
Menu|Printer|Open
|
|||
|
Menu|Printer|Connect
|
|||
|
|
|||
|
Now all the strings are different and if now instead of `gettext'
|
|||
|
the following little wrapper function is used, everything works just
|
|||
|
fine:
|
|||
|
|
|||
|
char *
|
|||
|
sgettext (const char *msgid)
|
|||
|
{
|
|||
|
char *msgval = gettext (msgid);
|
|||
|
if (msgval == msgid)
|
|||
|
msgval = strrchr (msgid, '|') + 1;
|
|||
|
return msgval;
|
|||
|
}
|
|||
|
|
|||
|
What this little function does is to recognize the case when no
|
|||
|
translation is available. This can be done very efficiently by a
|
|||
|
pointer comparison since the return value is the input value. If there
|
|||
|
is no translation we know that the input string is in the format we used
|
|||
|
for the Menu entries and therefore contains a `|' character. We simply
|
|||
|
search for the last occurrence of this character and return a pointer
|
|||
|
to the character following it. That's it!
|
|||
|
|
|||
|
If one now consistently uses the extended string form and replaces
|
|||
|
the `gettext' calls with calls to `sgettext' (this is normally limited
|
|||
|
to very few places in the GUI implementation) then it is possible to
|
|||
|
produce a program which can be internationalized.
|
|||
|
|
|||
|
With advanced compilers (such as GNU C) one can write the `sgettext'
|
|||
|
functions as an inline function or as a macro like this:
|
|||
|
|
|||
|
#define sgettext(msgid) \
|
|||
|
({ const char *__msgid = (msgid); \
|
|||
|
char *__msgstr = gettext (__msgid); \
|
|||
|
if (__msgval == __msgid) \
|
|||
|
__msgval = strrchr (__msgid, '|') + 1; \
|
|||
|
__msgval; })
|
|||
|
|
|||
|
The other `gettext' functions (`dgettext', `dcgettext' and the
|
|||
|
`ngettext' equivalents) can and should have corresponding functions as
|
|||
|
well which look almost identical, except for the parameters and the
|
|||
|
call to the underlying function.
|
|||
|
|
|||
|
Now there is of course the question why such functions do not exist
|
|||
|
in the GNU C Library? There are two parts of the answer to this
|
|||
|
question.
|
|||
|
|
|||
|
* They are easy to write and therefore can be provided by the
|
|||
|
project they are used in. This is not an answer by itself and
|
|||
|
must be seen together with the second part which is:
|
|||
|
|
|||
|
* There is no way the C library can contain a version which can work
|
|||
|
everywhere. The problem is the selection of the character to
|
|||
|
separate the prefix from the actual string in the extended string.
|
|||
|
The examples above used `|' which is a quite good choice because it
|
|||
|
resembles a notation frequently used in this context and it also
|
|||
|
is a character not often used in message strings.
|
|||
|
|
|||
|
But what if the character is used in message strings. Or if the
|
|||
|
chose character is not available in the character set on the
|
|||
|
machine one compiles (e.g., `|' is not required to exist for
|
|||
|
ISO C; this is why the `iso646.h' file exists in ISO C programming
|
|||
|
environments).
|
|||
|
|
|||
|
There is only one more comment to make left. The wrapper function
|
|||
|
above requires that the translations strings are not extended
|
|||
|
themselves. This is only logical. There is no need to disambiguate
|
|||
|
the strings (since they are never used as keys for a search) and one
|
|||
|
also saves quite some memory and disk space by doing this.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Using gettextized software, Prev: GUI program problems, Up: Message catalogs with gettext
|
|||
|
|
|||
|
8.2.1.6 User influence on `gettext'
|
|||
|
...................................
|
|||
|
|
|||
|
The last sections described what the programmer can do to
|
|||
|
internationalize the messages of the program. But it is finally up to
|
|||
|
the user to select the message s/he wants to see. S/He must understand
|
|||
|
them.
|
|||
|
|
|||
|
The POSIX locale model uses the environment variables `LC_COLLATE',
|
|||
|
`LC_CTYPE', `LC_MESSAGES', `LC_MONETARY', `LC_NUMERIC', and `LC_TIME'
|
|||
|
to select the locale which is to be used. This way the user can
|
|||
|
influence lots of functions. As we mentioned above, the `gettext'
|
|||
|
functions also take advantage of this.
|
|||
|
|
|||
|
To understand how this happens it is necessary to take a look at the
|
|||
|
various components of the filename which gets computed to locate a
|
|||
|
message catalog. It is composed as follows:
|
|||
|
|
|||
|
DIR_NAME/LOCALE/LC_CATEGORY/DOMAIN_NAME.mo
|
|||
|
|
|||
|
The default value for DIR_NAME is system specific. It is computed
|
|||
|
from the value given as the prefix while configuring the C library.
|
|||
|
This value normally is `/usr' or `/'. For the former the complete
|
|||
|
DIR_NAME is:
|
|||
|
|
|||
|
/usr/share/locale
|
|||
|
|
|||
|
We can use `/usr/share' since the `.mo' files containing the message
|
|||
|
catalogs are system independent, so all systems can use the same files.
|
|||
|
If the program executed the `bindtextdomain' function for the message
|
|||
|
domain that is currently handled, the `dir_name' component is exactly
|
|||
|
the value which was given to the function as the second parameter.
|
|||
|
I.e., `bindtextdomain' allows overwriting the only system dependent and
|
|||
|
fixed value to make it possible to address files anywhere in the
|
|||
|
filesystem.
|
|||
|
|
|||
|
The CATEGORY is the name of the locale category which was selected
|
|||
|
in the program code. For `gettext' and `dgettext' this is always
|
|||
|
`LC_MESSAGES', for `dcgettext' this is selected by the value of the
|
|||
|
third parameter. As said above it should be avoided to ever use a
|
|||
|
category other than `LC_MESSAGES'.
|
|||
|
|
|||
|
The LOCALE component is computed based on the category used. Just
|
|||
|
like for the `setlocale' function here comes the user selection into
|
|||
|
the play. Some environment variables are examined in a fixed order and
|
|||
|
the first environment variable set determines the return value of the
|
|||
|
lookup process. In detail, for the category `LC_xxx' the following
|
|||
|
variables in this order are examined:
|
|||
|
|
|||
|
`LANGUAGE'
|
|||
|
|
|||
|
`LC_ALL'
|
|||
|
|
|||
|
`LC_xxx'
|
|||
|
|
|||
|
`LANG'
|
|||
|
|
|||
|
This looks very familiar. With the exception of the `LANGUAGE'
|
|||
|
environment variable this is exactly the lookup order the `setlocale'
|
|||
|
function uses. But why introduce the `LANGUAGE' variable?
|
|||
|
|
|||
|
The reason is that the syntax of the values these variables can have
|
|||
|
is different to what is expected by the `setlocale' function. If we
|
|||
|
would set `LC_ALL' to a value following the extended syntax that would
|
|||
|
mean the `setlocale' function will never be able to use the value of
|
|||
|
this variable as well. An additional variable removes this problem
|
|||
|
plus we can select the language independently of the locale setting
|
|||
|
which sometimes is useful.
|
|||
|
|
|||
|
While for the `LC_xxx' variables the value should consist of exactly
|
|||
|
one specification of a locale the `LANGUAGE' variable's value can
|
|||
|
consist of a colon separated list of locale names. The attentive
|
|||
|
reader will realize that this is the way we manage to implement one of
|
|||
|
our additional demands above: we want to be able to specify an ordered
|
|||
|
list of languages.
|
|||
|
|
|||
|
Back to the constructed filename we have only one component missing.
|
|||
|
The DOMAIN_NAME part is the name which was either registered using the
|
|||
|
`textdomain' function or which was given to `dgettext' or `dcgettext'
|
|||
|
as the first parameter. Now it becomes obvious that a good choice for
|
|||
|
the domain name in the program code is a string which is closely
|
|||
|
related to the program/package name. E.g., for the GNU C Library the
|
|||
|
domain name is `libc'.
|
|||
|
|
|||
|
A limited piece of example code should show how the program is supposed
|
|||
|
to work:
|
|||
|
|
|||
|
{
|
|||
|
setlocale (LC_ALL, "");
|
|||
|
textdomain ("test-package");
|
|||
|
bindtextdomain ("test-package", "/usr/local/share/locale");
|
|||
|
puts (gettext ("Hello, world!"));
|
|||
|
}
|
|||
|
|
|||
|
At the program start the default domain is `messages', and the
|
|||
|
default locale is "C". The `setlocale' call sets the locale according
|
|||
|
to the user's environment variables; remember that correct functioning
|
|||
|
of `gettext' relies on the correct setting of the `LC_MESSAGES' locale
|
|||
|
(for looking up the message catalog) and of the `LC_CTYPE' locale (for
|
|||
|
the character set conversion). The `textdomain' call changes the
|
|||
|
default domain to `test-package'. The `bindtextdomain' call specifies
|
|||
|
that the message catalogs for the domain `test-package' can be found
|
|||
|
below the directory `/usr/local/share/locale'.
|
|||
|
|
|||
|
If the user sets in her/his environment the variable `LANGUAGE' to
|
|||
|
`de' the `gettext' function will try to use the translations from the
|
|||
|
file
|
|||
|
|
|||
|
/usr/local/share/locale/de/LC_MESSAGES/test-package.mo
|
|||
|
|
|||
|
From the above descriptions it should be clear which component of
|
|||
|
this filename is determined by which source.
|
|||
|
|
|||
|
In the above example we assumed the `LANGUAGE' environment variable
|
|||
|
to be `de'. This might be an appropriate selection but what happens if
|
|||
|
the user wants to use `LC_ALL' because of the wider usability and here
|
|||
|
the required value is `de_DE.ISO-8859-1'? We already mentioned above
|
|||
|
that a situation like this is not infrequent. E.g., a person might
|
|||
|
prefer reading a dialect and if this is not available fall back on the
|
|||
|
standard language.
|
|||
|
|
|||
|
The `gettext' functions know about situations like this and can
|
|||
|
handle them gracefully. The functions recognize the format of the value
|
|||
|
of the environment variable. It can split the value is different pieces
|
|||
|
and by leaving out the only or the other part it can construct new
|
|||
|
values. This happens of course in a predictable way. To understand
|
|||
|
this one must know the format of the environment variable value. There
|
|||
|
is one more or less standardized form, originally from the X/Open
|
|||
|
specification:
|
|||
|
|
|||
|
`language[_territory[.codeset]][@modifier]'
|
|||
|
|
|||
|
Less specific locale names will be stripped in the order of the
|
|||
|
following list:
|
|||
|
|
|||
|
1. `codeset'
|
|||
|
|
|||
|
2. `normalized codeset'
|
|||
|
|
|||
|
3. `territory'
|
|||
|
|
|||
|
4. `modifier'
|
|||
|
|
|||
|
The `language' field will never be dropped for obvious reasons.
|
|||
|
|
|||
|
The only new thing is the `normalized codeset' entry. This is
|
|||
|
another goodie which is introduced to help reduce the chaos which
|
|||
|
derives from the inability of people to standardize the names of
|
|||
|
character sets. Instead of ISO-8859-1 one can often see 8859-1, 88591,
|
|||
|
iso8859-1, or iso_8859-1. The `normalized codeset' value is generated
|
|||
|
from the user-provided character set name by applying the following
|
|||
|
rules:
|
|||
|
|
|||
|
1. Remove all characters besides numbers and letters.
|
|||
|
|
|||
|
2. Fold letters to lowercase.
|
|||
|
|
|||
|
3. If the same only contains digits prepend the string `"iso"'.
|
|||
|
|
|||
|
So all of the above names will be normalized to `iso88591'. This
|
|||
|
allows the program user much more freedom in choosing the locale name.
|
|||
|
|
|||
|
Even this extended functionality still does not help to solve the
|
|||
|
problem that completely different names can be used to denote the same
|
|||
|
locale (e.g., `de' and `german'). To be of help in this situation the
|
|||
|
locale implementation and also the `gettext' functions know about
|
|||
|
aliases.
|
|||
|
|
|||
|
The file `/usr/share/locale/locale.alias' (replace `/usr' with
|
|||
|
whatever prefix you used for configuring the C library) contains a
|
|||
|
mapping of alternative names to more regular names. The system manager
|
|||
|
is free to add new entries to fill her/his own needs. The selected
|
|||
|
locale from the environment is compared with the entries in the first
|
|||
|
column of this file ignoring the case. If they match, the value of the
|
|||
|
second column is used instead for the further handling.
|
|||
|
|
|||
|
In the description of the format of the environment variables we
|
|||
|
already mentioned the character set as a factor in the selection of the
|
|||
|
message catalog. In fact, only catalogs which contain text written
|
|||
|
using the character set of the system/program can be used (directly;
|
|||
|
there will come a solution for this some day). This means for the user
|
|||
|
that s/he will always have to take care of this. If in the collection
|
|||
|
of the message catalogs there are files for the same language but coded
|
|||
|
using different character sets the user has to be careful.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Helper programs for gettext, Prev: Message catalogs with gettext, Up: The Uniforum approach
|
|||
|
|
|||
|
8.2.2 Programs to handle message catalogs for `gettext'
|
|||
|
-------------------------------------------------------
|
|||
|
|
|||
|
The GNU C Library does not contain the source code for the programs to
|
|||
|
handle message catalogs for the `gettext' functions. As part of the
|
|||
|
GNU project the GNU gettext package contains everything the developer
|
|||
|
needs. The functionality provided by the tools in this package by far
|
|||
|
exceeds the abilities of the `gencat' program described above for the
|
|||
|
`catgets' functions.
|
|||
|
|
|||
|
There is a program `msgfmt' which is the equivalent program to the
|
|||
|
`gencat' program. It generates from the human-readable and -editable
|
|||
|
form of the message catalog a binary file which can be used by the
|
|||
|
`gettext' functions. But there are several more programs available.
|
|||
|
|
|||
|
The `xgettext' program can be used to automatically extract the
|
|||
|
translatable messages from a source file. I.e., the programmer need not
|
|||
|
take care of the translations and the list of messages which have to be
|
|||
|
translated. S/He will simply wrap the translatable string in calls to
|
|||
|
`gettext' et.al and the rest will be done by `xgettext'. This program
|
|||
|
has a lot of options which help to customize the output or help to
|
|||
|
understand the input better.
|
|||
|
|
|||
|
Other programs help to manage the development cycle when new
|
|||
|
messages appear in the source files or when a new translation of the
|
|||
|
messages appears. Here it should only be noted that using all the
|
|||
|
tools in GNU gettext it is possible to _completely_ automate the
|
|||
|
handling of message catalogs. Besides marking the translatable strings
|
|||
|
in the source code and generating the translations the developers do
|
|||
|
not have anything to do themselves.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Searching and Sorting, Next: Pattern Matching, Prev: Message Translation, Up: Top
|
|||
|
|
|||
|
9 Searching and Sorting
|
|||
|
***********************
|
|||
|
|
|||
|
This chapter describes functions for searching and sorting arrays of
|
|||
|
arbitrary objects. You pass the appropriate comparison function to be
|
|||
|
applied as an argument, along with the size of the objects in the array
|
|||
|
and the total number of elements.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Comparison Functions:: Defining how to compare two objects.
|
|||
|
Since the sort and search facilities
|
|||
|
are general, you have to specify the
|
|||
|
ordering.
|
|||
|
* Array Search Function:: The `bsearch' function.
|
|||
|
* Array Sort Function:: The `qsort' function.
|
|||
|
* Search/Sort Example:: An example program.
|
|||
|
* Hash Search Function:: The `hsearch' function.
|
|||
|
* Tree Search Function:: The `tsearch' function.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Comparison Functions, Next: Array Search Function, Up: Searching and Sorting
|
|||
|
|
|||
|
9.1 Defining the Comparison Function
|
|||
|
====================================
|
|||
|
|
|||
|
In order to use the sorted array library functions, you have to describe
|
|||
|
how to compare the elements of the array.
|
|||
|
|
|||
|
To do this, you supply a comparison function to compare two elements
|
|||
|
of the array. The library will call this function, passing as arguments
|
|||
|
pointers to two array elements to be compared. Your comparison function
|
|||
|
should return a value the way `strcmp' (*note String/Array
|
|||
|
Comparison::) does: negative if the first argument is "less" than the
|
|||
|
second, zero if they are "equal", and positive if the first argument is
|
|||
|
"greater".
|
|||
|
|
|||
|
Here is an example of a comparison function which works with an
|
|||
|
array of numbers of type `double':
|
|||
|
|
|||
|
int
|
|||
|
compare_doubles (const void *a, const void *b)
|
|||
|
{
|
|||
|
const double *da = (const double *) a;
|
|||
|
const double *db = (const double *) b;
|
|||
|
|
|||
|
return (*da > *db) - (*da < *db);
|
|||
|
}
|
|||
|
|
|||
|
The header file `stdlib.h' defines a name for the data type of
|
|||
|
comparison functions. This type is a GNU extension.
|
|||
|
|
|||
|
int comparison_fn_t (const void *, const void *);
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Array Search Function, Next: Array Sort Function, Prev: Comparison Functions, Up: Searching and Sorting
|
|||
|
|
|||
|
9.2 Array Search Function
|
|||
|
=========================
|
|||
|
|
|||
|
Generally searching for a specific element in an array means that
|
|||
|
potentially all elements must be checked. The GNU C Library contains
|
|||
|
functions to perform linear search. The prototypes for the following
|
|||
|
two functions can be found in `search.h'.
|
|||
|
|
|||
|
-- Function: void * lfind (const void *KEY, const void *BASE, size_t
|
|||
|
*NMEMB, size_t SIZE, comparison_fn_t COMPAR)
|
|||
|
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
|||
|
Concepts::.
|
|||
|
|
|||
|
The `lfind' function searches in the array with `*NMEMB' elements
|
|||
|
of SIZE bytes pointed to by BASE for an element which matches the
|
|||
|
one pointed to by KEY. The function pointed to by COMPAR is used
|
|||
|
to decide whether two elements match.
|
|||
|
|
|||
|
The return value is a pointer to the matching element in the array
|
|||
|
starting at BASE if it is found. If no matching element is
|
|||
|
available `NULL' is returned.
|
|||
|
|
|||
|
The mean runtime of this function is `*NMEMB'/2. This function
|
|||
|
should only be used if elements often get added to or deleted from
|
|||
|
the array in which case it might not be useful to sort the array
|
|||
|
before searching.
|
|||
|
|
|||
|
-- Function: void * lsearch (const void *KEY, void *BASE, size_t
|
|||
|
*NMEMB, size_t SIZE, comparison_fn_t COMPAR)
|
|||
|
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
|||
|
Concepts::.
|
|||
|
|
|||
|
The `lsearch' function is similar to the `lfind' function. It
|
|||
|
searches the given array for an element and returns it if found.
|
|||
|
The difference is that if no matching element is found the
|
|||
|
`lsearch' function adds the object pointed to by KEY (with a size
|
|||
|
of SIZE bytes) at the end of the array and it increments the value
|
|||
|
of `*NMEMB' to reflect this addition.
|
|||
|
|
|||
|
This means for the caller that if it is not sure that the array
|
|||
|
contains the element one is searching for the memory allocated for
|
|||
|
the array starting at BASE must have room for at least SIZE more
|
|||
|
bytes. If one is sure the element is in the array it is better to
|
|||
|
use `lfind' so having more room in the array is always necessary
|
|||
|
when calling `lsearch'.
|
|||
|
|
|||
|
To search a sorted array for an element matching the key, use the
|
|||
|
`bsearch' function. The prototype for this function is in the header
|
|||
|
file `stdlib.h'.
|
|||
|
|
|||
|
-- Function: void * bsearch (const void *KEY, const void *ARRAY,
|
|||
|
size_t COUNT, size_t SIZE, comparison_fn_t COMPARE)
|
|||
|
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
|||
|
Concepts::.
|
|||
|
|
|||
|
The `bsearch' function searches the sorted array ARRAY for an
|
|||
|
object that is equivalent to KEY. The array contains COUNT
|
|||
|
elements, each of which is of size SIZE bytes.
|
|||
|
|
|||
|
The COMPARE function is used to perform the comparison. This
|
|||
|
function is called with two pointer arguments and should return an
|
|||
|
integer less than, equal to, or greater than zero corresponding to
|
|||
|
whether its first argument is considered less than, equal to, or
|
|||
|
greater than its second argument. The elements of the ARRAY must
|
|||
|
already be sorted in ascending order according to this comparison
|
|||
|
function.
|
|||
|
|
|||
|
The return value is a pointer to the matching array element, or a
|
|||
|
null pointer if no match is found. If the array contains more
|
|||
|
than one element that matches, the one that is returned is
|
|||
|
unspecified.
|
|||
|
|
|||
|
This function derives its name from the fact that it is implemented
|
|||
|
using the binary search algorithm.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Array Sort Function, Next: Search/Sort Example, Prev: Array Search Function, Up: Searching and Sorting
|
|||
|
|
|||
|
9.3 Array Sort Function
|
|||
|
=======================
|
|||
|
|
|||
|
To sort an array using an arbitrary comparison function, use the
|
|||
|
`qsort' function. The prototype for this function is in `stdlib.h'.
|
|||
|
|
|||
|
-- Function: void qsort (void *ARRAY, size_t COUNT, size_t SIZE,
|
|||
|
comparison_fn_t COMPARE)
|
|||
|
Preliminary: | MT-Safe | AS-Safe | AC-Unsafe corrupt | *Note POSIX
|
|||
|
Safety Concepts::.
|
|||
|
|
|||
|
The `qsort' function sorts the array ARRAY. The array contains
|
|||
|
COUNT elements, each of which is of size SIZE.
|
|||
|
|
|||
|
The COMPARE function is used to perform the comparison on the
|
|||
|
array elements. This function is called with two pointer
|
|||
|
arguments and should return an integer less than, equal to, or
|
|||
|
greater than zero corresponding to whether its first argument is
|
|||
|
considered less than, equal to, or greater than its second
|
|||
|
argument.
|
|||
|
|
|||
|
*Warning:* If two objects compare as equal, their order after
|
|||
|
sorting is unpredictable. That is to say, the sorting is not
|
|||
|
stable. This can make a difference when the comparison considers
|
|||
|
only part of the elements. Two elements with the same sort key
|
|||
|
may differ in other respects.
|
|||
|
|
|||
|
Although the object addresses passed to the comparison function lie
|
|||
|
within the array, they need not correspond with the original
|
|||
|
locations of those objects because the sorting algorithm may swap
|
|||
|
around objects in the array before making some comparisons. The
|
|||
|
only way to perform a stable sort with `qsort' is to first augment
|
|||
|
the objects with a monotonic counter of some kind.
|
|||
|
|
|||
|
Here is a simple example of sorting an array of doubles in
|
|||
|
numerical order, using the comparison function defined above
|
|||
|
(*note Comparison Functions::):
|
|||
|
|
|||
|
{
|
|||
|
double *array;
|
|||
|
int size;
|
|||
|
...
|
|||
|
qsort (array, size, sizeof (double), compare_doubles);
|
|||
|
}
|
|||
|
|
|||
|
The `qsort' function derives its name from the fact that it was
|
|||
|
originally implemented using the "quick sort" algorithm.
|
|||
|
|
|||
|
The implementation of `qsort' in this library might not be an
|
|||
|
in-place sort and might thereby use an extra amount of memory to
|
|||
|
store the array.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Search/Sort Example, Next: Hash Search Function, Prev: Array Sort Function, Up: Searching and Sorting
|
|||
|
|
|||
|
9.4 Searching and Sorting Example
|
|||
|
=================================
|
|||
|
|
|||
|
Here is an example showing the use of `qsort' and `bsearch' with an
|
|||
|
array of structures. The objects in the array are sorted by comparing
|
|||
|
their `name' fields with the `strcmp' function. Then, we can look up
|
|||
|
individual objects based on their names.
|
|||
|
|
|||
|
|
|||
|
#include <stdlib.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <string.h>
|
|||
|
|
|||
|
/* Define an array of critters to sort. */
|
|||
|
|
|||
|
struct critter
|
|||
|
{
|
|||
|
const char *name;
|
|||
|
const char *species;
|
|||
|
};
|
|||
|
|
|||
|
struct critter muppets[] =
|
|||
|
{
|
|||
|
{"Kermit", "frog"},
|
|||
|
{"Piggy", "pig"},
|
|||
|
{"Gonzo", "whatever"},
|
|||
|
{"Fozzie", "bear"},
|
|||
|
{"Sam", "eagle"},
|
|||
|
{"Robin", "frog"},
|
|||
|
{"Animal", "animal"},
|
|||
|
{"Camilla", "chicken"},
|
|||
|
{"Sweetums", "monster"},
|
|||
|
{"Dr. Strangepork", "pig"},
|
|||
|
{"Link Hogthrob", "pig"},
|
|||
|
{"Zoot", "human"},
|
|||
|
{"Dr. Bunsen Honeydew", "human"},
|
|||
|
{"Beaker", "human"},
|
|||
|
{"Swedish Chef", "human"}
|
|||
|
};
|
|||
|
|
|||
|
int count = sizeof (muppets) / sizeof (struct critter);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/* This is the comparison function used for sorting and searching. */
|
|||
|
|
|||
|
int
|
|||
|
critter_cmp (const void *v1, const void *v2)
|
|||
|
{
|
|||
|
const struct critter *c1 = v1;
|
|||
|
const struct critter *c2 = v2;
|
|||
|
|
|||
|
return strcmp (c1->name, c2->name);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/* Print information about a critter. */
|
|||
|
|
|||
|
void
|
|||
|
print_critter (const struct critter *c)
|
|||
|
{
|
|||
|
printf ("%s, the %s\n", c->name, c->species);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/* Do the lookup into the sorted array. */
|
|||
|
|
|||
|
void
|
|||
|
find_critter (const char *name)
|
|||
|
{
|
|||
|
struct critter target, *result;
|
|||
|
target.name = name;
|
|||
|
result = bsearch (&target, muppets, count, sizeof (struct critter),
|
|||
|
critter_cmp);
|
|||
|
if (result)
|
|||
|
print_critter (result);
|
|||
|
else
|
|||
|
printf ("Couldn't find %s.\n", name);
|
|||
|
}
|
|||
|
|
|||
|
/* Main program. */
|
|||
|
|
|||
|
int
|
|||
|
main (void)
|
|||
|
{
|
|||
|
int i;
|
|||
|
|
|||
|
for (i = 0; i < count; i++)
|
|||
|
print_critter (&muppets[i]);
|
|||
|
printf ("\n");
|
|||
|
|
|||
|
qsort (muppets, count, sizeof (struct critter), critter_cmp);
|
|||
|
|
|||
|
for (i = 0; i < count; i++)
|
|||
|
print_critter (&muppets[i]);
|
|||
|
printf ("\n");
|
|||
|
|
|||
|
find_critter ("Kermit");
|
|||
|
find_critter ("Gonzo");
|
|||
|
find_critter ("Janice");
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
The output from this program looks like:
|
|||
|
|
|||
|
Kermit, the frog
|
|||
|
Piggy, the pig
|
|||
|
Gonzo, the whatever
|
|||
|
Fozzie, the bear
|
|||
|
Sam, the eagle
|
|||
|
Robin, the frog
|
|||
|
Animal, the animal
|
|||
|
Camilla, the chicken
|
|||
|
Sweetums, the monster
|
|||
|
Dr. Strangepork, the pig
|
|||
|
Link Hogthrob, the pig
|
|||
|
Zoot, the human
|
|||
|
Dr. Bunsen Honeydew, the human
|
|||
|
Beaker, the human
|
|||
|
Swedish Chef, the human
|
|||
|
|
|||
|
Animal, the animal
|
|||
|
Beaker, the human
|
|||
|
Camilla, the chicken
|
|||
|
Dr. Bunsen Honeydew, the human
|
|||
|
Dr. Strangepork, the pig
|
|||
|
Fozzie, the bear
|
|||
|
Gonzo, the whatever
|
|||
|
Kermit, the frog
|
|||
|
Link Hogthrob, the pig
|
|||
|
Piggy, the pig
|
|||
|
Robin, the frog
|
|||
|
Sam, the eagle
|
|||
|
Swedish Chef, the human
|
|||
|
Sweetums, the monster
|
|||
|
Zoot, the human
|
|||
|
|
|||
|
Kermit, the frog
|
|||
|
Gonzo, the whatever
|
|||
|
Couldn't find Janice.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Hash Search Function, Next: Tree Search Function, Prev: Search/Sort Example, Up: Searching and Sorting
|
|||
|
|
|||
|
9.5 The `hsearch' function.
|
|||
|
===========================
|
|||
|
|
|||
|
The functions mentioned so far in this chapter are for searching in a
|
|||
|
sorted or unsorted array. There are other methods to organize
|
|||
|
information which later should be searched. The costs of insert,
|
|||
|
delete and search differ. One possible implementation is using hashing
|
|||
|
tables. The following functions are declared in the header file
|
|||
|
`search.h'.
|
|||
|
|
|||
|
-- Function: int hcreate (size_t NEL)
|
|||
|
Preliminary: | MT-Unsafe race:hsearch | AS-Unsafe heap | AC-Unsafe
|
|||
|
corrupt mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `hcreate' function creates a hashing table which can contain at
|
|||
|
least NEL elements. There is no possibility to grow this table so
|
|||
|
it is necessary to choose the value for NEL wisely. The method
|
|||
|
used to implement this function might make it necessary to make the
|
|||
|
number of elements in the hashing table larger than the expected
|
|||
|
maximal number of elements. Hashing tables usually work
|
|||
|
inefficiently if they are filled 80% or more. The constant access
|
|||
|
time guaranteed by hashing can only be achieved if few collisions
|
|||
|
exist. See Knuth's "The Art of Computer Programming, Part 3:
|
|||
|
Searching and Sorting" for more information.
|
|||
|
|
|||
|
The weakest aspect of this function is that there can be at most
|
|||
|
one hashing table used through the whole program. The table is
|
|||
|
allocated in local memory out of control of the programmer. As an
|
|||
|
extension the GNU C Library provides an additional set of
|
|||
|
functions with a reentrant interface which provides a similar
|
|||
|
interface but which allows keeping arbitrarily many hashing tables.
|
|||
|
|
|||
|
It is possible to use more than one hashing table in the program
|
|||
|
run if the former table is first destroyed by a call to `hdestroy'.
|
|||
|
|
|||
|
The function returns a non-zero value if successful. If it
|
|||
|
returns zero, something went wrong. This could either mean there
|
|||
|
is already a hashing table in use or the program ran out of memory.
|
|||
|
|
|||
|
-- Function: void hdestroy (void)
|
|||
|
Preliminary: | MT-Unsafe race:hsearch | AS-Unsafe heap | AC-Unsafe
|
|||
|
corrupt mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `hdestroy' function can be used to free all the resources
|
|||
|
allocated in a previous call of `hcreate'. After a call to this
|
|||
|
function it is again possible to call `hcreate' and allocate a new
|
|||
|
table with possibly different size.
|
|||
|
|
|||
|
It is important to remember that the elements contained in the
|
|||
|
hashing table at the time `hdestroy' is called are _not_ freed by
|
|||
|
this function. It is the responsibility of the program code to
|
|||
|
free those strings (if necessary at all). Freeing all the element
|
|||
|
memory is not possible without extra, separately kept information
|
|||
|
since there is no function to iterate through all available
|
|||
|
elements in the hashing table. If it is really necessary to free
|
|||
|
a table and all elements the programmer has to keep a list of all
|
|||
|
table elements and before calling `hdestroy' s/he has to free all
|
|||
|
element's data using this list. This is a very unpleasant
|
|||
|
mechanism and it also shows that this kind of hashing table is
|
|||
|
mainly meant for tables which are created once and used until the
|
|||
|
end of the program run.
|
|||
|
|
|||
|
Entries of the hashing table and keys for the search are defined
|
|||
|
using this type:
|
|||
|
|
|||
|
-- Data type: struct ENTRY
|
|||
|
Both elements of this structure are pointers to zero-terminated
|
|||
|
strings. This is a limiting restriction of the functionality of
|
|||
|
the `hsearch' functions. They can only be used for data sets
|
|||
|
which use the NUL character always and solely to terminate the
|
|||
|
records. It is not possible to handle general binary data.
|
|||
|
|
|||
|
`char *key'
|
|||
|
Pointer to a zero-terminated string of characters describing
|
|||
|
the key for the search or the element in the hashing table.
|
|||
|
|
|||
|
`char *data'
|
|||
|
Pointer to a zero-terminated string of characters describing
|
|||
|
the data. If the functions will be called only for searching
|
|||
|
an existing entry this element might stay undefined since it
|
|||
|
is not used.
|
|||
|
|
|||
|
-- Function: ENTRY * hsearch (ENTRY ITEM, ACTION ACTION)
|
|||
|
Preliminary: | MT-Unsafe race:hsearch | AS-Unsafe | AC-Unsafe
|
|||
|
corrupt/action==ENTER | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
To search in a hashing table created using `hcreate' the `hsearch'
|
|||
|
function must be used. This function can perform a simple search
|
|||
|
for an element (if ACTION has the value `FIND') or it can
|
|||
|
alternatively insert the key element into the hashing table.
|
|||
|
Entries are never replaced.
|
|||
|
|
|||
|
The key is denoted by a pointer to an object of type `ENTRY'. For
|
|||
|
locating the corresponding position in the hashing table only the
|
|||
|
`key' element of the structure is used.
|
|||
|
|
|||
|
If an entry with a matching key is found the ACTION parameter is
|
|||
|
irrelevant. The found entry is returned. If no matching entry is
|
|||
|
found and the ACTION parameter has the value `FIND' the function
|
|||
|
returns a `NULL' pointer. If no entry is found and the ACTION
|
|||
|
parameter has the value `ENTER' a new entry is added to the
|
|||
|
hashing table which is initialized with the parameter ITEM. A
|
|||
|
pointer to the newly added entry is returned.
|
|||
|
|
|||
|
As mentioned before, the hashing table used by the functions
|
|||
|
described so far is global and there can be at any time at most one
|
|||
|
hashing table in the program. A solution is to use the following
|
|||
|
functions which are a GNU extension. All have in common that they
|
|||
|
operate on a hashing table which is described by the content of an
|
|||
|
object of the type `struct hsearch_data'. This type should be treated
|
|||
|
as opaque, none of its members should be changed directly.
|
|||
|
|
|||
|
-- Function: int hcreate_r (size_t NEL, struct hsearch_data *HTAB)
|
|||
|
Preliminary: | MT-Safe race:htab | AS-Unsafe heap | AC-Unsafe
|
|||
|
corrupt mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `hcreate_r' function initializes the object pointed to by HTAB
|
|||
|
to contain a hashing table with at least NEL elements. So this
|
|||
|
function is equivalent to the `hcreate' function except that the
|
|||
|
initialized data structure is controlled by the user.
|
|||
|
|
|||
|
This allows having more than one hashing table at one time. The
|
|||
|
memory necessary for the `struct hsearch_data' object can be
|
|||
|
allocated dynamically. It must be initialized with zero before
|
|||
|
calling this function.
|
|||
|
|
|||
|
The return value is non-zero if the operation was successful. If
|
|||
|
the return value is zero, something went wrong, which probably
|
|||
|
means the program ran out of memory.
|
|||
|
|
|||
|
-- Function: void hdestroy_r (struct hsearch_data *HTAB)
|
|||
|
Preliminary: | MT-Safe race:htab | AS-Unsafe heap | AC-Unsafe
|
|||
|
corrupt mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `hdestroy_r' function frees all resources allocated by the
|
|||
|
`hcreate_r' function for this very same object HTAB. As for
|
|||
|
`hdestroy' it is the program's responsibility to free the strings
|
|||
|
for the elements of the table.
|
|||
|
|
|||
|
-- Function: int hsearch_r (ENTRY ITEM, ACTION ACTION, ENTRY **RETVAL,
|
|||
|
struct hsearch_data *HTAB)
|
|||
|
Preliminary: | MT-Safe race:htab | AS-Safe | AC-Unsafe
|
|||
|
corrupt/action==ENTER | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `hsearch_r' function is equivalent to `hsearch'. The meaning
|
|||
|
of the first two arguments is identical. But instead of operating
|
|||
|
on a single global hashing table the function works on the table
|
|||
|
described by the object pointed to by HTAB (which is initialized
|
|||
|
by a call to `hcreate_r').
|
|||
|
|
|||
|
Another difference to `hcreate' is that the pointer to the found
|
|||
|
entry in the table is not the return value of the function. It is
|
|||
|
returned by storing it in a pointer variable pointed to by the
|
|||
|
RETVAL parameter. The return value of the function is an integer
|
|||
|
value indicating success if it is non-zero and failure if it is
|
|||
|
zero. In the latter case the global variable `errno' signals the
|
|||
|
reason for the failure.
|
|||
|
|
|||
|
`ENOMEM'
|
|||
|
The table is filled and `hsearch_r' was called with a so far
|
|||
|
unknown key and ACTION set to `ENTER'.
|
|||
|
|
|||
|
`ESRCH'
|
|||
|
The ACTION parameter is `FIND' and no corresponding element
|
|||
|
is found in the table.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Tree Search Function, Prev: Hash Search Function, Up: Searching and Sorting
|
|||
|
|
|||
|
9.6 The `tsearch' function.
|
|||
|
===========================
|
|||
|
|
|||
|
Another common form to organize data for efficient search is to use
|
|||
|
trees. The `tsearch' function family provides a nice interface to
|
|||
|
functions to organize possibly large amounts of data by providing a mean
|
|||
|
access time proportional to the logarithm of the number of elements.
|
|||
|
The GNU C Library implementation even guarantees that this bound is
|
|||
|
never exceeded even for input data which cause problems for simple
|
|||
|
binary tree implementations.
|
|||
|
|
|||
|
The functions described in the chapter are all described in the
|
|||
|
System V and X/Open specifications and are therefore quite portable.
|
|||
|
|
|||
|
In contrast to the `hsearch' functions the `tsearch' functions can
|
|||
|
be used with arbitrary data and not only zero-terminated strings.
|
|||
|
|
|||
|
The `tsearch' functions have the advantage that no function to
|
|||
|
initialize data structures is necessary. A simple pointer of type
|
|||
|
`void *' initialized to `NULL' is a valid tree and can be extended or
|
|||
|
searched. The prototypes for these functions can be found in the
|
|||
|
header file `search.h'.
|
|||
|
|
|||
|
-- Function: void * tsearch (const void *KEY, void **ROOTP,
|
|||
|
comparison_fn_t COMPAR)
|
|||
|
Preliminary: | MT-Safe race:rootp | AS-Unsafe heap | AC-Unsafe
|
|||
|
corrupt mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `tsearch' function searches in the tree pointed to by `*ROOTP'
|
|||
|
for an element matching KEY. The function pointed to by COMPAR is
|
|||
|
used to determine whether two elements match. *Note Comparison
|
|||
|
Functions::, for a specification of the functions which can be
|
|||
|
used for the COMPAR parameter.
|
|||
|
|
|||
|
If the tree does not contain a matching entry the KEY value will
|
|||
|
be added to the tree. `tsearch' does not make a copy of the object
|
|||
|
pointed to by KEY (how could it since the size is unknown).
|
|||
|
Instead it adds a reference to this object which means the object
|
|||
|
must be available as long as the tree data structure is used.
|
|||
|
|
|||
|
The tree is represented by a pointer to a pointer since it is
|
|||
|
sometimes necessary to change the root node of the tree. So it
|
|||
|
must not be assumed that the variable pointed to by ROOTP has the
|
|||
|
same value after the call. This also shows that it is not safe to
|
|||
|
call the `tsearch' function more than once at the same time using
|
|||
|
the same tree. It is no problem to run it more than once at a
|
|||
|
time on different trees.
|
|||
|
|
|||
|
The return value is a pointer to the matching element in the tree.
|
|||
|
If a new element was created the pointer points to the new data
|
|||
|
(which is in fact KEY). If an entry had to be created and the
|
|||
|
program ran out of space `NULL' is returned.
|
|||
|
|
|||
|
-- Function: void * tfind (const void *KEY, void *const *ROOTP,
|
|||
|
comparison_fn_t COMPAR)
|
|||
|
Preliminary: | MT-Safe race:rootp | AS-Safe | AC-Safe | *Note
|
|||
|
POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `tfind' function is similar to the `tsearch' function. It
|
|||
|
locates an element matching the one pointed to by KEY and returns
|
|||
|
a pointer to this element. But if no matching element is
|
|||
|
available no new element is entered (note that the ROOTP parameter
|
|||
|
points to a constant pointer). Instead the function returns
|
|||
|
`NULL'.
|
|||
|
|
|||
|
Another advantage of the `tsearch' functions in contrast to the
|
|||
|
`hsearch' functions is that there is an easy way to remove elements.
|
|||
|
|
|||
|
-- Function: void * tdelete (const void *KEY, void **ROOTP,
|
|||
|
comparison_fn_t COMPAR)
|
|||
|
Preliminary: | MT-Safe race:rootp | AS-Unsafe heap | AC-Unsafe
|
|||
|
corrupt mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
To remove a specific element matching KEY from the tree `tdelete'
|
|||
|
can be used. It locates the matching element using the same
|
|||
|
method as `tfind'. The corresponding element is then removed and
|
|||
|
a pointer to the parent of the deleted node is returned by the
|
|||
|
function. If there is no matching entry in the tree nothing can be
|
|||
|
deleted and the function returns `NULL'. If the root of the tree
|
|||
|
is deleted `tdelete' returns some unspecified value not equal to
|
|||
|
`NULL'.
|
|||
|
|
|||
|
-- Function: void tdestroy (void *VROOT, __free_fn_t FREEFCT)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
|
|||
|
POSIX Safety Concepts::.
|
|||
|
|
|||
|
If the complete search tree has to be removed one can use
|
|||
|
`tdestroy'. It frees all resources allocated by the `tsearch'
|
|||
|
functions to generate the tree pointed to by VROOT.
|
|||
|
|
|||
|
For the data in each tree node the function FREEFCT is called.
|
|||
|
The pointer to the data is passed as the argument to the function.
|
|||
|
If no such work is necessary FREEFCT must point to a function doing
|
|||
|
nothing. It is called in any case.
|
|||
|
|
|||
|
This function is a GNU extension and not covered by the System V or
|
|||
|
X/Open specifications.
|
|||
|
|
|||
|
In addition to the functions to create and destroy the tree data
|
|||
|
structure, there is another function which allows you to apply a
|
|||
|
function to all elements of the tree. The function must have this type:
|
|||
|
|
|||
|
void __action_fn_t (const void *nodep, VISIT value, int level);
|
|||
|
|
|||
|
The NODEP is the data value of the current node (once given as the
|
|||
|
KEY argument to `tsearch'). LEVEL is a numeric value which corresponds
|
|||
|
to the depth of the current node in the tree. The root node has the
|
|||
|
depth 0 and its children have a depth of 1 and so on. The `VISIT' type
|
|||
|
is an enumeration type.
|
|||
|
|
|||
|
-- Data Type: VISIT
|
|||
|
The `VISIT' value indicates the status of the current node in the
|
|||
|
tree and how the function is called. The status of a node is
|
|||
|
either `leaf' or `internal node'. For each leaf node the function
|
|||
|
is called exactly once, for each internal node it is called three
|
|||
|
times: before the first child is processed, after the first child
|
|||
|
is processed and after both children are processed. This makes it
|
|||
|
possible to handle all three methods of tree traversal (or even a
|
|||
|
combination of them).
|
|||
|
|
|||
|
`preorder'
|
|||
|
The current node is an internal node and the function is
|
|||
|
called before the first child was processed.
|
|||
|
|
|||
|
`postorder'
|
|||
|
The current node is an internal node and the function is
|
|||
|
called after the first child was processed.
|
|||
|
|
|||
|
`endorder'
|
|||
|
The current node is an internal node and the function is
|
|||
|
called after the second child was processed.
|
|||
|
|
|||
|
`leaf'
|
|||
|
The current node is a leaf.
|
|||
|
|
|||
|
-- Function: void twalk (const void *ROOT, __action_fn_t ACTION)
|
|||
|
Preliminary: | MT-Safe race:root | AS-Safe | AC-Safe | *Note POSIX
|
|||
|
Safety Concepts::.
|
|||
|
|
|||
|
For each node in the tree with a node pointed to by ROOT, the
|
|||
|
`twalk' function calls the function provided by the parameter
|
|||
|
ACTION. For leaf nodes the function is called exactly once with
|
|||
|
VALUE set to `leaf'. For internal nodes the function is called
|
|||
|
three times, setting the VALUE parameter or ACTION to the
|
|||
|
appropriate value. The LEVEL argument for the ACTION function is
|
|||
|
computed while descending the tree by increasing the value by one
|
|||
|
for each descent to a child, starting with the value 0 for the
|
|||
|
root node.
|
|||
|
|
|||
|
Since the functions used for the ACTION parameter to `twalk' must
|
|||
|
not modify the tree data, it is safe to run `twalk' in more than
|
|||
|
one thread at the same time, working on the same tree. It is also
|
|||
|
safe to call `tfind' in parallel. Functions which modify the tree
|
|||
|
must not be used, otherwise the behavior is undefined. However,
|
|||
|
it is difficult to pass data external to the tree to the callback
|
|||
|
function without resorting to global variables (and thread safety
|
|||
|
issues), so see the `twalk_r' function below.
|
|||
|
|
|||
|
-- Function: void twalk_r (const void *ROOT, void (*ACTION) (const
|
|||
|
void *KEY, VISIT WHICH, void *CLOSURE), void *CLOSURE)
|
|||
|
Preliminary: | MT-Safe race:root | AS-Safe | AC-Safe | *Note POSIX
|
|||
|
Safety Concepts::.
|
|||
|
|
|||
|
For each node in the tree with a node pointed to by ROOT, the
|
|||
|
`twalk_r' function calls the function provided by the parameter
|
|||
|
ACTION. For leaf nodes the function is called exactly once with
|
|||
|
WHICH set to `leaf'. For internal nodes the function is called
|
|||
|
three times, setting the WHICH parameter of ACTION to the
|
|||
|
appropriate value. The CLOSURE parameter is passed down to each
|
|||
|
call of the ACTION function, unmodified.
|
|||
|
|
|||
|
It is possible to implement the `twalk' function on top of the
|
|||
|
`twalk_r' function, which is why there is no separate level
|
|||
|
parameter.
|
|||
|
|
|||
|
|
|||
|
#include <search.h>
|
|||
|
|
|||
|
struct twalk_with_twalk_r_closure
|
|||
|
{
|
|||
|
void (*action) (const void *, VISIT, int);
|
|||
|
int depth;
|
|||
|
};
|
|||
|
|
|||
|
static void
|
|||
|
twalk_with_twalk_r_action (const void *nodep, VISIT which, void *closure0)
|
|||
|
{
|
|||
|
struct twalk_with_twalk_r_closure *closure = closure0;
|
|||
|
|
|||
|
switch (which)
|
|||
|
{
|
|||
|
case leaf:
|
|||
|
closure->action (nodep, which, closure->depth);
|
|||
|
break;
|
|||
|
case preorder:
|
|||
|
closure->action (nodep, which, closure->depth);
|
|||
|
++closure->depth;
|
|||
|
break;
|
|||
|
case postorder:
|
|||
|
/* The preorder action incremented the depth. */
|
|||
|
closure->action (nodep, which, closure->depth - 1);
|
|||
|
break;
|
|||
|
case endorder:
|
|||
|
--closure->depth;
|
|||
|
closure->action (nodep, which, closure->depth);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
twalk (const void *root, void (*action) (const void *, VISIT, int))
|
|||
|
{
|
|||
|
struct twalk_with_twalk_r_closure closure = { action, 0 };
|
|||
|
twalk_r (root, twalk_with_twalk_r_action, &closure);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Pattern Matching, Next: I/O Overview, Prev: Searching and Sorting, Up: Top
|
|||
|
|
|||
|
10 Pattern Matching
|
|||
|
*******************
|
|||
|
|
|||
|
The GNU C Library provides pattern matching facilities for two kinds of
|
|||
|
patterns: regular expressions and file-name wildcards. The library also
|
|||
|
provides a facility for expanding variable and command references and
|
|||
|
parsing text into words in the way the shell does.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Wildcard Matching:: Matching a wildcard pattern against a single string.
|
|||
|
* Globbing:: Finding the files that match a wildcard pattern.
|
|||
|
* Regular Expressions:: Matching regular expressions against strings.
|
|||
|
* Word Expansion:: Expanding shell variables, nested commands,
|
|||
|
arithmetic, and wildcards.
|
|||
|
This is what the shell does with shell commands.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Wildcard Matching, Next: Globbing, Up: Pattern Matching
|
|||
|
|
|||
|
10.1 Wildcard Matching
|
|||
|
======================
|
|||
|
|
|||
|
This section describes how to match a wildcard pattern against a
|
|||
|
particular string. The result is a yes or no answer: does the string
|
|||
|
fit the pattern or not. The symbols described here are all declared in
|
|||
|
`fnmatch.h'.
|
|||
|
|
|||
|
-- Function: int fnmatch (const char *PATTERN, const char *STRING, int
|
|||
|
FLAGS)
|
|||
|
Preliminary: | MT-Safe env locale | AS-Unsafe heap | AC-Unsafe mem
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function tests whether the string STRING matches the pattern
|
|||
|
PATTERN. It returns `0' if they do match; otherwise, it returns
|
|||
|
the nonzero value `FNM_NOMATCH'. The arguments PATTERN and STRING
|
|||
|
are both strings.
|
|||
|
|
|||
|
The argument FLAGS is a combination of flag bits that alter the
|
|||
|
details of matching. See below for a list of the defined flags.
|
|||
|
|
|||
|
In the GNU C Library, `fnmatch' might sometimes report "errors" by
|
|||
|
returning nonzero values that are not equal to `FNM_NOMATCH'.
|
|||
|
|
|||
|
These are the available flags for the FLAGS argument:
|
|||
|
|
|||
|
`FNM_FILE_NAME'
|
|||
|
Treat the `/' character specially, for matching file names. If
|
|||
|
this flag is set, wildcard constructs in PATTERN cannot match `/'
|
|||
|
in STRING. Thus, the only way to match `/' is with an explicit
|
|||
|
`/' in PATTERN.
|
|||
|
|
|||
|
`FNM_PATHNAME'
|
|||
|
This is an alias for `FNM_FILE_NAME'; it comes from POSIX.2. We
|
|||
|
don't recommend this name because we don't use the term "pathname"
|
|||
|
for file names.
|
|||
|
|
|||
|
`FNM_PERIOD'
|
|||
|
Treat the `.' character specially if it appears at the beginning of
|
|||
|
STRING. If this flag is set, wildcard constructs in PATTERN
|
|||
|
cannot match `.' as the first character of STRING.
|
|||
|
|
|||
|
If you set both `FNM_PERIOD' and `FNM_FILE_NAME', then the special
|
|||
|
treatment applies to `.' following `/' as well as to `.' at the
|
|||
|
beginning of STRING. (The shell uses the `FNM_PERIOD' and
|
|||
|
`FNM_FILE_NAME' flags together for matching file names.)
|
|||
|
|
|||
|
`FNM_NOESCAPE'
|
|||
|
Don't treat the `\' character specially in patterns. Normally,
|
|||
|
`\' quotes the following character, turning off its special meaning
|
|||
|
(if any) so that it matches only itself. When quoting is enabled,
|
|||
|
the pattern `\?' matches only the string `?', because the question
|
|||
|
mark in the pattern acts like an ordinary character.
|
|||
|
|
|||
|
If you use `FNM_NOESCAPE', then `\' is an ordinary character.
|
|||
|
|
|||
|
`FNM_LEADING_DIR'
|
|||
|
Ignore a trailing sequence of characters starting with a `/' in
|
|||
|
STRING; that is to say, test whether STRING starts with a
|
|||
|
directory name that PATTERN matches.
|
|||
|
|
|||
|
If this flag is set, either `foo*' or `foobar' as a pattern would
|
|||
|
match the string `foobar/frobozz'.
|
|||
|
|
|||
|
`FNM_CASEFOLD'
|
|||
|
Ignore case in comparing STRING to PATTERN.
|
|||
|
|
|||
|
`FNM_EXTMATCH'
|
|||
|
Besides the normal patterns, also recognize the extended patterns
|
|||
|
introduced in `ksh'. The patterns are written in the form
|
|||
|
explained in the following table where PATTERN-LIST is a `|'
|
|||
|
separated list of patterns.
|
|||
|
|
|||
|
`?(PATTERN-LIST)'
|
|||
|
The pattern matches if zero or one occurrences of any of the
|
|||
|
patterns in the PATTERN-LIST allow matching the input string.
|
|||
|
|
|||
|
`*(PATTERN-LIST)'
|
|||
|
The pattern matches if zero or more occurrences of any of the
|
|||
|
patterns in the PATTERN-LIST allow matching the input string.
|
|||
|
|
|||
|
`+(PATTERN-LIST)'
|
|||
|
The pattern matches if one or more occurrences of any of the
|
|||
|
patterns in the PATTERN-LIST allow matching the input string.
|
|||
|
|
|||
|
`@(PATTERN-LIST)'
|
|||
|
The pattern matches if exactly one occurrence of any of the
|
|||
|
patterns in the PATTERN-LIST allows matching the input string.
|
|||
|
|
|||
|
`!(PATTERN-LIST)'
|
|||
|
The pattern matches if the input string cannot be matched
|
|||
|
with any of the patterns in the PATTERN-LIST.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Globbing, Next: Regular Expressions, Prev: Wildcard Matching, Up: Pattern Matching
|
|||
|
|
|||
|
10.2 Globbing
|
|||
|
=============
|
|||
|
|
|||
|
The archetypal use of wildcards is for matching against the files in a
|
|||
|
directory, and making a list of all the matches. This is called
|
|||
|
"globbing".
|
|||
|
|
|||
|
You could do this using `fnmatch', by reading the directory entries
|
|||
|
one by one and testing each one with `fnmatch'. But that would be slow
|
|||
|
(and complex, since you would have to handle subdirectories by hand).
|
|||
|
|
|||
|
The library provides a function `glob' to make this particular use
|
|||
|
of wildcards convenient. `glob' and the other symbols in this section
|
|||
|
are declared in `glob.h'.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Calling Glob:: Basic use of `glob'.
|
|||
|
* Flags for Globbing:: Flags that enable various options in `glob'.
|
|||
|
* More Flags for Globbing:: GNU specific extensions to `glob'.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Calling Glob, Next: Flags for Globbing, Up: Globbing
|
|||
|
|
|||
|
10.2.1 Calling `glob'
|
|||
|
---------------------
|
|||
|
|
|||
|
The result of globbing is a vector of file names (strings). To return
|
|||
|
this vector, `glob' uses a special data type, `glob_t', which is a
|
|||
|
structure. You pass `glob' the address of the structure, and it fills
|
|||
|
in the structure's fields to tell you about the results.
|
|||
|
|
|||
|
-- Data Type: glob_t
|
|||
|
This data type holds a pointer to a word vector. More precisely,
|
|||
|
it records both the address of the word vector and its size. The
|
|||
|
GNU implementation contains some more fields which are non-standard
|
|||
|
extensions.
|
|||
|
|
|||
|
`gl_pathc'
|
|||
|
The number of elements in the vector, excluding the initial
|
|||
|
null entries if the GLOB_DOOFFS flag is used (see gl_offs
|
|||
|
below).
|
|||
|
|
|||
|
`gl_pathv'
|
|||
|
The address of the vector. This field has type `char **'.
|
|||
|
|
|||
|
`gl_offs'
|
|||
|
The offset of the first real element of the vector, from its
|
|||
|
nominal address in the `gl_pathv' field. Unlike the other
|
|||
|
fields, this is always an input to `glob', rather than an
|
|||
|
output from it.
|
|||
|
|
|||
|
If you use a nonzero offset, then that many elements at the
|
|||
|
beginning of the vector are left empty. (The `glob' function
|
|||
|
fills them with null pointers.)
|
|||
|
|
|||
|
The `gl_offs' field is meaningful only if you use the
|
|||
|
`GLOB_DOOFFS' flag. Otherwise, the offset is always zero
|
|||
|
regardless of what is in this field, and the first real
|
|||
|
element comes at the beginning of the vector.
|
|||
|
|
|||
|
`gl_closedir'
|
|||
|
The address of an alternative implementation of the `closedir'
|
|||
|
function. It is used if the `GLOB_ALTDIRFUNC' bit is set in
|
|||
|
the flag parameter. The type of this field is
|
|||
|
`void (*) (void *)'.
|
|||
|
|
|||
|
This is a GNU extension.
|
|||
|
|
|||
|
`gl_readdir'
|
|||
|
The address of an alternative implementation of the `readdir'
|
|||
|
function used to read the contents of a directory. It is
|
|||
|
used if the `GLOB_ALTDIRFUNC' bit is set in the flag
|
|||
|
parameter. The type of this field is
|
|||
|
`struct dirent *(*) (void *)'.
|
|||
|
|
|||
|
An implementation of `gl_readdir' needs to initialize the
|
|||
|
following members of the `struct dirent' object:
|
|||
|
|
|||
|
`d_type'
|
|||
|
This member should be set to the file type of the entry
|
|||
|
if it is known. Otherwise, the value `DT_UNKNOWN' can
|
|||
|
be used. The `glob' function may use the specified file
|
|||
|
type to avoid callbacks in cases where the file type
|
|||
|
indicates that the data is not required.
|
|||
|
|
|||
|
`d_ino'
|
|||
|
This member needs to be non-zero, otherwise `glob' may
|
|||
|
skip the current entry and call the `gl_readdir'
|
|||
|
callback function again to retrieve another entry.
|
|||
|
|
|||
|
`d_name'
|
|||
|
This member must be set to the name of the entry. It
|
|||
|
must be null-terminated.
|
|||
|
|
|||
|
The example below shows how to allocate a `struct dirent'
|
|||
|
object containing a given name.
|
|||
|
|
|||
|
|
|||
|
#include <dirent.h>
|
|||
|
#include <errno.h>
|
|||
|
#include <stddef.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <string.h>
|
|||
|
|
|||
|
struct dirent *
|
|||
|
mkdirent (const char *name)
|
|||
|
{
|
|||
|
size_t dirent_size = offsetof (struct dirent, d_name) + 1;
|
|||
|
size_t name_length = strlen (name);
|
|||
|
size_t total_size = dirent_size + name_length;
|
|||
|
if (total_size < dirent_size)
|
|||
|
{
|
|||
|
errno = ENOMEM;
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
struct dirent *result = malloc (total_size);
|
|||
|
if (result == NULL)
|
|||
|
return NULL;
|
|||
|
result->d_type = DT_UNKNOWN;
|
|||
|
result->d_ino = 1; /* Do not skip this entry. */
|
|||
|
memcpy (result->d_name, name, name_length + 1);
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
The `glob' function reads the `struct dirent' members listed
|
|||
|
above and makes a copy of the file name in the `d_name' member
|
|||
|
immediately after the `gl_readdir' callback function returns.
|
|||
|
Future invocations of any of the callback functions may
|
|||
|
dealloacte or reuse the buffer. It is the responsibility of
|
|||
|
the caller of the `glob' function to allocate and deallocate
|
|||
|
the buffer, around the call to `glob' or using the callback
|
|||
|
functions. For example, an application could allocate the
|
|||
|
buffer in the `gl_readdir' callback function, and deallocate
|
|||
|
it in the `gl_closedir' callback function.
|
|||
|
|
|||
|
The `gl_readdir' member is a GNU extension.
|
|||
|
|
|||
|
`gl_opendir'
|
|||
|
The address of an alternative implementation of the `opendir'
|
|||
|
function. It is used if the `GLOB_ALTDIRFUNC' bit is set in
|
|||
|
the flag parameter. The type of this field is
|
|||
|
`void *(*) (const char *)'.
|
|||
|
|
|||
|
This is a GNU extension.
|
|||
|
|
|||
|
`gl_stat'
|
|||
|
The address of an alternative implementation of the `stat'
|
|||
|
function to get information about an object in the
|
|||
|
filesystem. It is used if the `GLOB_ALTDIRFUNC' bit is set
|
|||
|
in the flag parameter. The type of this field is
|
|||
|
`int (*) (const char *, struct stat *)'.
|
|||
|
|
|||
|
This is a GNU extension.
|
|||
|
|
|||
|
`gl_lstat'
|
|||
|
The address of an alternative implementation of the `lstat'
|
|||
|
function to get information about an object in the
|
|||
|
filesystems, not following symbolic links. It is used if the
|
|||
|
`GLOB_ALTDIRFUNC' bit is set in the flag parameter. The type
|
|||
|
of this field is `int (*) (const char *, struct stat *)'.
|
|||
|
|
|||
|
This is a GNU extension.
|
|||
|
|
|||
|
`gl_flags'
|
|||
|
The flags used when `glob' was called. In addition,
|
|||
|
`GLOB_MAGCHAR' might be set. See *note Flags for Globbing::
|
|||
|
for more details.
|
|||
|
|
|||
|
This is a GNU extension.
|
|||
|
|
|||
|
For use in the `glob64' function `glob.h' contains another
|
|||
|
definition for a very similar type. `glob64_t' differs from `glob_t'
|
|||
|
only in the types of the members `gl_readdir', `gl_stat', and
|
|||
|
`gl_lstat'.
|
|||
|
|
|||
|
-- Data Type: glob64_t
|
|||
|
This data type holds a pointer to a word vector. More precisely,
|
|||
|
it records both the address of the word vector and its size. The
|
|||
|
GNU implementation contains some more fields which are non-standard
|
|||
|
extensions.
|
|||
|
|
|||
|
`gl_pathc'
|
|||
|
The number of elements in the vector, excluding the initial
|
|||
|
null entries if the GLOB_DOOFFS flag is used (see gl_offs
|
|||
|
below).
|
|||
|
|
|||
|
`gl_pathv'
|
|||
|
The address of the vector. This field has type `char **'.
|
|||
|
|
|||
|
`gl_offs'
|
|||
|
The offset of the first real element of the vector, from its
|
|||
|
nominal address in the `gl_pathv' field. Unlike the other
|
|||
|
fields, this is always an input to `glob', rather than an
|
|||
|
output from it.
|
|||
|
|
|||
|
If you use a nonzero offset, then that many elements at the
|
|||
|
beginning of the vector are left empty. (The `glob' function
|
|||
|
fills them with null pointers.)
|
|||
|
|
|||
|
The `gl_offs' field is meaningful only if you use the
|
|||
|
`GLOB_DOOFFS' flag. Otherwise, the offset is always zero
|
|||
|
regardless of what is in this field, and the first real
|
|||
|
element comes at the beginning of the vector.
|
|||
|
|
|||
|
`gl_closedir'
|
|||
|
The address of an alternative implementation of the `closedir'
|
|||
|
function. It is used if the `GLOB_ALTDIRFUNC' bit is set in
|
|||
|
the flag parameter. The type of this field is
|
|||
|
`void (*) (void *)'.
|
|||
|
|
|||
|
This is a GNU extension.
|
|||
|
|
|||
|
`gl_readdir'
|
|||
|
The address of an alternative implementation of the
|
|||
|
`readdir64' function used to read the contents of a
|
|||
|
directory. It is used if the `GLOB_ALTDIRFUNC' bit is set in
|
|||
|
the flag parameter. The type of this field is
|
|||
|
`struct dirent64 *(*) (void *)'.
|
|||
|
|
|||
|
This is a GNU extension.
|
|||
|
|
|||
|
`gl_opendir'
|
|||
|
The address of an alternative implementation of the `opendir'
|
|||
|
function. It is used if the `GLOB_ALTDIRFUNC' bit is set in
|
|||
|
the flag parameter. The type of this field is
|
|||
|
`void *(*) (const char *)'.
|
|||
|
|
|||
|
This is a GNU extension.
|
|||
|
|
|||
|
`gl_stat'
|
|||
|
The address of an alternative implementation of the `stat64'
|
|||
|
function to get information about an object in the
|
|||
|
filesystem. It is used if the `GLOB_ALTDIRFUNC' bit is set
|
|||
|
in the flag parameter. The type of this field is
|
|||
|
`int (*) (const char *, struct stat64 *)'.
|
|||
|
|
|||
|
This is a GNU extension.
|
|||
|
|
|||
|
`gl_lstat'
|
|||
|
The address of an alternative implementation of the `lstat64'
|
|||
|
function to get information about an object in the
|
|||
|
filesystems, not following symbolic links. It is used if the
|
|||
|
`GLOB_ALTDIRFUNC' bit is set in the flag parameter. The type
|
|||
|
of this field is `int (*) (const char *, struct stat64 *)'.
|
|||
|
|
|||
|
This is a GNU extension.
|
|||
|
|
|||
|
`gl_flags'
|
|||
|
The flags used when `glob' was called. In addition,
|
|||
|
`GLOB_MAGCHAR' might be set. See *note Flags for Globbing::
|
|||
|
for more details.
|
|||
|
|
|||
|
This is a GNU extension.
|
|||
|
|
|||
|
-- Function: int glob (const char *PATTERN, int FLAGS, int (*ERRFUNC)
|
|||
|
(const char *FILENAME, int ERROR-CODE), glob_t *VECTOR-PTR)
|
|||
|
Preliminary: | MT-Unsafe race:utent env sig:ALRM timer locale |
|
|||
|
AS-Unsafe dlopen plugin corrupt heap lock | AC-Unsafe corrupt lock
|
|||
|
fd mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The function `glob' does globbing using the pattern PATTERN in the
|
|||
|
current directory. It puts the result in a newly allocated
|
|||
|
vector, and stores the size and address of this vector into
|
|||
|
`*VECTOR-PTR'. The argument FLAGS is a combination of bit flags;
|
|||
|
see *note Flags for Globbing::, for details of the flags.
|
|||
|
|
|||
|
The result of globbing is a sequence of file names. The function
|
|||
|
`glob' allocates a string for each resulting word, then allocates
|
|||
|
a vector of type `char **' to store the addresses of these
|
|||
|
strings. The last element of the vector is a null pointer. This
|
|||
|
vector is called the "word vector".
|
|||
|
|
|||
|
To return this vector, `glob' stores both its address and its
|
|||
|
length (number of elements, not counting the terminating null
|
|||
|
pointer) into `*VECTOR-PTR'.
|
|||
|
|
|||
|
Normally, `glob' sorts the file names alphabetically before
|
|||
|
returning them. You can turn this off with the flag `GLOB_NOSORT'
|
|||
|
if you want to get the information as fast as possible. Usually
|
|||
|
it's a good idea to let `glob' sort them--if you process the files
|
|||
|
in alphabetical order, the users will have a feel for the rate of
|
|||
|
progress that your application is making.
|
|||
|
|
|||
|
If `glob' succeeds, it returns 0. Otherwise, it returns one of
|
|||
|
these error codes:
|
|||
|
|
|||
|
`GLOB_ABORTED'
|
|||
|
There was an error opening a directory, and you used the flag
|
|||
|
`GLOB_ERR' or your specified ERRFUNC returned a nonzero value.
|
|||
|
*Note Flags for Globbing::, for an explanation of the
|
|||
|
`GLOB_ERR' flag and ERRFUNC.
|
|||
|
|
|||
|
`GLOB_NOMATCH'
|
|||
|
The pattern didn't match any existing files. If you use the
|
|||
|
`GLOB_NOCHECK' flag, then you never get this error code,
|
|||
|
because that flag tells `glob' to _pretend_ that the pattern
|
|||
|
matched at least one file.
|
|||
|
|
|||
|
`GLOB_NOSPACE'
|
|||
|
It was impossible to allocate memory to hold the result.
|
|||
|
|
|||
|
In the event of an error, `glob' stores information in
|
|||
|
`*VECTOR-PTR' about all the matches it has found so far.
|
|||
|
|
|||
|
It is important to notice that the `glob' function will not fail if
|
|||
|
it encounters directories or files which cannot be handled without
|
|||
|
the LFS interfaces. The implementation of `glob' is supposed to
|
|||
|
use these functions internally. This at least is the assumption
|
|||
|
made by the Unix standard. The GNU extension of allowing the user
|
|||
|
to provide their own directory handling and `stat' functions
|
|||
|
complicates things a bit. If these callback functions are used
|
|||
|
and a large file or directory is encountered `glob' _can_ fail.
|
|||
|
|
|||
|
-- Function: int glob64 (const char *PATTERN, int FLAGS, int
|
|||
|
(*ERRFUNC) (const char *FILENAME, int ERROR-CODE), glob64_t
|
|||
|
*VECTOR-PTR)
|
|||
|
Preliminary: | MT-Unsafe race:utent env sig:ALRM timer locale |
|
|||
|
AS-Unsafe dlopen corrupt heap lock | AC-Unsafe corrupt lock fd mem
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `glob64' function was added as part of the Large File Summit
|
|||
|
extensions but is not part of the original LFS proposal. The
|
|||
|
reason for this is simple: it is not necessary. The necessity for
|
|||
|
a `glob64' function is added by the extensions of the GNU `glob'
|
|||
|
implementation which allows the user to provide their own
|
|||
|
directory handling and `stat' functions. The `readdir' and `stat'
|
|||
|
functions do depend on the choice of `_FILE_OFFSET_BITS' since the
|
|||
|
definition of the types `struct dirent' and `struct stat' will
|
|||
|
change depending on the choice.
|
|||
|
|
|||
|
Besides this difference, `glob64' works just like `glob' in all
|
|||
|
aspects.
|
|||
|
|
|||
|
This function is a GNU extension.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Flags for Globbing, Next: More Flags for Globbing, Prev: Calling Glob, Up: Globbing
|
|||
|
|
|||
|
10.2.2 Flags for Globbing
|
|||
|
-------------------------
|
|||
|
|
|||
|
This section describes the standard flags that you can specify in the
|
|||
|
FLAGS argument to `glob'. Choose the flags you want, and combine them
|
|||
|
with the C bitwise OR operator `|'.
|
|||
|
|
|||
|
Note that there are *note More Flags for Globbing:: available as GNU
|
|||
|
extensions.
|
|||
|
|
|||
|
`GLOB_APPEND'
|
|||
|
Append the words from this expansion to the vector of words
|
|||
|
produced by previous calls to `glob'. This way you can
|
|||
|
effectively expand several words as if they were concatenated with
|
|||
|
spaces between them.
|
|||
|
|
|||
|
In order for appending to work, you must not modify the contents
|
|||
|
of the word vector structure between calls to `glob'. And, if you
|
|||
|
set `GLOB_DOOFFS' in the first call to `glob', you must also set
|
|||
|
it when you append to the results.
|
|||
|
|
|||
|
Note that the pointer stored in `gl_pathv' may no longer be valid
|
|||
|
after you call `glob' the second time, because `glob' might have
|
|||
|
relocated the vector. So always fetch `gl_pathv' from the
|
|||
|
`glob_t' structure after each `glob' call; *never* save the
|
|||
|
pointer across calls.
|
|||
|
|
|||
|
`GLOB_DOOFFS'
|
|||
|
Leave blank slots at the beginning of the vector of words. The
|
|||
|
`gl_offs' field says how many slots to leave. The blank slots
|
|||
|
contain null pointers.
|
|||
|
|
|||
|
`GLOB_ERR'
|
|||
|
Give up right away and report an error if there is any difficulty
|
|||
|
reading the directories that must be read in order to expand
|
|||
|
PATTERN fully. Such difficulties might include a directory in
|
|||
|
which you don't have the requisite access. Normally, `glob' tries
|
|||
|
its best to keep on going despite any errors, reading whatever
|
|||
|
directories it can.
|
|||
|
|
|||
|
You can exercise even more control than this by specifying an
|
|||
|
error-handler function ERRFUNC when you call `glob'. If ERRFUNC
|
|||
|
is not a null pointer, then `glob' doesn't give up right away when
|
|||
|
it can't read a directory; instead, it calls ERRFUNC with two
|
|||
|
arguments, like this:
|
|||
|
|
|||
|
(*ERRFUNC) (FILENAME, ERROR-CODE)
|
|||
|
|
|||
|
The argument FILENAME is the name of the directory that `glob'
|
|||
|
couldn't open or couldn't read, and ERROR-CODE is the `errno'
|
|||
|
value that was reported to `glob'.
|
|||
|
|
|||
|
If the error handler function returns nonzero, then `glob' gives up
|
|||
|
right away. Otherwise, it continues.
|
|||
|
|
|||
|
`GLOB_MARK'
|
|||
|
If the pattern matches the name of a directory, append `/' to the
|
|||
|
directory's name when returning it.
|
|||
|
|
|||
|
`GLOB_NOCHECK'
|
|||
|
If the pattern doesn't match any file names, return the pattern
|
|||
|
itself as if it were a file name that had been matched.
|
|||
|
(Normally, when the pattern doesn't match anything, `glob' returns
|
|||
|
that there were no matches.)
|
|||
|
|
|||
|
`GLOB_NOESCAPE'
|
|||
|
Don't treat the `\' character specially in patterns. Normally,
|
|||
|
`\' quotes the following character, turning off its special meaning
|
|||
|
(if any) so that it matches only itself. When quoting is enabled,
|
|||
|
the pattern `\?' matches only the string `?', because the question
|
|||
|
mark in the pattern acts like an ordinary character.
|
|||
|
|
|||
|
If you use `GLOB_NOESCAPE', then `\' is an ordinary character.
|
|||
|
|
|||
|
`glob' does its work by calling the function `fnmatch' repeatedly.
|
|||
|
It handles the flag `GLOB_NOESCAPE' by turning on the
|
|||
|
`FNM_NOESCAPE' flag in calls to `fnmatch'.
|
|||
|
|
|||
|
`GLOB_NOSORT'
|
|||
|
Don't sort the file names; return them in no particular order.
|
|||
|
(In practice, the order will depend on the order of the entries in
|
|||
|
the directory.) The only reason _not_ to sort is to save time.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: More Flags for Globbing, Prev: Flags for Globbing, Up: Globbing
|
|||
|
|
|||
|
10.2.3 More Flags for Globbing
|
|||
|
------------------------------
|
|||
|
|
|||
|
Beside the flags described in the last section, the GNU implementation
|
|||
|
of `glob' allows a few more flags which are also defined in the
|
|||
|
`glob.h' file. Some of the extensions implement functionality which is
|
|||
|
available in modern shell implementations.
|
|||
|
|
|||
|
`GLOB_PERIOD'
|
|||
|
The `.' character (period) is treated special. It cannot be
|
|||
|
matched by wildcards. *Note Wildcard Matching::, `FNM_PERIOD'.
|
|||
|
|
|||
|
`GLOB_MAGCHAR'
|
|||
|
The `GLOB_MAGCHAR' value is not to be given to `glob' in the FLAGS
|
|||
|
parameter. Instead, `glob' sets this bit in the GL_FLAGS element
|
|||
|
of the GLOB_T structure provided as the result if the pattern used
|
|||
|
for matching contains any wildcard character.
|
|||
|
|
|||
|
`GLOB_ALTDIRFUNC'
|
|||
|
Instead of using the normal functions for accessing the filesystem
|
|||
|
the `glob' implementation uses the user-supplied functions
|
|||
|
specified in the structure pointed to by PGLOB parameter. For
|
|||
|
more information about the functions refer to the sections about
|
|||
|
directory handling see *note Accessing Directories::, and *note
|
|||
|
Reading Attributes::.
|
|||
|
|
|||
|
`GLOB_BRACE'
|
|||
|
If this flag is given, the handling of braces in the pattern is
|
|||
|
changed. It is now required that braces appear correctly grouped.
|
|||
|
I.e., for each opening brace there must be a closing one. Braces
|
|||
|
can be used recursively. So it is possible to define one brace
|
|||
|
expression in another one. It is important to note that the range
|
|||
|
of each brace expression is completely contained in the outer
|
|||
|
brace expression (if there is one).
|
|||
|
|
|||
|
The string between the matching braces is separated into single
|
|||
|
expressions by splitting at `,' (comma) characters. The commas
|
|||
|
themselves are discarded. Please note what we said above about
|
|||
|
recursive brace expressions. The commas used to separate the
|
|||
|
subexpressions must be at the same level. Commas in brace
|
|||
|
subexpressions are not matched. They are used during expansion of
|
|||
|
the brace expression of the deeper level. The example below shows
|
|||
|
this
|
|||
|
|
|||
|
glob ("{foo/{,bar,biz},baz}", GLOB_BRACE, NULL, &result)
|
|||
|
|
|||
|
is equivalent to the sequence
|
|||
|
|
|||
|
glob ("foo/", GLOB_BRACE, NULL, &result)
|
|||
|
glob ("foo/bar", GLOB_BRACE|GLOB_APPEND, NULL, &result)
|
|||
|
glob ("foo/biz", GLOB_BRACE|GLOB_APPEND, NULL, &result)
|
|||
|
glob ("baz", GLOB_BRACE|GLOB_APPEND, NULL, &result)
|
|||
|
|
|||
|
if we leave aside error handling.
|
|||
|
|
|||
|
`GLOB_NOMAGIC'
|
|||
|
If the pattern contains no wildcard constructs (it is a literal
|
|||
|
file name), return it as the sole "matching" word, even if no file
|
|||
|
exists by that name.
|
|||
|
|
|||
|
`GLOB_TILDE'
|
|||
|
If this flag is used the character `~' (tilde) is handled specially
|
|||
|
if it appears at the beginning of the pattern. Instead of being
|
|||
|
taken verbatim it is used to represent the home directory of a
|
|||
|
known user.
|
|||
|
|
|||
|
If `~' is the only character in pattern or it is followed by a `/'
|
|||
|
(slash), the home directory of the process owner is substituted.
|
|||
|
Using `getlogin' and `getpwnam' the information is read from the
|
|||
|
system databases. As an example take user `bart' with his home
|
|||
|
directory at `/home/bart'. For him a call like
|
|||
|
|
|||
|
glob ("~/bin/*", GLOB_TILDE, NULL, &result)
|
|||
|
|
|||
|
would return the contents of the directory `/home/bart/bin'.
|
|||
|
Instead of referring to the own home directory it is also possible
|
|||
|
to name the home directory of other users. To do so one has to
|
|||
|
append the user name after the tilde character. So the contents
|
|||
|
of user `homer''s `bin' directory can be retrieved by
|
|||
|
|
|||
|
glob ("~homer/bin/*", GLOB_TILDE, NULL, &result)
|
|||
|
|
|||
|
If the user name is not valid or the home directory cannot be
|
|||
|
determined for some reason the pattern is left untouched and
|
|||
|
itself used as the result. I.e., if in the last example `home' is
|
|||
|
not available the tilde expansion yields to `"~homer/bin/*"' and
|
|||
|
`glob' is not looking for a directory named `~homer'.
|
|||
|
|
|||
|
This functionality is equivalent to what is available in C-shells
|
|||
|
if the `nonomatch' flag is set.
|
|||
|
|
|||
|
`GLOB_TILDE_CHECK'
|
|||
|
If this flag is used `glob' behaves as if `GLOB_TILDE' is given.
|
|||
|
The only difference is that if the user name is not available or
|
|||
|
the home directory cannot be determined for other reasons this
|
|||
|
leads to an error. `glob' will return `GLOB_NOMATCH' instead of
|
|||
|
using the pattern itself as the name.
|
|||
|
|
|||
|
This functionality is equivalent to what is available in C-shells
|
|||
|
if the `nonomatch' flag is not set.
|
|||
|
|
|||
|
`GLOB_ONLYDIR'
|
|||
|
If this flag is used the globbing function takes this as a *hint*
|
|||
|
that the caller is only interested in directories matching the
|
|||
|
pattern. If the information about the type of the file is easily
|
|||
|
available non-directories will be rejected but no extra work will
|
|||
|
be done to determine the information for each file. I.e., the
|
|||
|
caller must still be able to filter directories out.
|
|||
|
|
|||
|
This functionality is only available with the GNU `glob'
|
|||
|
implementation. It is mainly used internally to increase the
|
|||
|
performance but might be useful for a user as well and therefore is
|
|||
|
documented here.
|
|||
|
|
|||
|
Calling `glob' will in most cases allocate resources which are used
|
|||
|
to represent the result of the function call. If the same object of
|
|||
|
type `glob_t' is used in multiple call to `glob' the resources are
|
|||
|
freed or reused so that no leaks appear. But this does not include the
|
|||
|
time when all `glob' calls are done.
|
|||
|
|
|||
|
-- Function: void globfree (glob_t *PGLOB)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe
|
|||
|
corrupt mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `globfree' function frees all resources allocated by previous
|
|||
|
calls to `glob' associated with the object pointed to by PGLOB.
|
|||
|
This function should be called whenever the currently used
|
|||
|
`glob_t' typed object isn't used anymore.
|
|||
|
|
|||
|
-- Function: void globfree64 (glob64_t *PGLOB)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt lock | AC-Unsafe
|
|||
|
corrupt lock fd mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function is equivalent to `globfree' but it frees records of
|
|||
|
type `glob64_t' which were allocated by `glob64'.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Regular Expressions, Next: Word Expansion, Prev: Globbing, Up: Pattern Matching
|
|||
|
|
|||
|
10.3 Regular Expression Matching
|
|||
|
================================
|
|||
|
|
|||
|
The GNU C Library supports two interfaces for matching regular
|
|||
|
expressions. One is the standard POSIX.2 interface, and the other is
|
|||
|
what the GNU C Library has had for many years.
|
|||
|
|
|||
|
Both interfaces are declared in the header file `regex.h'. If you
|
|||
|
define `_POSIX_C_SOURCE', then only the POSIX.2 functions, structures,
|
|||
|
and constants are declared.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* POSIX Regexp Compilation:: Using `regcomp' to prepare to match.
|
|||
|
* Flags for POSIX Regexps:: Syntax variations for `regcomp'.
|
|||
|
* Matching POSIX Regexps:: Using `regexec' to match the compiled
|
|||
|
pattern that you get from `regcomp'.
|
|||
|
* Regexp Subexpressions:: Finding which parts of the string were matched.
|
|||
|
* Subexpression Complications:: Find points of which parts were matched.
|
|||
|
* Regexp Cleanup:: Freeing storage; reporting errors.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: POSIX Regexp Compilation, Next: Flags for POSIX Regexps, Up: Regular Expressions
|
|||
|
|
|||
|
10.3.1 POSIX Regular Expression Compilation
|
|||
|
-------------------------------------------
|
|||
|
|
|||
|
Before you can actually match a regular expression, you must "compile"
|
|||
|
it. This is not true compilation--it produces a special data
|
|||
|
structure, not machine instructions. But it is like ordinary
|
|||
|
compilation in that its purpose is to enable you to "execute" the
|
|||
|
pattern fast. (*Note Matching POSIX Regexps::, for how to use the
|
|||
|
compiled regular expression for matching.)
|
|||
|
|
|||
|
There is a special data type for compiled regular expressions:
|
|||
|
|
|||
|
-- Data Type: regex_t
|
|||
|
This type of object holds a compiled regular expression. It is
|
|||
|
actually a structure. It has just one field that your programs
|
|||
|
should look at:
|
|||
|
|
|||
|
`re_nsub'
|
|||
|
This field holds the number of parenthetical subexpressions
|
|||
|
in the regular expression that was compiled.
|
|||
|
|
|||
|
There are several other fields, but we don't describe them here,
|
|||
|
because only the functions in the library should use them.
|
|||
|
|
|||
|
After you create a `regex_t' object, you can compile a regular
|
|||
|
expression into it by calling `regcomp'.
|
|||
|
|
|||
|
-- Function: int regcomp (regex_t *restrict COMPILED, const char
|
|||
|
*restrict PATTERN, int CFLAGS)
|
|||
|
Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap lock dlopen
|
|||
|
| AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The function `regcomp' "compiles" a regular expression into a data
|
|||
|
structure that you can use with `regexec' to match against a
|
|||
|
string. The compiled regular expression format is designed for
|
|||
|
efficient matching. `regcomp' stores it into `*COMPILED'.
|
|||
|
|
|||
|
It's up to you to allocate an object of type `regex_t' and pass its
|
|||
|
address to `regcomp'.
|
|||
|
|
|||
|
The argument CFLAGS lets you specify various options that control
|
|||
|
the syntax and semantics of regular expressions. *Note Flags for
|
|||
|
POSIX Regexps::.
|
|||
|
|
|||
|
If you use the flag `REG_NOSUB', then `regcomp' omits from the
|
|||
|
compiled regular expression the information necessary to record
|
|||
|
how subexpressions actually match. In this case, you might as well
|
|||
|
pass `0' for the MATCHPTR and NMATCH arguments when you call
|
|||
|
`regexec'.
|
|||
|
|
|||
|
If you don't use `REG_NOSUB', then the compiled regular expression
|
|||
|
does have the capacity to record how subexpressions match. Also,
|
|||
|
`regcomp' tells you how many subexpressions PATTERN has, by
|
|||
|
storing the number in `COMPILED->re_nsub'. You can use that value
|
|||
|
to decide how long an array to allocate to hold information about
|
|||
|
subexpression matches.
|
|||
|
|
|||
|
`regcomp' returns `0' if it succeeds in compiling the regular
|
|||
|
expression; otherwise, it returns a nonzero error code (see the
|
|||
|
table below). You can use `regerror' to produce an error message
|
|||
|
string describing the reason for a nonzero value; see *note Regexp
|
|||
|
Cleanup::.
|
|||
|
|
|||
|
|
|||
|
Here are the possible nonzero values that `regcomp' can return:
|
|||
|
|
|||
|
`REG_BADBR'
|
|||
|
There was an invalid `\{...\}' construct in the regular
|
|||
|
expression. A valid `\{...\}' construct must contain either a
|
|||
|
single number, or two numbers in increasing order separated by a
|
|||
|
comma.
|
|||
|
|
|||
|
`REG_BADPAT'
|
|||
|
There was a syntax error in the regular expression.
|
|||
|
|
|||
|
`REG_BADRPT'
|
|||
|
A repetition operator such as `?' or `*' appeared in a bad
|
|||
|
position (with no preceding subexpression to act on).
|
|||
|
|
|||
|
`REG_ECOLLATE'
|
|||
|
The regular expression referred to an invalid collating element
|
|||
|
(one not defined in the current locale for string collation).
|
|||
|
*Note Locale Categories::.
|
|||
|
|
|||
|
`REG_ECTYPE'
|
|||
|
The regular expression referred to an invalid character class name.
|
|||
|
|
|||
|
`REG_EESCAPE'
|
|||
|
The regular expression ended with `\'.
|
|||
|
|
|||
|
`REG_ESUBREG'
|
|||
|
There was an invalid number in the `\DIGIT' construct.
|
|||
|
|
|||
|
`REG_EBRACK'
|
|||
|
There were unbalanced square brackets in the regular expression.
|
|||
|
|
|||
|
`REG_EPAREN'
|
|||
|
An extended regular expression had unbalanced parentheses, or a
|
|||
|
basic regular expression had unbalanced `\(' and `\)'.
|
|||
|
|
|||
|
`REG_EBRACE'
|
|||
|
The regular expression had unbalanced `\{' and `\}'.
|
|||
|
|
|||
|
`REG_ERANGE'
|
|||
|
One of the endpoints in a range expression was invalid.
|
|||
|
|
|||
|
`REG_ESPACE'
|
|||
|
`regcomp' ran out of memory.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Flags for POSIX Regexps, Next: Matching POSIX Regexps, Prev: POSIX Regexp Compilation, Up: Regular Expressions
|
|||
|
|
|||
|
10.3.2 Flags for POSIX Regular Expressions
|
|||
|
------------------------------------------
|
|||
|
|
|||
|
These are the bit flags that you can use in the CFLAGS operand when
|
|||
|
compiling a regular expression with `regcomp'.
|
|||
|
|
|||
|
`REG_EXTENDED'
|
|||
|
Treat the pattern as an extended regular expression, rather than
|
|||
|
as a basic regular expression.
|
|||
|
|
|||
|
`REG_ICASE'
|
|||
|
Ignore case when matching letters.
|
|||
|
|
|||
|
`REG_NOSUB'
|
|||
|
Don't bother storing the contents of the MATCHPTR array.
|
|||
|
|
|||
|
`REG_NEWLINE'
|
|||
|
Treat a newline in STRING as dividing STRING into multiple lines,
|
|||
|
so that `$' can match before the newline and `^' can match after.
|
|||
|
Also, don't permit `.' to match a newline, and don't permit
|
|||
|
`[^...]' to match a newline.
|
|||
|
|
|||
|
Otherwise, newline acts like any other ordinary character.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Matching POSIX Regexps, Next: Regexp Subexpressions, Prev: Flags for POSIX Regexps, Up: Regular Expressions
|
|||
|
|
|||
|
10.3.3 Matching a Compiled POSIX Regular Expression
|
|||
|
---------------------------------------------------
|
|||
|
|
|||
|
Once you have compiled a regular expression, as described in *note
|
|||
|
POSIX Regexp Compilation::, you can match it against strings using
|
|||
|
`regexec'. A match anywhere inside the string counts as success,
|
|||
|
unless the regular expression contains anchor characters (`^' or `$').
|
|||
|
|
|||
|
-- Function: int regexec (const regex_t *restrict COMPILED, const char
|
|||
|
*restrict STRING, size_t NMATCH, regmatch_t
|
|||
|
MATCHPTR[restrict], int EFLAGS)
|
|||
|
Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap lock dlopen
|
|||
|
| AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function tries to match the compiled regular expression
|
|||
|
`*COMPILED' against STRING.
|
|||
|
|
|||
|
`regexec' returns `0' if the regular expression matches;
|
|||
|
otherwise, it returns a nonzero value. See the table below for
|
|||
|
what nonzero values mean. You can use `regerror' to produce an
|
|||
|
error message string describing the reason for a nonzero value;
|
|||
|
see *note Regexp Cleanup::.
|
|||
|
|
|||
|
The argument EFLAGS is a word of bit flags that enable various
|
|||
|
options.
|
|||
|
|
|||
|
If you want to get information about what part of STRING actually
|
|||
|
matched the regular expression or its subexpressions, use the
|
|||
|
arguments MATCHPTR and NMATCH. Otherwise, pass `0' for NMATCH,
|
|||
|
and `NULL' for MATCHPTR. *Note Regexp Subexpressions::.
|
|||
|
|
|||
|
You must match the regular expression with the same set of current
|
|||
|
locales that were in effect when you compiled the regular expression.
|
|||
|
|
|||
|
The function `regexec' accepts the following flags in the EFLAGS
|
|||
|
argument:
|
|||
|
|
|||
|
`REG_NOTBOL'
|
|||
|
Do not regard the beginning of the specified string as the
|
|||
|
beginning of a line; more generally, don't make any assumptions
|
|||
|
about what text might precede it.
|
|||
|
|
|||
|
`REG_NOTEOL'
|
|||
|
Do not regard the end of the specified string as the end of a
|
|||
|
line; more generally, don't make any assumptions about what text
|
|||
|
might follow it.
|
|||
|
|
|||
|
Here are the possible nonzero values that `regexec' can return:
|
|||
|
|
|||
|
`REG_NOMATCH'
|
|||
|
The pattern didn't match the string. This isn't really an error.
|
|||
|
|
|||
|
`REG_ESPACE'
|
|||
|
`regexec' ran out of memory.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Regexp Subexpressions, Next: Subexpression Complications, Prev: Matching POSIX Regexps, Up: Regular Expressions
|
|||
|
|
|||
|
10.3.4 Match Results with Subexpressions
|
|||
|
----------------------------------------
|
|||
|
|
|||
|
When `regexec' matches parenthetical subexpressions of PATTERN, it
|
|||
|
records which parts of STRING they match. It returns that information
|
|||
|
by storing the offsets into an array whose elements are structures of
|
|||
|
type `regmatch_t'. The first element of the array (index `0') records
|
|||
|
the part of the string that matched the entire regular expression.
|
|||
|
Each other element of the array records the beginning and end of the
|
|||
|
part that matched a single parenthetical subexpression.
|
|||
|
|
|||
|
-- Data Type: regmatch_t
|
|||
|
This is the data type of the MATCHPTR array that you pass to
|
|||
|
`regexec'. It contains two structure fields, as follows:
|
|||
|
|
|||
|
`rm_so'
|
|||
|
The offset in STRING of the beginning of a substring. Add
|
|||
|
this value to STRING to get the address of that part.
|
|||
|
|
|||
|
`rm_eo'
|
|||
|
The offset in STRING of the end of the substring.
|
|||
|
|
|||
|
-- Data Type: regoff_t
|
|||
|
`regoff_t' is an alias for another signed integer type. The
|
|||
|
fields of `regmatch_t' have type `regoff_t'.
|
|||
|
|
|||
|
The `regmatch_t' elements correspond to subexpressions positionally;
|
|||
|
the first element (index `1') records where the first subexpression
|
|||
|
matched, the second element records the second subexpression, and so
|
|||
|
on. The order of the subexpressions is the order in which they begin.
|
|||
|
|
|||
|
When you call `regexec', you specify how long the MATCHPTR array is,
|
|||
|
with the NMATCH argument. This tells `regexec' how many elements to
|
|||
|
store. If the actual regular expression has more than NMATCH
|
|||
|
subexpressions, then you won't get offset information about the rest of
|
|||
|
them. But this doesn't alter whether the pattern matches a particular
|
|||
|
string or not.
|
|||
|
|
|||
|
If you don't want `regexec' to return any information about where
|
|||
|
the subexpressions matched, you can either supply `0' for NMATCH, or
|
|||
|
use the flag `REG_NOSUB' when you compile the pattern with `regcomp'.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Subexpression Complications, Next: Regexp Cleanup, Prev: Regexp Subexpressions, Up: Regular Expressions
|
|||
|
|
|||
|
10.3.5 Complications in Subexpression Matching
|
|||
|
----------------------------------------------
|
|||
|
|
|||
|
Sometimes a subexpression matches a substring of no characters. This
|
|||
|
happens when `f\(o*\)' matches the string `fum'. (It really matches
|
|||
|
just the `f'.) In this case, both of the offsets identify the point in
|
|||
|
the string where the null substring was found. In this example, the
|
|||
|
offsets are both `1'.
|
|||
|
|
|||
|
Sometimes the entire regular expression can match without using some
|
|||
|
of its subexpressions at all--for example, when `ba\(na\)*' matches the
|
|||
|
string `ba', the parenthetical subexpression is not used. When this
|
|||
|
happens, `regexec' stores `-1' in both fields of the element for that
|
|||
|
subexpression.
|
|||
|
|
|||
|
Sometimes matching the entire regular expression can match a
|
|||
|
particular subexpression more than once--for example, when `ba\(na\)*'
|
|||
|
matches the string `bananana', the parenthetical subexpression matches
|
|||
|
three times. When this happens, `regexec' usually stores the offsets
|
|||
|
of the last part of the string that matched the subexpression. In the
|
|||
|
case of `bananana', these offsets are `6' and `8'.
|
|||
|
|
|||
|
But the last match is not always the one that is chosen. It's more
|
|||
|
accurate to say that the last _opportunity_ to match is the one that
|
|||
|
takes precedence. What this means is that when one subexpression
|
|||
|
appears within another, then the results reported for the inner
|
|||
|
subexpression reflect whatever happened on the last match of the outer
|
|||
|
subexpression. For an example, consider `\(ba\(na\)*s \)*' matching
|
|||
|
the string `bananas bas '. The last time the inner expression actually
|
|||
|
matches is near the end of the first word. But it is _considered_
|
|||
|
again in the second word, and fails to match there. `regexec' reports
|
|||
|
nonuse of the "na" subexpression.
|
|||
|
|
|||
|
Another place where this rule applies is when the regular expression
|
|||
|
\(ba\(na\)*s \|nefer\(ti\)* \)*
|
|||
|
matches `bananas nefertiti'. The "na" subexpression does match in
|
|||
|
the first word, but it doesn't match in the second word because the
|
|||
|
other alternative is used there. Once again, the second repetition of
|
|||
|
the outer subexpression overrides the first, and within that second
|
|||
|
repetition, the "na" subexpression is not used. So `regexec' reports
|
|||
|
nonuse of the "na" subexpression.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Regexp Cleanup, Prev: Subexpression Complications, Up: Regular Expressions
|
|||
|
|
|||
|
10.3.6 POSIX Regexp Matching Cleanup
|
|||
|
------------------------------------
|
|||
|
|
|||
|
When you are finished using a compiled regular expression, you can free
|
|||
|
the storage it uses by calling `regfree'.
|
|||
|
|
|||
|
-- Function: void regfree (regex_t *COMPILED)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
|
|||
|
POSIX Safety Concepts::.
|
|||
|
|
|||
|
Calling `regfree' frees all the storage that `*COMPILED' points
|
|||
|
to. This includes various internal fields of the `regex_t'
|
|||
|
structure that aren't documented in this manual.
|
|||
|
|
|||
|
`regfree' does not free the object `*COMPILED' itself.
|
|||
|
|
|||
|
You should always free the space in a `regex_t' structure with
|
|||
|
`regfree' before using the structure to compile another regular
|
|||
|
expression.
|
|||
|
|
|||
|
When `regcomp' or `regexec' reports an error, you can use the
|
|||
|
function `regerror' to turn it into an error message string.
|
|||
|
|
|||
|
-- Function: size_t regerror (int ERRCODE, const regex_t *restrict
|
|||
|
COMPILED, char *restrict BUFFER, size_t LENGTH)
|
|||
|
Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
|
|||
|
AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function produces an error message string for the error code
|
|||
|
ERRCODE, and stores the string in LENGTH bytes of memory starting
|
|||
|
at BUFFER. For the COMPILED argument, supply the same compiled
|
|||
|
regular expression structure that `regcomp' or `regexec' was
|
|||
|
working with when it got the error. Alternatively, you can supply
|
|||
|
`NULL' for COMPILED; you will still get a meaningful error
|
|||
|
message, but it might not be as detailed.
|
|||
|
|
|||
|
If the error message can't fit in LENGTH bytes (including a
|
|||
|
terminating null character), then `regerror' truncates it. The
|
|||
|
string that `regerror' stores is always null-terminated even if it
|
|||
|
has been truncated.
|
|||
|
|
|||
|
The return value of `regerror' is the minimum length needed to
|
|||
|
store the entire error message. If this is less than LENGTH, then
|
|||
|
the error message was not truncated, and you can use it.
|
|||
|
Otherwise, you should call `regerror' again with a larger buffer.
|
|||
|
|
|||
|
Here is a function which uses `regerror', but always dynamically
|
|||
|
allocates a buffer for the error message:
|
|||
|
|
|||
|
char *get_regerror (int errcode, regex_t *compiled)
|
|||
|
{
|
|||
|
size_t length = regerror (errcode, compiled, NULL, 0);
|
|||
|
char *buffer = xmalloc (length);
|
|||
|
(void) regerror (errcode, compiled, buffer, length);
|
|||
|
return buffer;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Word Expansion, Prev: Regular Expressions, Up: Pattern Matching
|
|||
|
|
|||
|
10.4 Shell-Style Word Expansion
|
|||
|
===============================
|
|||
|
|
|||
|
"Word expansion" means the process of splitting a string into "words"
|
|||
|
and substituting for variables, commands, and wildcards just as the
|
|||
|
shell does.
|
|||
|
|
|||
|
For example, when you write `ls -l foo.c', this string is split into
|
|||
|
three separate words--`ls', `-l' and `foo.c'. This is the most basic
|
|||
|
function of word expansion.
|
|||
|
|
|||
|
When you write `ls *.c', this can become many words, because the
|
|||
|
word `*.c' can be replaced with any number of file names. This is
|
|||
|
called "wildcard expansion", and it is also a part of word expansion.
|
|||
|
|
|||
|
When you use `echo $PATH' to print your path, you are taking
|
|||
|
advantage of "variable substitution", which is also part of word
|
|||
|
expansion.
|
|||
|
|
|||
|
Ordinary programs can perform word expansion just like the shell by
|
|||
|
calling the library function `wordexp'.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Expansion Stages:: What word expansion does to a string.
|
|||
|
* Calling Wordexp:: How to call `wordexp'.
|
|||
|
* Flags for Wordexp:: Options you can enable in `wordexp'.
|
|||
|
* Wordexp Example:: A sample program that does word expansion.
|
|||
|
* Tilde Expansion:: Details of how tilde expansion works.
|
|||
|
* Variable Substitution:: Different types of variable substitution.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Expansion Stages, Next: Calling Wordexp, Up: Word Expansion
|
|||
|
|
|||
|
10.4.1 The Stages of Word Expansion
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
When word expansion is applied to a sequence of words, it performs the
|
|||
|
following transformations in the order shown here:
|
|||
|
|
|||
|
1. "Tilde expansion": Replacement of `~foo' with the name of the home
|
|||
|
directory of `foo'.
|
|||
|
|
|||
|
2. Next, three different transformations are applied in the same step,
|
|||
|
from left to right:
|
|||
|
|
|||
|
* "Variable substitution": Environment variables are
|
|||
|
substituted for references such as `$foo'.
|
|||
|
|
|||
|
* "Command substitution": Constructs such as ``cat foo`' and
|
|||
|
the equivalent `$(cat foo)' are replaced with the output from
|
|||
|
the inner command.
|
|||
|
|
|||
|
* "Arithmetic expansion": Constructs such as `$(($x-1))' are
|
|||
|
replaced with the result of the arithmetic computation.
|
|||
|
|
|||
|
3. "Field splitting": subdivision of the text into "words".
|
|||
|
|
|||
|
4. "Wildcard expansion": The replacement of a construct such as `*.c'
|
|||
|
with a list of `.c' file names. Wildcard expansion applies to an
|
|||
|
entire word at a time, and replaces that word with 0 or more file
|
|||
|
names that are themselves words.
|
|||
|
|
|||
|
5. "Quote removal": The deletion of string-quotes, now that they have
|
|||
|
done their job by inhibiting the above transformations when
|
|||
|
appropriate.
|
|||
|
|
|||
|
For the details of these transformations, and how to write the
|
|||
|
constructs that use them, see `The BASH Manual' (to appear).
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Calling Wordexp, Next: Flags for Wordexp, Prev: Expansion Stages, Up: Word Expansion
|
|||
|
|
|||
|
10.4.2 Calling `wordexp'
|
|||
|
------------------------
|
|||
|
|
|||
|
All the functions, constants and data types for word expansion are
|
|||
|
declared in the header file `wordexp.h'.
|
|||
|
|
|||
|
Word expansion produces a vector of words (strings). To return this
|
|||
|
vector, `wordexp' uses a special data type, `wordexp_t', which is a
|
|||
|
structure. You pass `wordexp' the address of the structure, and it
|
|||
|
fills in the structure's fields to tell you about the results.
|
|||
|
|
|||
|
-- Data Type: wordexp_t
|
|||
|
This data type holds a pointer to a word vector. More precisely,
|
|||
|
it records both the address of the word vector and its size.
|
|||
|
|
|||
|
`we_wordc'
|
|||
|
The number of elements in the vector.
|
|||
|
|
|||
|
`we_wordv'
|
|||
|
The address of the vector. This field has type `char **'.
|
|||
|
|
|||
|
`we_offs'
|
|||
|
The offset of the first real element of the vector, from its
|
|||
|
nominal address in the `we_wordv' field. Unlike the other
|
|||
|
fields, this is always an input to `wordexp', rather than an
|
|||
|
output from it.
|
|||
|
|
|||
|
If you use a nonzero offset, then that many elements at the
|
|||
|
beginning of the vector are left empty. (The `wordexp'
|
|||
|
function fills them with null pointers.)
|
|||
|
|
|||
|
The `we_offs' field is meaningful only if you use the
|
|||
|
`WRDE_DOOFFS' flag. Otherwise, the offset is always zero
|
|||
|
regardless of what is in this field, and the first real
|
|||
|
element comes at the beginning of the vector.
|
|||
|
|
|||
|
-- Function: int wordexp (const char *WORDS, wordexp_t
|
|||
|
*WORD-VECTOR-PTR, int FLAGS)
|
|||
|
Preliminary: | MT-Unsafe race:utent const:env env sig:ALRM timer
|
|||
|
locale | AS-Unsafe dlopen plugin i18n heap corrupt lock |
|
|||
|
AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
Perform word expansion on the string WORDS, putting the result in
|
|||
|
a newly allocated vector, and store the size and address of this
|
|||
|
vector into `*WORD-VECTOR-PTR'. The argument FLAGS is a
|
|||
|
combination of bit flags; see *note Flags for Wordexp::, for
|
|||
|
details of the flags.
|
|||
|
|
|||
|
You shouldn't use any of the characters `|&;<>' in the string
|
|||
|
WORDS unless they are quoted; likewise for newline. If you use
|
|||
|
these characters unquoted, you will get the `WRDE_BADCHAR' error
|
|||
|
code. Don't use parentheses or braces unless they are quoted or
|
|||
|
part of a word expansion construct. If you use quotation
|
|||
|
characters `'"`', they should come in pairs that balance.
|
|||
|
|
|||
|
The results of word expansion are a sequence of words. The
|
|||
|
function `wordexp' allocates a string for each resulting word, then
|
|||
|
allocates a vector of type `char **' to store the addresses of
|
|||
|
these strings. The last element of the vector is a null pointer.
|
|||
|
This vector is called the "word vector".
|
|||
|
|
|||
|
To return this vector, `wordexp' stores both its address and its
|
|||
|
length (number of elements, not counting the terminating null
|
|||
|
pointer) into `*WORD-VECTOR-PTR'.
|
|||
|
|
|||
|
If `wordexp' succeeds, it returns 0. Otherwise, it returns one of
|
|||
|
these error codes:
|
|||
|
|
|||
|
`WRDE_BADCHAR'
|
|||
|
The input string WORDS contains an unquoted invalid character
|
|||
|
such as `|'.
|
|||
|
|
|||
|
`WRDE_BADVAL'
|
|||
|
The input string refers to an undefined shell variable, and
|
|||
|
you used the flag `WRDE_UNDEF' to forbid such references.
|
|||
|
|
|||
|
`WRDE_CMDSUB'
|
|||
|
The input string uses command substitution, and you used the
|
|||
|
flag `WRDE_NOCMD' to forbid command substitution.
|
|||
|
|
|||
|
`WRDE_NOSPACE'
|
|||
|
It was impossible to allocate memory to hold the result. In
|
|||
|
this case, `wordexp' can store part of the results--as much
|
|||
|
as it could allocate room for.
|
|||
|
|
|||
|
`WRDE_SYNTAX'
|
|||
|
There was a syntax error in the input string. For example,
|
|||
|
an unmatched quoting character is a syntax error. This error
|
|||
|
code is also used to signal division by zero and overflow in
|
|||
|
arithmetic expansion.
|
|||
|
|
|||
|
-- Function: void wordfree (wordexp_t *WORD-VECTOR-PTR)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe
|
|||
|
corrupt mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
Free the storage used for the word-strings and vector that
|
|||
|
`*WORD-VECTOR-PTR' points to. This does not free the structure
|
|||
|
`*WORD-VECTOR-PTR' itself--only the other data it points to.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Flags for Wordexp, Next: Wordexp Example, Prev: Calling Wordexp, Up: Word Expansion
|
|||
|
|
|||
|
10.4.3 Flags for Word Expansion
|
|||
|
-------------------------------
|
|||
|
|
|||
|
This section describes the flags that you can specify in the FLAGS
|
|||
|
argument to `wordexp'. Choose the flags you want, and combine them
|
|||
|
with the C operator `|'.
|
|||
|
|
|||
|
`WRDE_APPEND'
|
|||
|
Append the words from this expansion to the vector of words
|
|||
|
produced by previous calls to `wordexp'. This way you can
|
|||
|
effectively expand several words as if they were concatenated with
|
|||
|
spaces between them.
|
|||
|
|
|||
|
In order for appending to work, you must not modify the contents
|
|||
|
of the word vector structure between calls to `wordexp'. And, if
|
|||
|
you set `WRDE_DOOFFS' in the first call to `wordexp', you must also
|
|||
|
set it when you append to the results.
|
|||
|
|
|||
|
`WRDE_DOOFFS'
|
|||
|
Leave blank slots at the beginning of the vector of words. The
|
|||
|
`we_offs' field says how many slots to leave. The blank slots
|
|||
|
contain null pointers.
|
|||
|
|
|||
|
`WRDE_NOCMD'
|
|||
|
Don't do command substitution; if the input requests command
|
|||
|
substitution, report an error.
|
|||
|
|
|||
|
`WRDE_REUSE'
|
|||
|
Reuse a word vector made by a previous call to `wordexp'. Instead
|
|||
|
of allocating a new vector of words, this call to `wordexp' will
|
|||
|
use the vector that already exists (making it larger if necessary).
|
|||
|
|
|||
|
Note that the vector may move, so it is not safe to save an old
|
|||
|
pointer and use it again after calling `wordexp'. You must fetch
|
|||
|
`we_pathv' anew after each call.
|
|||
|
|
|||
|
`WRDE_SHOWERR'
|
|||
|
Do show any error messages printed by commands run by command
|
|||
|
substitution. More precisely, allow these commands to inherit the
|
|||
|
standard error output stream of the current process. By default,
|
|||
|
`wordexp' gives these commands a standard error stream that
|
|||
|
discards all output.
|
|||
|
|
|||
|
`WRDE_UNDEF'
|
|||
|
If the input refers to a shell variable that is not defined,
|
|||
|
report an error.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Wordexp Example, Next: Tilde Expansion, Prev: Flags for Wordexp, Up: Word Expansion
|
|||
|
|
|||
|
10.4.4 `wordexp' Example
|
|||
|
------------------------
|
|||
|
|
|||
|
Here is an example of using `wordexp' to expand several strings and use
|
|||
|
the results to run a shell command. It also shows the use of
|
|||
|
`WRDE_APPEND' to concatenate the expansions and of `wordfree' to free
|
|||
|
the space allocated by `wordexp'.
|
|||
|
|
|||
|
int
|
|||
|
expand_and_execute (const char *program, const char **options)
|
|||
|
{
|
|||
|
wordexp_t result;
|
|||
|
pid_t pid
|
|||
|
int status, i;
|
|||
|
|
|||
|
/* Expand the string for the program to run. */
|
|||
|
switch (wordexp (program, &result, 0))
|
|||
|
{
|
|||
|
case 0: /* Successful. */
|
|||
|
break;
|
|||
|
case WRDE_NOSPACE:
|
|||
|
/* If the error was `WRDE_NOSPACE',
|
|||
|
then perhaps part of the result was allocated. */
|
|||
|
wordfree (&result);
|
|||
|
default: /* Some other error. */
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
/* Expand the strings specified for the arguments. */
|
|||
|
for (i = 0; options[i] != NULL; i++)
|
|||
|
{
|
|||
|
if (wordexp (options[i], &result, WRDE_APPEND))
|
|||
|
{
|
|||
|
wordfree (&result);
|
|||
|
return -1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
pid = fork ();
|
|||
|
if (pid == 0)
|
|||
|
{
|
|||
|
/* This is the child process. Execute the command. */
|
|||
|
execv (result.we_wordv[0], result.we_wordv);
|
|||
|
exit (EXIT_FAILURE);
|
|||
|
}
|
|||
|
else if (pid < 0)
|
|||
|
/* The fork failed. Report failure. */
|
|||
|
status = -1;
|
|||
|
else
|
|||
|
/* This is the parent process. Wait for the child to complete. */
|
|||
|
if (waitpid (pid, &status, 0) != pid)
|
|||
|
status = -1;
|
|||
|
|
|||
|
wordfree (&result);
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Tilde Expansion, Next: Variable Substitution, Prev: Wordexp Example, Up: Word Expansion
|
|||
|
|
|||
|
10.4.5 Details of Tilde Expansion
|
|||
|
---------------------------------
|
|||
|
|
|||
|
It's a standard part of shell syntax that you can use `~' at the
|
|||
|
beginning of a file name to stand for your own home directory. You can
|
|||
|
use `~USER' to stand for USER's home directory.
|
|||
|
|
|||
|
"Tilde expansion" is the process of converting these abbreviations
|
|||
|
to the directory names that they stand for.
|
|||
|
|
|||
|
Tilde expansion applies to the `~' plus all following characters up
|
|||
|
to whitespace or a slash. It takes place only at the beginning of a
|
|||
|
word, and only if none of the characters to be transformed is quoted in
|
|||
|
any way.
|
|||
|
|
|||
|
Plain `~' uses the value of the environment variable `HOME' as the
|
|||
|
proper home directory name. `~' followed by a user name uses
|
|||
|
`getpwname' to look up that user in the user database, and uses
|
|||
|
whatever directory is recorded there. Thus, `~' followed by your own
|
|||
|
name can give different results from plain `~', if the value of `HOME'
|
|||
|
is not really your home directory.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Variable Substitution, Prev: Tilde Expansion, Up: Word Expansion
|
|||
|
|
|||
|
10.4.6 Details of Variable Substitution
|
|||
|
---------------------------------------
|
|||
|
|
|||
|
Part of ordinary shell syntax is the use of `$VARIABLE' to substitute
|
|||
|
the value of a shell variable into a command. This is called "variable
|
|||
|
substitution", and it is one part of doing word expansion.
|
|||
|
|
|||
|
There are two basic ways you can write a variable reference for
|
|||
|
substitution:
|
|||
|
|
|||
|
`${VARIABLE}'
|
|||
|
If you write braces around the variable name, then it is completely
|
|||
|
unambiguous where the variable name ends. You can concatenate
|
|||
|
additional letters onto the end of the variable value by writing
|
|||
|
them immediately after the close brace. For example, `${foo}s'
|
|||
|
expands into `tractors'.
|
|||
|
|
|||
|
`$VARIABLE'
|
|||
|
If you do not put braces around the variable name, then the
|
|||
|
variable name consists of all the alphanumeric characters and
|
|||
|
underscores that follow the `$'. The next punctuation character
|
|||
|
ends the variable name. Thus, `$foo-bar' refers to the variable
|
|||
|
`foo' and expands into `tractor-bar'.
|
|||
|
|
|||
|
When you use braces, you can also use various constructs to modify
|
|||
|
the value that is substituted, or test it in various ways.
|
|||
|
|
|||
|
`${VARIABLE:-DEFAULT}'
|
|||
|
Substitute the value of VARIABLE, but if that is empty or
|
|||
|
undefined, use DEFAULT instead.
|
|||
|
|
|||
|
`${VARIABLE:=DEFAULT}'
|
|||
|
Substitute the value of VARIABLE, but if that is empty or
|
|||
|
undefined, use DEFAULT instead and set the variable to DEFAULT.
|
|||
|
|
|||
|
`${VARIABLE:?MESSAGE}'
|
|||
|
If VARIABLE is defined and not empty, substitute its value.
|
|||
|
|
|||
|
Otherwise, print MESSAGE as an error message on the standard error
|
|||
|
stream, and consider word expansion a failure.
|
|||
|
|
|||
|
`${VARIABLE:+REPLACEMENT}'
|
|||
|
Substitute REPLACEMENT, but only if VARIABLE is defined and
|
|||
|
nonempty. Otherwise, substitute nothing for this construct.
|
|||
|
|
|||
|
`${#VARIABLE}'
|
|||
|
Substitute a numeral which expresses in base ten the number of
|
|||
|
characters in the value of VARIABLE. `${#foo}' stands for `7',
|
|||
|
because `tractor' is seven characters.
|
|||
|
|
|||
|
These variants of variable substitution let you remove part of the
|
|||
|
variable's value before substituting it. The PREFIX and SUFFIX are not
|
|||
|
mere strings; they are wildcard patterns, just like the patterns that
|
|||
|
you use to match multiple file names. But in this context, they match
|
|||
|
against parts of the variable value rather than against file names.
|
|||
|
|
|||
|
`${VARIABLE%%SUFFIX}'
|
|||
|
Substitute the value of VARIABLE, but first discard from that
|
|||
|
variable any portion at the end that matches the pattern SUFFIX.
|
|||
|
|
|||
|
If there is more than one alternative for how to match against
|
|||
|
SUFFIX, this construct uses the longest possible match.
|
|||
|
|
|||
|
Thus, `${foo%%r*}' substitutes `t', because the largest match for
|
|||
|
`r*' at the end of `tractor' is `ractor'.
|
|||
|
|
|||
|
`${VARIABLE%SUFFIX}'
|
|||
|
Substitute the value of VARIABLE, but first discard from that
|
|||
|
variable any portion at the end that matches the pattern SUFFIX.
|
|||
|
|
|||
|
If there is more than one alternative for how to match against
|
|||
|
SUFFIX, this construct uses the shortest possible alternative.
|
|||
|
|
|||
|
Thus, `${foo%r*}' substitutes `tracto', because the shortest match
|
|||
|
for `r*' at the end of `tractor' is just `r'.
|
|||
|
|
|||
|
`${VARIABLE##PREFIX}'
|
|||
|
Substitute the value of VARIABLE, but first discard from that
|
|||
|
variable any portion at the beginning that matches the pattern
|
|||
|
PREFIX.
|
|||
|
|
|||
|
If there is more than one alternative for how to match against
|
|||
|
PREFIX, this construct uses the longest possible match.
|
|||
|
|
|||
|
Thus, `${foo##*t}' substitutes `or', because the largest match for
|
|||
|
`*t' at the beginning of `tractor' is `tract'.
|
|||
|
|
|||
|
`${VARIABLE#PREFIX}'
|
|||
|
Substitute the value of VARIABLE, but first discard from that
|
|||
|
variable any portion at the beginning that matches the pattern
|
|||
|
PREFIX.
|
|||
|
|
|||
|
If there is more than one alternative for how to match against
|
|||
|
PREFIX, this construct uses the shortest possible alternative.
|
|||
|
|
|||
|
Thus, `${foo#*t}' substitutes `ractor', because the shortest match
|
|||
|
for `*t' at the beginning of `tractor' is just `t'.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: I/O Overview, Next: I/O on Streams, Prev: Pattern Matching, Up: Top
|
|||
|
|
|||
|
11 Input/Output Overview
|
|||
|
************************
|
|||
|
|
|||
|
Most programs need to do either input (reading data) or output (writing
|
|||
|
data), or most frequently both, in order to do anything useful. The
|
|||
|
GNU C Library provides such a large selection of input and output
|
|||
|
functions that the hardest part is often deciding which function is most
|
|||
|
appropriate!
|
|||
|
|
|||
|
This chapter introduces concepts and terminology relating to input
|
|||
|
and output. Other chapters relating to the GNU I/O facilities are:
|
|||
|
|
|||
|
* *note I/O on Streams::, which covers the high-level functions that
|
|||
|
operate on streams, including formatted input and output.
|
|||
|
|
|||
|
* *note Low-Level I/O::, which covers the basic I/O and control
|
|||
|
functions on file descriptors.
|
|||
|
|
|||
|
* *note File System Interface::, which covers functions for
|
|||
|
operating on directories and for manipulating file attributes such
|
|||
|
as access modes and ownership.
|
|||
|
|
|||
|
* *note Pipes and FIFOs::, which includes information on the basic
|
|||
|
interprocess communication facilities.
|
|||
|
|
|||
|
* *note Sockets::, which covers a more complicated interprocess
|
|||
|
communication facility with support for networking.
|
|||
|
|
|||
|
* *note Low-Level Terminal Interface::, which covers functions for
|
|||
|
changing how input and output to terminals or other serial devices
|
|||
|
are processed.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* I/O Concepts:: Some basic information and terminology.
|
|||
|
* File Names:: How to refer to a file.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: I/O Concepts, Next: File Names, Up: I/O Overview
|
|||
|
|
|||
|
11.1 Input/Output Concepts
|
|||
|
==========================
|
|||
|
|
|||
|
Before you can read or write the contents of a file, you must establish
|
|||
|
a connection or communications channel to the file. This process is
|
|||
|
called "opening" the file. You can open a file for reading, writing,
|
|||
|
or both.
|
|||
|
|
|||
|
The connection to an open file is represented either as a stream or
|
|||
|
as a file descriptor. You pass this as an argument to the functions
|
|||
|
that do the actual read or write operations, to tell them which file to
|
|||
|
operate on. Certain functions expect streams, and others are designed
|
|||
|
to operate on file descriptors.
|
|||
|
|
|||
|
When you have finished reading to or writing from the file, you can
|
|||
|
terminate the connection by "closing" the file. Once you have closed a
|
|||
|
stream or file descriptor, you cannot do any more input or output
|
|||
|
operations on it.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Streams and File Descriptors:: The GNU C Library provides two ways
|
|||
|
to access the contents of files.
|
|||
|
* File Position:: The number of bytes from the
|
|||
|
beginning of the file.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Streams and File Descriptors, Next: File Position, Up: I/O Concepts
|
|||
|
|
|||
|
11.1.1 Streams and File Descriptors
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
When you want to do input or output to a file, you have a choice of two
|
|||
|
basic mechanisms for representing the connection between your program
|
|||
|
and the file: file descriptors and streams. File descriptors are
|
|||
|
represented as objects of type `int', while streams are represented as
|
|||
|
`FILE *' objects.
|
|||
|
|
|||
|
File descriptors provide a primitive, low-level interface to input
|
|||
|
and output operations. Both file descriptors and streams can represent
|
|||
|
a connection to a device (such as a terminal), or a pipe or socket for
|
|||
|
communicating with another process, as well as a normal file. But, if
|
|||
|
you want to do control operations that are specific to a particular kind
|
|||
|
of device, you must use a file descriptor; there are no facilities to
|
|||
|
use streams in this way. You must also use file descriptors if your
|
|||
|
program needs to do input or output in special modes, such as
|
|||
|
nonblocking (or polled) input (*note File Status Flags::).
|
|||
|
|
|||
|
Streams provide a higher-level interface, layered on top of the
|
|||
|
primitive file descriptor facilities. The stream interface treats all
|
|||
|
kinds of files pretty much alike--the sole exception being the three
|
|||
|
styles of buffering that you can choose (*note Stream Buffering::).
|
|||
|
|
|||
|
The main advantage of using the stream interface is that the set of
|
|||
|
functions for performing actual input and output operations (as opposed
|
|||
|
to control operations) on streams is much richer and more powerful than
|
|||
|
the corresponding facilities for file descriptors. The file descriptor
|
|||
|
interface provides only simple functions for transferring blocks of
|
|||
|
characters, but the stream interface also provides powerful formatted
|
|||
|
input and output functions (`printf' and `scanf') as well as functions
|
|||
|
for character- and line-oriented input and output.
|
|||
|
|
|||
|
Since streams are implemented in terms of file descriptors, you can
|
|||
|
extract the file descriptor from a stream and perform low-level
|
|||
|
operations directly on the file descriptor. You can also initially open
|
|||
|
a connection as a file descriptor and then make a stream associated with
|
|||
|
that file descriptor.
|
|||
|
|
|||
|
In general, you should stick with using streams rather than file
|
|||
|
descriptors, unless there is some specific operation you want to do that
|
|||
|
can only be done on a file descriptor. If you are a beginning
|
|||
|
programmer and aren't sure what functions to use, we suggest that you
|
|||
|
concentrate on the formatted input functions (*note Formatted Input::)
|
|||
|
and formatted output functions (*note Formatted Output::).
|
|||
|
|
|||
|
If you are concerned about portability of your programs to systems
|
|||
|
other than GNU, you should also be aware that file descriptors are not
|
|||
|
as portable as streams. You can expect any system running ISO C to
|
|||
|
support streams, but non-GNU systems may not support file descriptors at
|
|||
|
all, or may only implement a subset of the GNU functions that operate on
|
|||
|
file descriptors. Most of the file descriptor functions in the GNU C
|
|||
|
Library are included in the POSIX.1 standard, however.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: File Position, Prev: Streams and File Descriptors, Up: I/O Concepts
|
|||
|
|
|||
|
11.1.2 File Position
|
|||
|
--------------------
|
|||
|
|
|||
|
One of the attributes of an open file is its "file position" that keeps
|
|||
|
track of where in the file the next character is to be read or written.
|
|||
|
On GNU systems, and all POSIX.1 systems, the file position is simply an
|
|||
|
integer representing the number of bytes from the beginning of the file.
|
|||
|
|
|||
|
The file position is normally set to the beginning of the file when
|
|||
|
it is opened, and each time a character is read or written, the file
|
|||
|
position is incremented. In other words, access to the file is normally
|
|||
|
"sequential".
|
|||
|
|
|||
|
Ordinary files permit read or write operations at any position within
|
|||
|
the file. Some other kinds of files may also permit this. Files which
|
|||
|
do permit this are sometimes referred to as "random-access" files. You
|
|||
|
can change the file position using the `fseek' function on a stream
|
|||
|
(*note File Positioning::) or the `lseek' function on a file descriptor
|
|||
|
(*note I/O Primitives::). If you try to change the file position on a
|
|||
|
file that doesn't support random access, you get the `ESPIPE' error.
|
|||
|
|
|||
|
Streams and descriptors that are opened for "append access" are
|
|||
|
treated specially for output: output to such files is _always_ appended
|
|||
|
sequentially to the _end_ of the file, regardless of the file position.
|
|||
|
However, the file position is still used to control where in the file
|
|||
|
reading is done.
|
|||
|
|
|||
|
If you think about it, you'll realize that several programs can read
|
|||
|
a given file at the same time. In order for each program to be able to
|
|||
|
read the file at its own pace, each program must have its own file
|
|||
|
pointer, which is not affected by anything the other programs do.
|
|||
|
|
|||
|
In fact, each opening of a file creates a separate file position.
|
|||
|
Thus, if you open a file twice even in the same program, you get two
|
|||
|
streams or descriptors with independent file positions.
|
|||
|
|
|||
|
By contrast, if you open a descriptor and then duplicate it to get
|
|||
|
another descriptor, these two descriptors share the same file position:
|
|||
|
changing the file position of one descriptor will affect the other.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: File Names, Prev: I/O Concepts, Up: I/O Overview
|
|||
|
|
|||
|
11.2 File Names
|
|||
|
===============
|
|||
|
|
|||
|
In order to open a connection to a file, or to perform other operations
|
|||
|
such as deleting a file, you need some way to refer to the file. Nearly
|
|||
|
all files have names that are strings--even files which are actually
|
|||
|
devices such as tape drives or terminals. These strings are called
|
|||
|
"file names". You specify the file name to say which file you want to
|
|||
|
open or operate on.
|
|||
|
|
|||
|
This section describes the conventions for file names and how the
|
|||
|
operating system works with them.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Directories:: Directories contain entries for files.
|
|||
|
* File Name Resolution:: A file name specifies how to look up a file.
|
|||
|
* File Name Errors:: Error conditions relating to file names.
|
|||
|
* File Name Portability:: File name portability and syntax issues.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Directories, Next: File Name Resolution, Up: File Names
|
|||
|
|
|||
|
11.2.1 Directories
|
|||
|
------------------
|
|||
|
|
|||
|
In order to understand the syntax of file names, you need to understand
|
|||
|
how the file system is organized into a hierarchy of directories.
|
|||
|
|
|||
|
A "directory" is a file that contains information to associate other
|
|||
|
files with names; these associations are called "links" or "directory
|
|||
|
entries". Sometimes, people speak of "files in a directory", but in
|
|||
|
reality, a directory only contains pointers to files, not the files
|
|||
|
themselves.
|
|||
|
|
|||
|
The name of a file contained in a directory entry is called a "file
|
|||
|
name component". In general, a file name consists of a sequence of one
|
|||
|
or more such components, separated by the slash character (`/'). A
|
|||
|
file name which is just one component names a file with respect to its
|
|||
|
directory. A file name with multiple components names a directory, and
|
|||
|
then a file in that directory, and so on.
|
|||
|
|
|||
|
Some other documents, such as the POSIX standard, use the term
|
|||
|
"pathname" for what we call a file name, and either "filename" or
|
|||
|
"pathname component" for what this manual calls a file name component.
|
|||
|
We don't use this terminology because a "path" is something completely
|
|||
|
different (a list of directories to search), and we think that
|
|||
|
"pathname" used for something else will confuse users. We always use
|
|||
|
"file name" and "file name component" (or sometimes just "component",
|
|||
|
where the context is obvious) in GNU documentation. Some macros use
|
|||
|
the POSIX terminology in their names, such as `PATH_MAX'. These macros
|
|||
|
are defined by the POSIX standard, so we cannot change their names.
|
|||
|
|
|||
|
You can find more detailed information about operations on
|
|||
|
directories in *note File System Interface::.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: File Name Resolution, Next: File Name Errors, Prev: Directories, Up: File Names
|
|||
|
|
|||
|
11.2.2 File Name Resolution
|
|||
|
---------------------------
|
|||
|
|
|||
|
A file name consists of file name components separated by slash (`/')
|
|||
|
characters. On the systems that the GNU C Library supports, multiple
|
|||
|
successive `/' characters are equivalent to a single `/' character.
|
|||
|
|
|||
|
The process of determining what file a file name refers to is called
|
|||
|
"file name resolution". This is performed by examining the components
|
|||
|
that make up a file name in left-to-right order, and locating each
|
|||
|
successive component in the directory named by the previous component.
|
|||
|
Of course, each of the files that are referenced as directories must
|
|||
|
actually exist, be directories instead of regular files, and have the
|
|||
|
appropriate permissions to be accessible by the process; otherwise the
|
|||
|
file name resolution fails.
|
|||
|
|
|||
|
If a file name begins with a `/', the first component in the file
|
|||
|
name is located in the "root directory" of the process (usually all
|
|||
|
processes on the system have the same root directory). Such a file name
|
|||
|
is called an "absolute file name".
|
|||
|
|
|||
|
Otherwise, the first component in the file name is located in the
|
|||
|
current working directory (*note Working Directory::). This kind of
|
|||
|
file name is called a "relative file name".
|
|||
|
|
|||
|
The file name components `.' ("dot") and `..' ("dot-dot") have
|
|||
|
special meanings. Every directory has entries for these file name
|
|||
|
components. The file name component `.' refers to the directory
|
|||
|
itself, while the file name component `..' refers to its "parent
|
|||
|
directory" (the directory that contains the link for the directory in
|
|||
|
question). As a special case, `..' in the root directory refers to the
|
|||
|
root directory itself, since it has no parent; thus `/..' is the same
|
|||
|
as `/'.
|
|||
|
|
|||
|
Here are some examples of file names:
|
|||
|
|
|||
|
`/a'
|
|||
|
The file named `a', in the root directory.
|
|||
|
|
|||
|
`/a/b'
|
|||
|
The file named `b', in the directory named `a' in the root
|
|||
|
directory.
|
|||
|
|
|||
|
`a'
|
|||
|
The file named `a', in the current working directory.
|
|||
|
|
|||
|
`/a/./b'
|
|||
|
This is the same as `/a/b'.
|
|||
|
|
|||
|
`./a'
|
|||
|
The file named `a', in the current working directory.
|
|||
|
|
|||
|
`../a'
|
|||
|
The file named `a', in the parent directory of the current working
|
|||
|
directory.
|
|||
|
|
|||
|
A file name that names a directory may optionally end in a `/'. You
|
|||
|
can specify a file name of `/' to refer to the root directory, but the
|
|||
|
empty string is not a meaningful file name. If you want to refer to
|
|||
|
the current working directory, use a file name of `.' or `./'.
|
|||
|
|
|||
|
Unlike some other operating systems, GNU systems don't have any
|
|||
|
built-in support for file types (or extensions) or file versions as part
|
|||
|
of its file name syntax. Many programs and utilities use conventions
|
|||
|
for file names--for example, files containing C source code usually
|
|||
|
have names suffixed with `.c'--but there is nothing in the file system
|
|||
|
itself that enforces this kind of convention.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: File Name Errors, Next: File Name Portability, Prev: File Name Resolution, Up: File Names
|
|||
|
|
|||
|
11.2.3 File Name Errors
|
|||
|
-----------------------
|
|||
|
|
|||
|
Functions that accept file name arguments usually detect these `errno'
|
|||
|
error conditions relating to the file name syntax or trouble finding
|
|||
|
the named file. These errors are referred to throughout this manual as
|
|||
|
the "usual file name errors".
|
|||
|
|
|||
|
`EACCES'
|
|||
|
The process does not have search permission for a directory
|
|||
|
component of the file name.
|
|||
|
|
|||
|
`ENAMETOOLONG'
|
|||
|
This error is used when either the total length of a file name is
|
|||
|
greater than `PATH_MAX', or when an individual file name component
|
|||
|
has a length greater than `NAME_MAX'. *Note Limits for Files::.
|
|||
|
|
|||
|
On GNU/Hurd systems, there is no imposed limit on overall file name
|
|||
|
length, but some file systems may place limits on the length of a
|
|||
|
component.
|
|||
|
|
|||
|
`ENOENT'
|
|||
|
This error is reported when a file referenced as a directory
|
|||
|
component in the file name doesn't exist, or when a component is a
|
|||
|
symbolic link whose target file does not exist. *Note Symbolic
|
|||
|
Links::.
|
|||
|
|
|||
|
`ENOTDIR'
|
|||
|
A file that is referenced as a directory component in the file name
|
|||
|
exists, but it isn't a directory.
|
|||
|
|
|||
|
`ELOOP'
|
|||
|
Too many symbolic links were resolved while trying to look up the
|
|||
|
file name. The system has an arbitrary limit on the number of
|
|||
|
symbolic links that may be resolved in looking up a single file
|
|||
|
name, as a primitive way to detect loops. *Note Symbolic Links::.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: File Name Portability, Prev: File Name Errors, Up: File Names
|
|||
|
|
|||
|
11.2.4 Portability of File Names
|
|||
|
--------------------------------
|
|||
|
|
|||
|
The rules for the syntax of file names discussed in *note File Names::,
|
|||
|
are the rules normally used by GNU systems and by other POSIX systems.
|
|||
|
However, other operating systems may use other conventions.
|
|||
|
|
|||
|
There are two reasons why it can be important for you to be aware of
|
|||
|
file name portability issues:
|
|||
|
|
|||
|
* If your program makes assumptions about file name syntax, or
|
|||
|
contains embedded literal file name strings, it is more difficult
|
|||
|
to get it to run under other operating systems that use different
|
|||
|
syntax conventions.
|
|||
|
|
|||
|
* Even if you are not concerned about running your program on
|
|||
|
machines that run other operating systems, it may still be
|
|||
|
possible to access files that use different naming conventions.
|
|||
|
For example, you may be able to access file systems on another
|
|||
|
computer running a different operating system over a network, or
|
|||
|
read and write disks in formats used by other operating systems.
|
|||
|
|
|||
|
The ISO C standard says very little about file name syntax, only that
|
|||
|
file names are strings. In addition to varying restrictions on the
|
|||
|
length of file names and what characters can validly appear in a file
|
|||
|
name, different operating systems use different conventions and syntax
|
|||
|
for concepts such as structured directories and file types or
|
|||
|
extensions. Some concepts such as file versions might be supported in
|
|||
|
some operating systems and not by others.
|
|||
|
|
|||
|
The POSIX.1 standard allows implementations to put additional
|
|||
|
restrictions on file name syntax, concerning what characters are
|
|||
|
permitted in file names and on the length of file name and file name
|
|||
|
component strings. However, on GNU systems, any character except the
|
|||
|
null character is permitted in a file name string, and on GNU/Hurd
|
|||
|
systems there are no limits on the length of file name strings.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: I/O on Streams, Next: Low-Level I/O, Prev: I/O Overview, Up: Top
|
|||
|
|
|||
|
12 Input/Output on Streams
|
|||
|
**************************
|
|||
|
|
|||
|
This chapter describes the functions for creating streams and performing
|
|||
|
input and output operations on them. As discussed in *note I/O
|
|||
|
Overview::, a stream is a fairly abstract, high-level concept
|
|||
|
representing a communications channel to a file, device, or process.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Streams:: About the data type representing a stream.
|
|||
|
* Standard Streams:: Streams to the standard input and output
|
|||
|
devices are created for you.
|
|||
|
* Opening Streams:: How to create a stream to talk to a file.
|
|||
|
* Closing Streams:: Close a stream when you are finished with it.
|
|||
|
* Streams and Threads:: Issues with streams in threaded programs.
|
|||
|
* Streams and I18N:: Streams in internationalized applications.
|
|||
|
* Simple Output:: Unformatted output by characters and lines.
|
|||
|
* Character Input:: Unformatted input by characters and words.
|
|||
|
* Line Input:: Reading a line or a record from a stream.
|
|||
|
* Unreading:: Peeking ahead/pushing back input just read.
|
|||
|
* Block Input/Output:: Input and output operations on blocks of data.
|
|||
|
* Formatted Output:: `printf' and related functions.
|
|||
|
* Customizing Printf:: You can define new conversion specifiers for
|
|||
|
`printf' and friends.
|
|||
|
* Formatted Input:: `scanf' and related functions.
|
|||
|
* EOF and Errors:: How you can tell if an I/O error happens.
|
|||
|
* Error Recovery:: What you can do about errors.
|
|||
|
* Binary Streams:: Some systems distinguish between text files
|
|||
|
and binary files.
|
|||
|
* File Positioning:: About random-access streams.
|
|||
|
* Portable Positioning:: Random access on peculiar ISO C systems.
|
|||
|
* Stream Buffering:: How to control buffering of streams.
|
|||
|
* Other Kinds of Streams:: Streams that do not necessarily correspond
|
|||
|
to an open file.
|
|||
|
* Formatted Messages:: Print strictly formatted messages.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Streams, Next: Standard Streams, Up: I/O on Streams
|
|||
|
|
|||
|
12.1 Streams
|
|||
|
============
|
|||
|
|
|||
|
For historical reasons, the type of the C data structure that represents
|
|||
|
a stream is called `FILE' rather than "stream". Since most of the
|
|||
|
library functions deal with objects of type `FILE *', sometimes the
|
|||
|
term "file pointer" is also used to mean "stream". This leads to
|
|||
|
unfortunate confusion over terminology in many books on C. This
|
|||
|
manual, however, is careful to use the terms "file" and "stream" only
|
|||
|
in the technical sense.
|
|||
|
|
|||
|
The `FILE' type is declared in the header file `stdio.h'.
|
|||
|
|
|||
|
-- Data Type: FILE
|
|||
|
This is the data type used to represent stream objects. A `FILE'
|
|||
|
object holds all of the internal state information about the
|
|||
|
connection to the associated file, including such things as the
|
|||
|
file position indicator and buffering information. Each stream
|
|||
|
also has error and end-of-file status indicators that can be
|
|||
|
tested with the `ferror' and `feof' functions; see *note EOF and
|
|||
|
Errors::.
|
|||
|
|
|||
|
`FILE' objects are allocated and managed internally by the
|
|||
|
input/output library functions. Don't try to create your own objects of
|
|||
|
type `FILE'; let the library do it. Your programs should deal only
|
|||
|
with pointers to these objects (that is, `FILE *' values) rather than
|
|||
|
the objects themselves.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Standard Streams, Next: Opening Streams, Prev: Streams, Up: I/O on Streams
|
|||
|
|
|||
|
12.2 Standard Streams
|
|||
|
=====================
|
|||
|
|
|||
|
When the `main' function of your program is invoked, it already has
|
|||
|
three predefined streams open and available for use. These represent
|
|||
|
the "standard" input and output channels that have been established for
|
|||
|
the process.
|
|||
|
|
|||
|
These streams are declared in the header file `stdio.h'.
|
|||
|
|
|||
|
-- Variable: FILE * stdin
|
|||
|
The "standard input" stream, which is the normal source of input
|
|||
|
for the program.
|
|||
|
|
|||
|
-- Variable: FILE * stdout
|
|||
|
The "standard output" stream, which is used for normal output from
|
|||
|
the program.
|
|||
|
|
|||
|
-- Variable: FILE * stderr
|
|||
|
The "standard error" stream, which is used for error messages and
|
|||
|
diagnostics issued by the program.
|
|||
|
|
|||
|
On GNU systems, you can specify what files or processes correspond to
|
|||
|
these streams using the pipe and redirection facilities provided by the
|
|||
|
shell. (The primitives shells use to implement these facilities are
|
|||
|
described in *note File System Interface::.) Most other operating
|
|||
|
systems provide similar mechanisms, but the details of how to use them
|
|||
|
can vary.
|
|||
|
|
|||
|
In the GNU C Library, `stdin', `stdout', and `stderr' are normal
|
|||
|
variables which you can set just like any others. For example, to
|
|||
|
redirect the standard output to a file, you could do:
|
|||
|
|
|||
|
fclose (stdout);
|
|||
|
stdout = fopen ("standard-output-file", "w");
|
|||
|
|
|||
|
Note however, that in other systems `stdin', `stdout', and `stderr'
|
|||
|
are macros that you cannot assign to in the normal way. But you can
|
|||
|
use `freopen' to get the effect of closing one and reopening it. *Note
|
|||
|
Opening Streams::.
|
|||
|
|
|||
|
The three streams `stdin', `stdout', and `stderr' are not unoriented
|
|||
|
at program start (*note Streams and I18N::).
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Opening Streams, Next: Closing Streams, Prev: Standard Streams, Up: I/O on Streams
|
|||
|
|
|||
|
12.3 Opening Streams
|
|||
|
====================
|
|||
|
|
|||
|
Opening a file with the `fopen' function creates a new stream and
|
|||
|
establishes a connection between the stream and a file. This may
|
|||
|
involve creating a new file.
|
|||
|
|
|||
|
Everything described in this section is declared in the header file
|
|||
|
`stdio.h'.
|
|||
|
|
|||
|
-- Function: FILE * fopen (const char *FILENAME, const char *OPENTYPE)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem fd
|
|||
|
lock | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fopen' function opens a stream for I/O to the file FILENAME,
|
|||
|
and returns a pointer to the stream.
|
|||
|
|
|||
|
The OPENTYPE argument is a string that controls how the file is
|
|||
|
opened and specifies attributes of the resulting stream. It must
|
|||
|
begin with one of the following sequences of characters:
|
|||
|
|
|||
|
`r'
|
|||
|
Open an existing file for reading only.
|
|||
|
|
|||
|
`w'
|
|||
|
Open the file for writing only. If the file already exists,
|
|||
|
it is truncated to zero length. Otherwise a new file is
|
|||
|
created.
|
|||
|
|
|||
|
`a'
|
|||
|
Open a file for append access; that is, writing at the end of
|
|||
|
file only. If the file already exists, its initial contents
|
|||
|
are unchanged and output to the stream is appended to the end
|
|||
|
of the file. Otherwise, a new, empty file is created.
|
|||
|
|
|||
|
`r+'
|
|||
|
Open an existing file for both reading and writing. The
|
|||
|
initial contents of the file are unchanged and the initial
|
|||
|
file position is at the beginning of the file.
|
|||
|
|
|||
|
`w+'
|
|||
|
Open a file for both reading and writing. If the file
|
|||
|
already exists, it is truncated to zero length. Otherwise, a
|
|||
|
new file is created.
|
|||
|
|
|||
|
`a+'
|
|||
|
Open or create file for both reading and appending. If the
|
|||
|
file exists, its initial contents are unchanged. Otherwise,
|
|||
|
a new file is created. The initial file position for reading
|
|||
|
is at the beginning of the file, but output is always
|
|||
|
appended to the end of the file.
|
|||
|
|
|||
|
As you can see, `+' requests a stream that can do both input and
|
|||
|
output. When using such a stream, you must call `fflush' (*note
|
|||
|
Stream Buffering::) or a file positioning function such as `fseek'
|
|||
|
(*note File Positioning::) when switching from reading to writing
|
|||
|
or vice versa. Otherwise, internal buffers might not be emptied
|
|||
|
properly.
|
|||
|
|
|||
|
Additional characters may appear after these to specify flags for
|
|||
|
the call. Always put the mode (`r', `w+', etc.) first; that is
|
|||
|
the only part you are guaranteed will be understood by all systems.
|
|||
|
|
|||
|
The GNU C Library defines additional characters for use in
|
|||
|
OPENTYPE:
|
|||
|
|
|||
|
`c'
|
|||
|
The file is opened with cancellation in the I/O functions
|
|||
|
disabled.
|
|||
|
|
|||
|
`e'
|
|||
|
The underlying file descriptor will be closed if you use any
|
|||
|
of the `exec...' functions (*note Executing a File::). (This
|
|||
|
is equivalent to having set `FD_CLOEXEC' on that descriptor.
|
|||
|
*Note Descriptor Flags::.)
|
|||
|
|
|||
|
`m'
|
|||
|
The file is opened and accessed using `mmap'. This is only
|
|||
|
supported with files opened for reading.
|
|||
|
|
|||
|
`x'
|
|||
|
Insist on creating a new file--if a file FILENAME already
|
|||
|
exists, `fopen' fails rather than opening it. If you use `x'
|
|||
|
you are guaranteed that you will not clobber an existing
|
|||
|
file. This is equivalent to the `O_EXCL' option to the
|
|||
|
`open' function (*note Opening and Closing Files::).
|
|||
|
|
|||
|
The `x' modifier is part of ISO C11.
|
|||
|
|
|||
|
The character `b' in OPENTYPE has a standard meaning; it requests
|
|||
|
a binary stream rather than a text stream. But this makes no
|
|||
|
difference in POSIX systems (including GNU systems). If both `+'
|
|||
|
and `b' are specified, they can appear in either order. *Note
|
|||
|
Binary Streams::.
|
|||
|
|
|||
|
If the OPENTYPE string contains the sequence `,ccs=STRING' then
|
|||
|
STRING is taken as the name of a coded character set and `fopen'
|
|||
|
will mark the stream as wide-oriented with appropriate conversion
|
|||
|
functions in place to convert from and to the character set
|
|||
|
STRING. Any other stream is opened initially unoriented and the
|
|||
|
orientation is decided with the first file operation. If the
|
|||
|
first operation is a wide character operation, the stream is not
|
|||
|
only marked as wide-oriented, also the conversion functions to
|
|||
|
convert to the coded character set used for the current locale are
|
|||
|
loaded. This will not change anymore from this point on even if
|
|||
|
the locale selected for the `LC_CTYPE' category is changed.
|
|||
|
|
|||
|
Any other characters in OPENTYPE are simply ignored. They may be
|
|||
|
meaningful in other systems.
|
|||
|
|
|||
|
If the open fails, `fopen' returns a null pointer.
|
|||
|
|
|||
|
When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
|
|||
|
32 bit machine this function is in fact `fopen64' since the LFS
|
|||
|
interface replaces transparently the old interface.
|
|||
|
|
|||
|
You can have multiple streams (or file descriptors) pointing to the
|
|||
|
same file open at the same time. If you do only input, this works
|
|||
|
straightforwardly, but you must be careful if any output streams are
|
|||
|
included. *Note Stream/Descriptor Precautions::. This is equally true
|
|||
|
whether the streams are in one program (not usual) or in several
|
|||
|
programs (which can easily happen). It may be advantageous to use the
|
|||
|
file locking facilities to avoid simultaneous access. *Note File
|
|||
|
Locks::.
|
|||
|
|
|||
|
-- Function: FILE * fopen64 (const char *FILENAME, const char
|
|||
|
*OPENTYPE)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem fd
|
|||
|
lock | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function is similar to `fopen' but the stream it returns a
|
|||
|
pointer for is opened using `open64'. Therefore this stream can be
|
|||
|
used even on files larger than 2^31 bytes on 32 bit machines.
|
|||
|
|
|||
|
Please note that the return type is still `FILE *'. There is no
|
|||
|
special `FILE' type for the LFS interface.
|
|||
|
|
|||
|
If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
|
|||
|
bits machine this function is available under the name `fopen' and
|
|||
|
so transparently replaces the old interface.
|
|||
|
|
|||
|
-- Macro: int FOPEN_MAX
|
|||
|
The value of this macro is an integer constant expression that
|
|||
|
represents the minimum number of streams that the implementation
|
|||
|
guarantees can be open simultaneously. You might be able to open
|
|||
|
more than this many streams, but that is not guaranteed. The
|
|||
|
value of this constant is at least eight, which includes the three
|
|||
|
standard streams `stdin', `stdout', and `stderr'. In POSIX.1
|
|||
|
systems this value is determined by the `OPEN_MAX' parameter;
|
|||
|
*note General Limits::. In BSD and GNU, it is controlled by the
|
|||
|
`RLIMIT_NOFILE' resource limit; *note Limits on Resources::.
|
|||
|
|
|||
|
-- Function: FILE * freopen (const char *FILENAME, const char
|
|||
|
*OPENTYPE, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt fd
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function is like a combination of `fclose' and `fopen'. It
|
|||
|
first closes the stream referred to by STREAM, ignoring any errors
|
|||
|
that are detected in the process. (Because errors are ignored,
|
|||
|
you should not use `freopen' on an output stream if you have
|
|||
|
actually done any output using the stream.) Then the file named by
|
|||
|
FILENAME is opened with mode OPENTYPE as for `fopen', and
|
|||
|
associated with the same stream object STREAM.
|
|||
|
|
|||
|
If the operation fails, a null pointer is returned; otherwise,
|
|||
|
`freopen' returns STREAM. On Linux, `freopen' may also fail and
|
|||
|
set `errno' to `EBUSY' when the kernel structure for the old file
|
|||
|
descriptor was not initialized completely before `freopen' was
|
|||
|
called. This can only happen in multi-threaded programs, when two
|
|||
|
threads race to allocate the same file descriptor number. To
|
|||
|
avoid the possibility of this race, do not use `close' to close
|
|||
|
the underlying file descriptor for a `FILE'; either use `freopen'
|
|||
|
while the file is still open, or use `open' and then `dup2' to
|
|||
|
install the new file descriptor.
|
|||
|
|
|||
|
`freopen' has traditionally been used to connect a standard stream
|
|||
|
such as `stdin' with a file of your own choice. This is useful in
|
|||
|
programs in which use of a standard stream for certain purposes is
|
|||
|
hard-coded. In the GNU C Library, you can simply close the
|
|||
|
standard streams and open new ones with `fopen'. But other
|
|||
|
systems lack this ability, so using `freopen' is more portable.
|
|||
|
|
|||
|
When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
|
|||
|
32 bit machine this function is in fact `freopen64' since the LFS
|
|||
|
interface replaces transparently the old interface.
|
|||
|
|
|||
|
-- Function: FILE * freopen64 (const char *FILENAME, const char
|
|||
|
*OPENTYPE, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt fd
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function is similar to `freopen'. The only difference is that
|
|||
|
on 32 bit machine the stream returned is able to read beyond the
|
|||
|
2^31 bytes limits imposed by the normal interface. It should be
|
|||
|
noted that the stream pointed to by STREAM need not be opened
|
|||
|
using `fopen64' or `freopen64' since its mode is not important for
|
|||
|
this function.
|
|||
|
|
|||
|
If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
|
|||
|
bits machine this function is available under the name `freopen'
|
|||
|
and so transparently replaces the old interface.
|
|||
|
|
|||
|
In some situations it is useful to know whether a given stream is
|
|||
|
available for reading or writing. This information is normally not
|
|||
|
available and would have to be remembered separately. Solaris
|
|||
|
introduced a few functions to get this information from the stream
|
|||
|
descriptor and these functions are also available in the GNU C Library.
|
|||
|
|
|||
|
-- Function: int __freadable (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
|||
|
Concepts::.
|
|||
|
|
|||
|
The `__freadable' function determines whether the stream STREAM
|
|||
|
was opened to allow reading. In this case the return value is
|
|||
|
nonzero. For write-only streams the function returns zero.
|
|||
|
|
|||
|
This function is declared in `stdio_ext.h'.
|
|||
|
|
|||
|
-- Function: int __fwritable (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
|||
|
Concepts::.
|
|||
|
|
|||
|
The `__fwritable' function determines whether the stream STREAM
|
|||
|
was opened to allow writing. In this case the return value is
|
|||
|
nonzero. For read-only streams the function returns zero.
|
|||
|
|
|||
|
This function is declared in `stdio_ext.h'.
|
|||
|
|
|||
|
For slightly different kinds of problems there are two more
|
|||
|
functions. They provide even finer-grained information.
|
|||
|
|
|||
|
-- Function: int __freading (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
|||
|
Concepts::.
|
|||
|
|
|||
|
The `__freading' function determines whether the stream STREAM was
|
|||
|
last read from or whether it is opened read-only. In this case
|
|||
|
the return value is nonzero, otherwise it is zero. Determining
|
|||
|
whether a stream opened for reading and writing was last used for
|
|||
|
writing allows to draw conclusions about the content about the
|
|||
|
buffer, among other things.
|
|||
|
|
|||
|
This function is declared in `stdio_ext.h'.
|
|||
|
|
|||
|
-- Function: int __fwriting (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
|
|||
|
Concepts::.
|
|||
|
|
|||
|
The `__fwriting' function determines whether the stream STREAM was
|
|||
|
last written to or whether it is opened write-only. In this case
|
|||
|
the return value is nonzero, otherwise it is zero.
|
|||
|
|
|||
|
This function is declared in `stdio_ext.h'.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Closing Streams, Next: Streams and Threads, Prev: Opening Streams, Up: I/O on Streams
|
|||
|
|
|||
|
12.4 Closing Streams
|
|||
|
====================
|
|||
|
|
|||
|
When a stream is closed with `fclose', the connection between the
|
|||
|
stream and the file is canceled. After you have closed a stream, you
|
|||
|
cannot perform any additional operations on it.
|
|||
|
|
|||
|
-- Function: int fclose (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock mem
|
|||
|
fd | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function causes STREAM to be closed and the connection to the
|
|||
|
corresponding file to be broken. Any buffered output is written
|
|||
|
and any buffered input is discarded. The `fclose' function returns
|
|||
|
a value of `0' if the file was closed successfully, and `EOF' if
|
|||
|
an error was detected.
|
|||
|
|
|||
|
It is important to check for errors when you call `fclose' to close
|
|||
|
an output stream, because real, everyday errors can be detected at
|
|||
|
this time. For example, when `fclose' writes the remaining
|
|||
|
buffered output, it might get an error because the disk is full.
|
|||
|
Even if you know the buffer is empty, errors can still occur when
|
|||
|
closing a file if you are using NFS.
|
|||
|
|
|||
|
The function `fclose' is declared in `stdio.h'.
|
|||
|
|
|||
|
To close all streams currently available the GNU C Library provides
|
|||
|
another function.
|
|||
|
|
|||
|
-- Function: int fcloseall (void)
|
|||
|
Preliminary: | MT-Unsafe race:streams | AS-Unsafe | AC-Safe |
|
|||
|
*Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function causes all open streams of the process to be closed
|
|||
|
and the connections to corresponding files to be broken. All
|
|||
|
buffered data is written and any buffered input is discarded. The
|
|||
|
`fcloseall' function returns a value of `0' if all the files were
|
|||
|
closed successfully, and `EOF' if an error was detected.
|
|||
|
|
|||
|
This function should be used only in special situations, e.g.,
|
|||
|
when an error occurred and the program must be aborted. Normally
|
|||
|
each single stream should be closed separately so that problems
|
|||
|
with individual streams can be identified. It is also problematic
|
|||
|
since the standard streams (*note Standard Streams::) will also be
|
|||
|
closed.
|
|||
|
|
|||
|
The function `fcloseall' is declared in `stdio.h'.
|
|||
|
|
|||
|
If the `main' function to your program returns, or if you call the
|
|||
|
`exit' function (*note Normal Termination::), all open streams are
|
|||
|
automatically closed properly. If your program terminates in any other
|
|||
|
manner, such as by calling the `abort' function (*note Aborting a
|
|||
|
Program::) or from a fatal signal (*note Signal Handling::), open
|
|||
|
streams might not be closed properly. Buffered output might not be
|
|||
|
flushed and files may be incomplete. For more information on buffering
|
|||
|
of streams, see *note Stream Buffering::.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Streams and Threads, Next: Streams and I18N, Prev: Closing Streams, Up: I/O on Streams
|
|||
|
|
|||
|
12.5 Streams and Threads
|
|||
|
========================
|
|||
|
|
|||
|
Streams can be used in multi-threaded applications in the same way they
|
|||
|
are used in single-threaded applications. But the programmer must be
|
|||
|
aware of the possible complications. It is important to know about
|
|||
|
these also if the program one writes never use threads since the design
|
|||
|
and implementation of many stream functions are heavily influenced by
|
|||
|
the requirements added by multi-threaded programming.
|
|||
|
|
|||
|
The POSIX standard requires that by default the stream operations are
|
|||
|
atomic. I.e., issuing two stream operations for the same stream in two
|
|||
|
threads at the same time will cause the operations to be executed as if
|
|||
|
they were issued sequentially. The buffer operations performed while
|
|||
|
reading or writing are protected from other uses of the same stream. To
|
|||
|
do this each stream has an internal lock object which has to be
|
|||
|
(implicitly) acquired before any work can be done.
|
|||
|
|
|||
|
But there are situations where this is not enough and there are also
|
|||
|
situations where this is not wanted. The implicit locking is not enough
|
|||
|
if the program requires more than one stream function call to happen
|
|||
|
atomically. One example would be if an output line a program wants to
|
|||
|
generate is created by several function calls. The functions by
|
|||
|
themselves would ensure only atomicity of their own operation, but not
|
|||
|
atomicity over all the function calls. For this it is necessary to
|
|||
|
perform the stream locking in the application code.
|
|||
|
|
|||
|
-- Function: void flockfile (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Safe | AC-Unsafe lock | *Note POSIX
|
|||
|
Safety Concepts::.
|
|||
|
|
|||
|
The `flockfile' function acquires the internal locking object
|
|||
|
associated with the stream STREAM. This ensures that no other
|
|||
|
thread can explicitly through `flockfile'/`ftrylockfile' or
|
|||
|
implicitly through the call of a stream function lock the stream.
|
|||
|
The thread will block until the lock is acquired. An explicit
|
|||
|
call to `funlockfile' has to be used to release the lock.
|
|||
|
|
|||
|
-- Function: int ftrylockfile (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Safe | AC-Unsafe lock | *Note POSIX
|
|||
|
Safety Concepts::.
|
|||
|
|
|||
|
The `ftrylockfile' function tries to acquire the internal locking
|
|||
|
object associated with the stream STREAM just like `flockfile'.
|
|||
|
But unlike `flockfile' this function does not block if the lock is
|
|||
|
not available. `ftrylockfile' returns zero if the lock was
|
|||
|
successfully acquired. Otherwise the stream is locked by another
|
|||
|
thread.
|
|||
|
|
|||
|
-- Function: void funlockfile (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Safe | AC-Unsafe lock | *Note POSIX
|
|||
|
Safety Concepts::.
|
|||
|
|
|||
|
The `funlockfile' function releases the internal locking object of
|
|||
|
the stream STREAM. The stream must have been locked before by a
|
|||
|
call to `flockfile' or a successful call of `ftrylockfile'. The
|
|||
|
implicit locking performed by the stream operations do not count.
|
|||
|
The `funlockfile' function does not return an error status and the
|
|||
|
behavior of a call for a stream which is not locked by the current
|
|||
|
thread is undefined.
|
|||
|
|
|||
|
The following example shows how the functions above can be used to
|
|||
|
generate an output line atomically even in multi-threaded applications
|
|||
|
(yes, the same job could be done with one `fprintf' call but it is
|
|||
|
sometimes not possible):
|
|||
|
|
|||
|
FILE *fp;
|
|||
|
{
|
|||
|
...
|
|||
|
flockfile (fp);
|
|||
|
fputs ("This is test number ", fp);
|
|||
|
fprintf (fp, "%d\n", test);
|
|||
|
funlockfile (fp)
|
|||
|
}
|
|||
|
|
|||
|
Without the explicit locking it would be possible for another thread
|
|||
|
to use the stream FP after the `fputs' call returns and before
|
|||
|
`fprintf' was called with the result that the number does not follow
|
|||
|
the word `number'.
|
|||
|
|
|||
|
From this description it might already be clear that the locking
|
|||
|
objects in streams are no simple mutexes. Since locking the same
|
|||
|
stream twice in the same thread is allowed the locking objects must be
|
|||
|
equivalent to recursive mutexes. These mutexes keep track of the owner
|
|||
|
and the number of times the lock is acquired. The same number of
|
|||
|
`funlockfile' calls by the same threads is necessary to unlock the
|
|||
|
stream completely. For instance:
|
|||
|
|
|||
|
void
|
|||
|
foo (FILE *fp)
|
|||
|
{
|
|||
|
ftrylockfile (fp);
|
|||
|
fputs ("in foo\n", fp);
|
|||
|
/* This is very wrong!!! */
|
|||
|
funlockfile (fp);
|
|||
|
}
|
|||
|
|
|||
|
It is important here that the `funlockfile' function is only called
|
|||
|
if the `ftrylockfile' function succeeded in locking the stream. It is
|
|||
|
therefore always wrong to ignore the result of `ftrylockfile'. And it
|
|||
|
makes no sense since otherwise one would use `flockfile'. The result
|
|||
|
of code like that above is that either `funlockfile' tries to free a
|
|||
|
stream that hasn't been locked by the current thread or it frees the
|
|||
|
stream prematurely. The code should look like this:
|
|||
|
|
|||
|
void
|
|||
|
foo (FILE *fp)
|
|||
|
{
|
|||
|
if (ftrylockfile (fp) == 0)
|
|||
|
{
|
|||
|
fputs ("in foo\n", fp);
|
|||
|
funlockfile (fp);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Now that we covered why it is necessary to have locking it is
|
|||
|
necessary to talk about situations when locking is unwanted and what can
|
|||
|
be done. The locking operations (explicit or implicit) don't come for
|
|||
|
free. Even if a lock is not taken the cost is not zero. The operations
|
|||
|
which have to be performed require memory operations that are safe in
|
|||
|
multi-processor environments. With the many local caches involved in
|
|||
|
such systems this is quite costly. So it is best to avoid the locking
|
|||
|
completely if it is not needed - because the code in question is never
|
|||
|
used in a context where two or more threads may use a stream at a time.
|
|||
|
This can be determined most of the time for application code; for
|
|||
|
library code which can be used in many contexts one should default to be
|
|||
|
conservative and use locking.
|
|||
|
|
|||
|
There are two basic mechanisms to avoid locking. The first is to use
|
|||
|
the `_unlocked' variants of the stream operations. The POSIX standard
|
|||
|
defines quite a few of those and the GNU C Library adds a few more.
|
|||
|
These variants of the functions behave just like the functions with the
|
|||
|
name without the suffix except that they do not lock the stream. Using
|
|||
|
these functions is very desirable since they are potentially much
|
|||
|
faster. This is not only because the locking operation itself is
|
|||
|
avoided. More importantly, functions like `putc' and `getc' are very
|
|||
|
simple and traditionally (before the introduction of threads) were
|
|||
|
implemented as macros which are very fast if the buffer is not empty.
|
|||
|
With the addition of locking requirements these functions are no longer
|
|||
|
implemented as macros since they would expand to too much code. But
|
|||
|
these macros are still available with the same functionality under the
|
|||
|
new names `putc_unlocked' and `getc_unlocked'. This possibly huge
|
|||
|
difference of speed also suggests the use of the `_unlocked' functions
|
|||
|
even if locking is required. The difference is that the locking then
|
|||
|
has to be performed in the program:
|
|||
|
|
|||
|
void
|
|||
|
foo (FILE *fp, char *buf)
|
|||
|
{
|
|||
|
flockfile (fp);
|
|||
|
while (*buf != '/')
|
|||
|
putc_unlocked (*buf++, fp);
|
|||
|
funlockfile (fp);
|
|||
|
}
|
|||
|
|
|||
|
If in this example the `putc' function would be used and the
|
|||
|
explicit locking would be missing the `putc' function would have to
|
|||
|
acquire the lock in every call, potentially many times depending on when
|
|||
|
the loop terminates. Writing it the way illustrated above allows the
|
|||
|
`putc_unlocked' macro to be used which means no locking and direct
|
|||
|
manipulation of the buffer of the stream.
|
|||
|
|
|||
|
A second way to avoid locking is by using a non-standard function
|
|||
|
which was introduced in Solaris and is available in the GNU C Library
|
|||
|
as well.
|
|||
|
|
|||
|
-- Function: int __fsetlocking (FILE *STREAM, int TYPE)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe lock | AC-Safe |
|
|||
|
*Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `__fsetlocking' function can be used to select whether the
|
|||
|
stream operations will implicitly acquire the locking object of the
|
|||
|
stream STREAM. By default this is done but it can be disabled and
|
|||
|
reinstated using this function. There are three values defined
|
|||
|
for the TYPE parameter.
|
|||
|
|
|||
|
`FSETLOCKING_INTERNAL'
|
|||
|
The stream `stream' will from now on use the default internal
|
|||
|
locking. Every stream operation with exception of the
|
|||
|
`_unlocked' variants will implicitly lock the stream.
|
|||
|
|
|||
|
`FSETLOCKING_BYCALLER'
|
|||
|
After the `__fsetlocking' function returns, the user is
|
|||
|
responsible for locking the stream. None of the stream
|
|||
|
operations will implicitly do this anymore until the state is
|
|||
|
set back to `FSETLOCKING_INTERNAL'.
|
|||
|
|
|||
|
`FSETLOCKING_QUERY'
|
|||
|
`__fsetlocking' only queries the current locking state of the
|
|||
|
stream. The return value will be `FSETLOCKING_INTERNAL' or
|
|||
|
`FSETLOCKING_BYCALLER' depending on the state.
|
|||
|
|
|||
|
The return value of `__fsetlocking' is either
|
|||
|
`FSETLOCKING_INTERNAL' or `FSETLOCKING_BYCALLER' depending on the
|
|||
|
state of the stream before the call.
|
|||
|
|
|||
|
This function and the values for the TYPE parameter are declared
|
|||
|
in `stdio_ext.h'.
|
|||
|
|
|||
|
This function is especially useful when program code has to be used
|
|||
|
which is written without knowledge about the `_unlocked' functions (or
|
|||
|
if the programmer was too lazy to use them).
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Streams and I18N, Next: Simple Output, Prev: Streams and Threads, Up: I/O on Streams
|
|||
|
|
|||
|
12.6 Streams in Internationalized Applications
|
|||
|
==============================================
|
|||
|
|
|||
|
ISO C90 introduced the new type `wchar_t' to allow handling larger
|
|||
|
character sets. What was missing was a possibility to output strings
|
|||
|
of `wchar_t' directly. One had to convert them into multibyte strings
|
|||
|
using `mbstowcs' (there was no `mbsrtowcs' yet) and then use the normal
|
|||
|
stream functions. While this is doable it is very cumbersome since
|
|||
|
performing the conversions is not trivial and greatly increases program
|
|||
|
complexity and size.
|
|||
|
|
|||
|
The Unix standard early on (I think in XPG4.2) introduced two
|
|||
|
additional format specifiers for the `printf' and `scanf' families of
|
|||
|
functions. Printing and reading of single wide characters was made
|
|||
|
possible using the `%C' specifier and wide character strings can be
|
|||
|
handled with `%S'. These modifiers behave just like `%c' and `%s' only
|
|||
|
that they expect the corresponding argument to have the wide character
|
|||
|
type and that the wide character and string are transformed into/from
|
|||
|
multibyte strings before being used.
|
|||
|
|
|||
|
This was a beginning but it is still not good enough. Not always is
|
|||
|
it desirable to use `printf' and `scanf'. The other, smaller and
|
|||
|
faster functions cannot handle wide characters. Second, it is not
|
|||
|
possible to have a format string for `printf' and `scanf' consisting of
|
|||
|
wide characters. The result is that format strings would have to be
|
|||
|
generated if they have to contain non-basic characters.
|
|||
|
|
|||
|
In the Amendment 1 to ISO C90 a whole new set of functions was added
|
|||
|
to solve the problem. Most of the stream functions got a counterpart
|
|||
|
which take a wide character or wide character string instead of a
|
|||
|
character or string respectively. The new functions operate on the
|
|||
|
same streams (like `stdout'). This is different from the model of the
|
|||
|
C++ runtime library where separate streams for wide and normal I/O are
|
|||
|
used.
|
|||
|
|
|||
|
Being able to use the same stream for wide and normal operations
|
|||
|
comes with a restriction: a stream can be used either for wide
|
|||
|
operations or for normal operations. Once it is decided there is no
|
|||
|
way back. Only a call to `freopen' or `freopen64' can reset the
|
|||
|
"orientation". The orientation can be decided in three ways:
|
|||
|
|
|||
|
* If any of the normal character functions are used (this includes
|
|||
|
the `fread' and `fwrite' functions) the stream is marked as not
|
|||
|
wide oriented.
|
|||
|
|
|||
|
* If any of the wide character functions are used the stream is
|
|||
|
marked as wide oriented.
|
|||
|
|
|||
|
* The `fwide' function can be used to set the orientation either way.
|
|||
|
|
|||
|
It is important to never mix the use of wide and not wide operations
|
|||
|
on a stream. There are no diagnostics issued. The application behavior
|
|||
|
will simply be strange or the application will simply crash. The
|
|||
|
`fwide' function can help avoid this.
|
|||
|
|
|||
|
-- Function: int fwide (FILE *STREAM, int MODE)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock |
|
|||
|
*Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fwide' function can be used to set and query the state of the
|
|||
|
orientation of the stream STREAM. If the MODE parameter has a
|
|||
|
positive value the streams get wide oriented, for negative values
|
|||
|
narrow oriented. It is not possible to overwrite previous
|
|||
|
orientations with `fwide'. I.e., if the stream STREAM was already
|
|||
|
oriented before the call nothing is done.
|
|||
|
|
|||
|
If MODE is zero the current orientation state is queried and
|
|||
|
nothing is changed.
|
|||
|
|
|||
|
The `fwide' function returns a negative value, zero, or a positive
|
|||
|
value if the stream is narrow, not at all, or wide oriented
|
|||
|
respectively.
|
|||
|
|
|||
|
This function was introduced in Amendment 1 to ISO C90 and is
|
|||
|
declared in `wchar.h'.
|
|||
|
|
|||
|
It is generally a good idea to orient a stream as early as possible.
|
|||
|
This can prevent surprise especially for the standard streams `stdin',
|
|||
|
`stdout', and `stderr'. If some library function in some situations
|
|||
|
uses one of these streams and this use orients the stream in a
|
|||
|
different way the rest of the application expects it one might end up
|
|||
|
with hard to reproduce errors. Remember that no errors are signal if
|
|||
|
the streams are used incorrectly. Leaving a stream unoriented after
|
|||
|
creation is normally only necessary for library functions which create
|
|||
|
streams which can be used in different contexts.
|
|||
|
|
|||
|
When writing code which uses streams and which can be used in
|
|||
|
different contexts it is important to query the orientation of the
|
|||
|
stream before using it (unless the rules of the library interface
|
|||
|
demand a specific orientation). The following little, silly function
|
|||
|
illustrates this.
|
|||
|
|
|||
|
void
|
|||
|
print_f (FILE *fp)
|
|||
|
{
|
|||
|
if (fwide (fp, 0) > 0)
|
|||
|
/* Positive return value means wide orientation. */
|
|||
|
fputwc (L'f', fp);
|
|||
|
else
|
|||
|
fputc ('f', fp);
|
|||
|
}
|
|||
|
|
|||
|
Note that in this case the function `print_f' decides about the
|
|||
|
orientation of the stream if it was unoriented before (will not happen
|
|||
|
if the advice above is followed).
|
|||
|
|
|||
|
The encoding used for the `wchar_t' values is unspecified and the
|
|||
|
user must not make any assumptions about it. For I/O of `wchar_t'
|
|||
|
values this means that it is impossible to write these values directly
|
|||
|
to the stream. This is not what follows from the ISO C locale model
|
|||
|
either. What happens instead is that the bytes read from or written to
|
|||
|
the underlying media are first converted into the internal encoding
|
|||
|
chosen by the implementation for `wchar_t'. The external encoding is
|
|||
|
determined by the `LC_CTYPE' category of the current locale or by the
|
|||
|
`ccs' part of the mode specification given to `fopen', `fopen64',
|
|||
|
`freopen', or `freopen64'. How and when the conversion happens is
|
|||
|
unspecified and it happens invisibly to the user.
|
|||
|
|
|||
|
Since a stream is created in the unoriented state it has at that
|
|||
|
point no conversion associated with it. The conversion which will be
|
|||
|
used is determined by the `LC_CTYPE' category selected at the time the
|
|||
|
stream is oriented. If the locales are changed at the runtime this
|
|||
|
might produce surprising results unless one pays attention. This is
|
|||
|
just another good reason to orient the stream explicitly as soon as
|
|||
|
possible, perhaps with a call to `fwide'.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Simple Output, Next: Character Input, Prev: Streams and I18N, Up: I/O on Streams
|
|||
|
|
|||
|
12.7 Simple Output by Characters or Lines
|
|||
|
=========================================
|
|||
|
|
|||
|
This section describes functions for performing character- and
|
|||
|
line-oriented output.
|
|||
|
|
|||
|
These narrow stream functions are declared in the header file
|
|||
|
`stdio.h' and the wide stream functions in `wchar.h'.
|
|||
|
|
|||
|
-- Function: int fputc (int C, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fputc' function converts the character C to type `unsigned
|
|||
|
char', and writes it to the stream STREAM. `EOF' is returned if a
|
|||
|
write error occurs; otherwise the character C is returned.
|
|||
|
|
|||
|
-- Function: wint_t fputwc (wchar_t WC, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fputwc' function writes the wide character WC to the stream
|
|||
|
STREAM. `WEOF' is returned if a write error occurs; otherwise the
|
|||
|
character WC is returned.
|
|||
|
|
|||
|
-- Function: int fputc_unlocked (int C, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fputc_unlocked' function is equivalent to the `fputc'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
-- Function: wint_t fputwc_unlocked (wchar_t WC, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fputwc_unlocked' function is equivalent to the `fputwc'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
This function is a GNU extension.
|
|||
|
|
|||
|
-- Function: int putc (int C, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This is just like `fputc', except that most systems implement it as
|
|||
|
a macro, making it faster. One consequence is that it may
|
|||
|
evaluate the STREAM argument more than once, which is an exception
|
|||
|
to the general rule for macros. `putc' is usually the best
|
|||
|
function to use for writing a single character.
|
|||
|
|
|||
|
-- Function: wint_t putwc (wchar_t WC, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This is just like `fputwc', except that it can be implement as a
|
|||
|
macro, making it faster. One consequence is that it may evaluate
|
|||
|
the STREAM argument more than once, which is an exception to the
|
|||
|
general rule for macros. `putwc' is usually the best function to
|
|||
|
use for writing a single wide character.
|
|||
|
|
|||
|
-- Function: int putc_unlocked (int C, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `putc_unlocked' function is equivalent to the `putc' function
|
|||
|
except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
-- Function: wint_t putwc_unlocked (wchar_t WC, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `putwc_unlocked' function is equivalent to the `putwc'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
This function is a GNU extension.
|
|||
|
|
|||
|
-- Function: int putchar (int C)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `putchar' function is equivalent to `putc' with `stdout' as
|
|||
|
the value of the STREAM argument.
|
|||
|
|
|||
|
-- Function: wint_t putwchar (wchar_t WC)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `putwchar' function is equivalent to `putwc' with `stdout' as
|
|||
|
the value of the STREAM argument.
|
|||
|
|
|||
|
-- Function: int putchar_unlocked (int C)
|
|||
|
Preliminary: | MT-Unsafe race:stdout | AS-Unsafe corrupt |
|
|||
|
AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `putchar_unlocked' function is equivalent to the `putchar'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
-- Function: wint_t putwchar_unlocked (wchar_t WC)
|
|||
|
Preliminary: | MT-Unsafe race:stdout | AS-Unsafe corrupt |
|
|||
|
AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `putwchar_unlocked' function is equivalent to the `putwchar'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
This function is a GNU extension.
|
|||
|
|
|||
|
-- Function: int fputs (const char *S, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The function `fputs' writes the string S to the stream STREAM.
|
|||
|
The terminating null character is not written. This function does
|
|||
|
_not_ add a newline character, either. It outputs only the
|
|||
|
characters in the string.
|
|||
|
|
|||
|
This function returns `EOF' if a write error occurs, and otherwise
|
|||
|
a non-negative value.
|
|||
|
|
|||
|
For example:
|
|||
|
|
|||
|
fputs ("Are ", stdout);
|
|||
|
fputs ("you ", stdout);
|
|||
|
fputs ("hungry?\n", stdout);
|
|||
|
|
|||
|
outputs the text `Are you hungry?' followed by a newline.
|
|||
|
|
|||
|
-- Function: int fputws (const wchar_t *WS, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The function `fputws' writes the wide character string WS to the
|
|||
|
stream STREAM. The terminating null character is not written.
|
|||
|
This function does _not_ add a newline character, either. It
|
|||
|
outputs only the characters in the string.
|
|||
|
|
|||
|
This function returns `WEOF' if a write error occurs, and otherwise
|
|||
|
a non-negative value.
|
|||
|
|
|||
|
-- Function: int fputs_unlocked (const char *S, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fputs_unlocked' function is equivalent to the `fputs'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
This function is a GNU extension.
|
|||
|
|
|||
|
-- Function: int fputws_unlocked (const wchar_t *WS, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fputws_unlocked' function is equivalent to the `fputws'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
This function is a GNU extension.
|
|||
|
|
|||
|
-- Function: int puts (const char *S)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `puts' function writes the string S to the stream `stdout'
|
|||
|
followed by a newline. The terminating null character of the
|
|||
|
string is not written. (Note that `fputs' does _not_ write a
|
|||
|
newline as this function does.)
|
|||
|
|
|||
|
`puts' is the most convenient function for printing simple
|
|||
|
messages. For example:
|
|||
|
|
|||
|
puts ("This is a message.");
|
|||
|
|
|||
|
outputs the text `This is a message.' followed by a newline.
|
|||
|
|
|||
|
-- Function: int putw (int W, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function writes the word W (that is, an `int') to STREAM. It
|
|||
|
is provided for compatibility with SVID, but we recommend you use
|
|||
|
`fwrite' instead (*note Block Input/Output::).
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Character Input, Next: Line Input, Prev: Simple Output, Up: I/O on Streams
|
|||
|
|
|||
|
12.8 Character Input
|
|||
|
====================
|
|||
|
|
|||
|
This section describes functions for performing character-oriented
|
|||
|
input. These narrow stream functions are declared in the header file
|
|||
|
`stdio.h' and the wide character functions are declared in `wchar.h'.
|
|||
|
|
|||
|
These functions return an `int' or `wint_t' value (for narrow and
|
|||
|
wide stream functions respectively) that is either a character of
|
|||
|
input, or the special value `EOF'/`WEOF' (usually -1). For the narrow
|
|||
|
stream functions it is important to store the result of these functions
|
|||
|
in a variable of type `int' instead of `char', even when you plan to
|
|||
|
use it only as a character. Storing `EOF' in a `char' variable
|
|||
|
truncates its value to the size of a character, so that it is no longer
|
|||
|
distinguishable from the valid character `(char) -1'. So always use an
|
|||
|
`int' for the result of `getc' and friends, and check for `EOF' after
|
|||
|
the call; once you've verified that the result is not `EOF', you can be
|
|||
|
sure that it will fit in a `char' variable without loss of information.
|
|||
|
|
|||
|
-- Function: int fgetc (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function reads the next character as an `unsigned char' from
|
|||
|
the stream STREAM and returns its value, converted to an `int'.
|
|||
|
If an end-of-file condition or read error occurs, `EOF' is
|
|||
|
returned instead.
|
|||
|
|
|||
|
-- Function: wint_t fgetwc (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function reads the next wide character from the stream STREAM
|
|||
|
and returns its value. If an end-of-file condition or read error
|
|||
|
occurs, `WEOF' is returned instead.
|
|||
|
|
|||
|
-- Function: int fgetc_unlocked (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fgetc_unlocked' function is equivalent to the `fgetc'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
-- Function: wint_t fgetwc_unlocked (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fgetwc_unlocked' function is equivalent to the `fgetwc'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
This function is a GNU extension.
|
|||
|
|
|||
|
-- Function: int getc (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This is just like `fgetc', except that it is permissible (and
|
|||
|
typical) for it to be implemented as a macro that evaluates the
|
|||
|
STREAM argument more than once. `getc' is often highly optimized,
|
|||
|
so it is usually the best function to use to read a single
|
|||
|
character.
|
|||
|
|
|||
|
-- Function: wint_t getwc (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This is just like `fgetwc', except that it is permissible for it to
|
|||
|
be implemented as a macro that evaluates the STREAM argument more
|
|||
|
than once. `getwc' can be highly optimized, so it is usually the
|
|||
|
best function to use to read a single wide character.
|
|||
|
|
|||
|
-- Function: int getc_unlocked (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `getc_unlocked' function is equivalent to the `getc' function
|
|||
|
except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
-- Function: wint_t getwc_unlocked (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `getwc_unlocked' function is equivalent to the `getwc'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
This function is a GNU extension.
|
|||
|
|
|||
|
-- Function: int getchar (void)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `getchar' function is equivalent to `getc' with `stdin' as the
|
|||
|
value of the STREAM argument.
|
|||
|
|
|||
|
-- Function: wint_t getwchar (void)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `getwchar' function is equivalent to `getwc' with `stdin' as
|
|||
|
the value of the STREAM argument.
|
|||
|
|
|||
|
-- Function: int getchar_unlocked (void)
|
|||
|
Preliminary: | MT-Unsafe race:stdin | AS-Unsafe corrupt |
|
|||
|
AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `getchar_unlocked' function is equivalent to the `getchar'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
-- Function: wint_t getwchar_unlocked (void)
|
|||
|
Preliminary: | MT-Unsafe race:stdin | AS-Unsafe corrupt |
|
|||
|
AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `getwchar_unlocked' function is equivalent to the `getwchar'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
This function is a GNU extension.
|
|||
|
|
|||
|
Here is an example of a function that does input using `fgetc'. It
|
|||
|
would work just as well using `getc' instead, or using `getchar ()'
|
|||
|
instead of `fgetc (stdin)'. The code would also work the same for the
|
|||
|
wide character stream functions.
|
|||
|
|
|||
|
int
|
|||
|
y_or_n_p (const char *question)
|
|||
|
{
|
|||
|
fputs (question, stdout);
|
|||
|
while (1)
|
|||
|
{
|
|||
|
int c, answer;
|
|||
|
/* Write a space to separate answer from question. */
|
|||
|
fputc (' ', stdout);
|
|||
|
/* Read the first character of the line.
|
|||
|
This should be the answer character, but might not be. */
|
|||
|
c = tolower (fgetc (stdin));
|
|||
|
answer = c;
|
|||
|
/* Discard rest of input line. */
|
|||
|
while (c != '\n' && c != EOF)
|
|||
|
c = fgetc (stdin);
|
|||
|
/* Obey the answer if it was valid. */
|
|||
|
if (answer == 'y')
|
|||
|
return 1;
|
|||
|
if (answer == 'n')
|
|||
|
return 0;
|
|||
|
/* Answer was invalid: ask for valid answer. */
|
|||
|
fputs ("Please answer y or n:", stdout);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
-- Function: int getw (FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function reads a word (that is, an `int') from STREAM. It's
|
|||
|
provided for compatibility with SVID. We recommend you use
|
|||
|
`fread' instead (*note Block Input/Output::). Unlike `getc', any
|
|||
|
`int' value could be a valid result. `getw' returns `EOF' when it
|
|||
|
encounters end-of-file or an error, but there is no way to
|
|||
|
distinguish this from an input word with value -1.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Line Input, Next: Unreading, Prev: Character Input, Up: I/O on Streams
|
|||
|
|
|||
|
12.9 Line-Oriented Input
|
|||
|
========================
|
|||
|
|
|||
|
Since many programs interpret input on the basis of lines, it is
|
|||
|
convenient to have functions to read a line of text from a stream.
|
|||
|
|
|||
|
Standard C has functions to do this, but they aren't very safe: null
|
|||
|
characters and even (for `gets') long lines can confuse them. So the
|
|||
|
GNU C Library provides the nonstandard `getline' function that makes it
|
|||
|
easy to read lines reliably.
|
|||
|
|
|||
|
Another GNU extension, `getdelim', generalizes `getline'. It reads
|
|||
|
a delimited record, defined as everything through the next occurrence
|
|||
|
of a specified delimiter character.
|
|||
|
|
|||
|
All these functions are declared in `stdio.h'.
|
|||
|
|
|||
|
-- Function: ssize_t getline (char **LINEPTR, size_t *N, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe lock
|
|||
|
corrupt mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function reads an entire line from STREAM, storing the text
|
|||
|
(including the newline and a terminating null character) in a
|
|||
|
buffer and storing the buffer address in `*LINEPTR'.
|
|||
|
|
|||
|
Before calling `getline', you should place in `*LINEPTR' the
|
|||
|
address of a buffer `*N' bytes long, allocated with `malloc'. If
|
|||
|
this buffer is long enough to hold the line, `getline' stores the
|
|||
|
line in this buffer. Otherwise, `getline' makes the buffer bigger
|
|||
|
using `realloc', storing the new buffer address back in `*LINEPTR'
|
|||
|
and the increased size back in `*N'. *Note Unconstrained
|
|||
|
Allocation::.
|
|||
|
|
|||
|
If you set `*LINEPTR' to a null pointer, and `*N' to zero, before
|
|||
|
the call, then `getline' allocates the initial buffer for you by
|
|||
|
calling `malloc'. This buffer remains allocated even if `getline'
|
|||
|
encounters errors and is unable to read any bytes.
|
|||
|
|
|||
|
In either case, when `getline' returns, `*LINEPTR' is a `char *'
|
|||
|
which points to the text of the line.
|
|||
|
|
|||
|
When `getline' is successful, it returns the number of characters
|
|||
|
read (including the newline, but not including the terminating
|
|||
|
null). This value enables you to distinguish null characters that
|
|||
|
are part of the line from the null character inserted as a
|
|||
|
terminator.
|
|||
|
|
|||
|
This function is a GNU extension, but it is the recommended way to
|
|||
|
read lines from a stream. The alternative standard functions are
|
|||
|
unreliable.
|
|||
|
|
|||
|
If an error occurs or end of file is reached without any bytes
|
|||
|
read, `getline' returns `-1'.
|
|||
|
|
|||
|
-- Function: ssize_t getdelim (char **LINEPTR, size_t *N, int
|
|||
|
DELIMITER, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe lock
|
|||
|
corrupt mem | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function is like `getline' except that the character which
|
|||
|
tells it to stop reading is not necessarily newline. The argument
|
|||
|
DELIMITER specifies the delimiter character; `getdelim' keeps
|
|||
|
reading until it sees that character (or end of file).
|
|||
|
|
|||
|
The text is stored in LINEPTR, including the delimiter character
|
|||
|
and a terminating null. Like `getline', `getdelim' makes LINEPTR
|
|||
|
bigger if it isn't big enough.
|
|||
|
|
|||
|
`getline' is in fact implemented in terms of `getdelim', just like
|
|||
|
this:
|
|||
|
|
|||
|
ssize_t
|
|||
|
getline (char **lineptr, size_t *n, FILE *stream)
|
|||
|
{
|
|||
|
return getdelim (lineptr, n, '\n', stream);
|
|||
|
}
|
|||
|
|
|||
|
-- Function: char * fgets (char *S, int COUNT, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fgets' function reads characters from the stream STREAM up to
|
|||
|
and including a newline character and stores them in the string S,
|
|||
|
adding a null character to mark the end of the string. You must
|
|||
|
supply COUNT characters worth of space in S, but the number of
|
|||
|
characters read is at most COUNT - 1. The extra character space
|
|||
|
is used to hold the null character at the end of the string.
|
|||
|
|
|||
|
If the system is already at end of file when you call `fgets', then
|
|||
|
the contents of the array S are unchanged and a null pointer is
|
|||
|
returned. A null pointer is also returned if a read error occurs.
|
|||
|
Otherwise, the return value is the pointer S.
|
|||
|
|
|||
|
*Warning:* If the input data has a null character, you can't tell.
|
|||
|
So don't use `fgets' unless you know the data cannot contain a
|
|||
|
null. Don't use it to read files edited by the user because, if
|
|||
|
the user inserts a null character, you should either handle it
|
|||
|
properly or print a clear error message. We recommend using
|
|||
|
`getline' instead of `fgets'.
|
|||
|
|
|||
|
-- Function: wchar_t * fgetws (wchar_t *WS, int COUNT, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fgetws' function reads wide characters from the stream STREAM
|
|||
|
up to and including a newline character and stores them in the
|
|||
|
string WS, adding a null wide character to mark the end of the
|
|||
|
string. You must supply COUNT wide characters worth of space in
|
|||
|
WS, but the number of characters read is at most COUNT - 1. The
|
|||
|
extra character space is used to hold the null wide character at
|
|||
|
the end of the string.
|
|||
|
|
|||
|
If the system is already at end of file when you call `fgetws',
|
|||
|
then the contents of the array WS are unchanged and a null pointer
|
|||
|
is returned. A null pointer is also returned if a read error
|
|||
|
occurs. Otherwise, the return value is the pointer WS.
|
|||
|
|
|||
|
*Warning:* If the input data has a null wide character (which are
|
|||
|
null bytes in the input stream), you can't tell. So don't use
|
|||
|
`fgetws' unless you know the data cannot contain a null. Don't use
|
|||
|
it to read files edited by the user because, if the user inserts a
|
|||
|
null character, you should either handle it properly or print a
|
|||
|
clear error message.
|
|||
|
|
|||
|
-- Function: char * fgets_unlocked (char *S, int COUNT, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fgets_unlocked' function is equivalent to the `fgets'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
This function is a GNU extension.
|
|||
|
|
|||
|
-- Function: wchar_t * fgetws_unlocked (wchar_t *WS, int COUNT, FILE
|
|||
|
*STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fgetws_unlocked' function is equivalent to the `fgetws'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
This function is a GNU extension.
|
|||
|
|
|||
|
-- Deprecated function: char * gets (char *S)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The function `gets' reads characters from the stream `stdin' up to
|
|||
|
the next newline character, and stores them in the string S. The
|
|||
|
newline character is discarded (note that this differs from the
|
|||
|
behavior of `fgets', which copies the newline character into the
|
|||
|
string). If `gets' encounters a read error or end-of-file, it
|
|||
|
returns a null pointer; otherwise it returns S.
|
|||
|
|
|||
|
*Warning:* The `gets' function is *very dangerous* because it
|
|||
|
provides no protection against overflowing the string S. The GNU
|
|||
|
C Library includes it for compatibility only. You should *always*
|
|||
|
use `fgets' or `getline' instead. To remind you of this, the
|
|||
|
linker (if using GNU `ld') will issue a warning whenever you use
|
|||
|
`gets'.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Unreading, Next: Block Input/Output, Prev: Line Input, Up: I/O on Streams
|
|||
|
|
|||
|
12.10 Unreading
|
|||
|
===============
|
|||
|
|
|||
|
In parser programs it is often useful to examine the next character in
|
|||
|
the input stream without removing it from the stream. This is called
|
|||
|
"peeking ahead" at the input because your program gets a glimpse of the
|
|||
|
input it will read next.
|
|||
|
|
|||
|
Using stream I/O, you can peek ahead at input by first reading it and
|
|||
|
then "unreading" it (also called "pushing it back" on the stream).
|
|||
|
Unreading a character makes it available to be input again from the
|
|||
|
stream, by the next call to `fgetc' or other input function on that
|
|||
|
stream.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Unreading Idea:: An explanation of unreading with pictures.
|
|||
|
* How Unread:: How to call `ungetc' to do unreading.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Unreading Idea, Next: How Unread, Up: Unreading
|
|||
|
|
|||
|
12.10.1 What Unreading Means
|
|||
|
----------------------------
|
|||
|
|
|||
|
Here is a pictorial explanation of unreading. Suppose you have a
|
|||
|
stream reading a file that contains just six characters, the letters
|
|||
|
`foobar'. Suppose you have read three characters so far. The
|
|||
|
situation looks like this:
|
|||
|
|
|||
|
f o o b a r
|
|||
|
^
|
|||
|
|
|||
|
so the next input character will be `b'.
|
|||
|
|
|||
|
If instead of reading `b' you unread the letter `o', you get a
|
|||
|
situation like this:
|
|||
|
|
|||
|
f o o b a r
|
|||
|
|
|
|||
|
o--
|
|||
|
^
|
|||
|
|
|||
|
so that the next input characters will be `o' and `b'.
|
|||
|
|
|||
|
If you unread `9' instead of `o', you get this situation:
|
|||
|
|
|||
|
f o o b a r
|
|||
|
|
|
|||
|
9--
|
|||
|
^
|
|||
|
|
|||
|
so that the next input characters will be `9' and `b'.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: How Unread, Prev: Unreading Idea, Up: Unreading
|
|||
|
|
|||
|
12.10.2 Using `ungetc' To Do Unreading
|
|||
|
--------------------------------------
|
|||
|
|
|||
|
The function to unread a character is called `ungetc', because it
|
|||
|
reverses the action of `getc'.
|
|||
|
|
|||
|
-- Function: int ungetc (int C, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `ungetc' function pushes back the character C onto the input
|
|||
|
stream STREAM. So the next input from STREAM will read C before
|
|||
|
anything else.
|
|||
|
|
|||
|
If C is `EOF', `ungetc' does nothing and just returns `EOF'. This
|
|||
|
lets you call `ungetc' with the return value of `getc' without
|
|||
|
needing to check for an error from `getc'.
|
|||
|
|
|||
|
The character that you push back doesn't have to be the same as
|
|||
|
the last character that was actually read from the stream. In
|
|||
|
fact, it isn't necessary to actually read any characters from the
|
|||
|
stream before unreading them with `ungetc'! But that is a strange
|
|||
|
way to write a program; usually `ungetc' is used only to unread a
|
|||
|
character that was just read from the same stream. The GNU C
|
|||
|
Library supports this even on files opened in binary mode, but
|
|||
|
other systems might not.
|
|||
|
|
|||
|
The GNU C Library only supports one character of pushback--in other
|
|||
|
words, it does not work to call `ungetc' twice without doing input
|
|||
|
in between. Other systems might let you push back multiple
|
|||
|
characters; then reading from the stream retrieves the characters
|
|||
|
in the reverse order that they were pushed.
|
|||
|
|
|||
|
Pushing back characters doesn't alter the file; only the internal
|
|||
|
buffering for the stream is affected. If a file positioning
|
|||
|
function (such as `fseek', `fseeko' or `rewind'; *note File
|
|||
|
Positioning::) is called, any pending pushed-back characters are
|
|||
|
discarded.
|
|||
|
|
|||
|
Unreading a character on a stream that is at end of file clears the
|
|||
|
end-of-file indicator for the stream, because it makes the
|
|||
|
character of input available. After you read that character,
|
|||
|
trying to read again will encounter end of file.
|
|||
|
|
|||
|
-- Function: wint_t ungetwc (wint_t WC, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `ungetwc' function behaves just like `ungetc' just that it
|
|||
|
pushes back a wide character.
|
|||
|
|
|||
|
Here is an example showing the use of `getc' and `ungetc' to skip
|
|||
|
over whitespace characters. When this function reaches a
|
|||
|
non-whitespace character, it unreads that character to be seen again on
|
|||
|
the next read operation on the stream.
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <ctype.h>
|
|||
|
|
|||
|
void
|
|||
|
skip_whitespace (FILE *stream)
|
|||
|
{
|
|||
|
int c;
|
|||
|
do
|
|||
|
/* No need to check for `EOF' because it is not
|
|||
|
`isspace', and `ungetc' ignores `EOF'. */
|
|||
|
c = getc (stream);
|
|||
|
while (isspace (c));
|
|||
|
ungetc (c, stream);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Block Input/Output, Next: Formatted Output, Prev: Unreading, Up: I/O on Streams
|
|||
|
|
|||
|
12.11 Block Input/Output
|
|||
|
========================
|
|||
|
|
|||
|
This section describes how to do input and output operations on blocks
|
|||
|
of data. You can use these functions to read and write binary data, as
|
|||
|
well as to read and write text in fixed-size blocks instead of by
|
|||
|
characters or lines.
|
|||
|
|
|||
|
Binary files are typically used to read and write blocks of data in
|
|||
|
the same format as is used to represent the data in a running program.
|
|||
|
In other words, arbitrary blocks of memory--not just character or string
|
|||
|
objects--can be written to a binary file, and meaningfully read in
|
|||
|
again by the same program.
|
|||
|
|
|||
|
Storing data in binary form is often considerably more efficient than
|
|||
|
using the formatted I/O functions. Also, for floating-point numbers,
|
|||
|
the binary form avoids possible loss of precision in the conversion
|
|||
|
process. On the other hand, binary files can't be examined or modified
|
|||
|
easily using many standard file utilities (such as text editors), and
|
|||
|
are not portable between different implementations of the language, or
|
|||
|
different kinds of computers.
|
|||
|
|
|||
|
These functions are declared in `stdio.h'.
|
|||
|
|
|||
|
-- Function: size_t fread (void *DATA, size_t SIZE, size_t COUNT, FILE
|
|||
|
*STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function reads up to COUNT objects of size SIZE into the
|
|||
|
array DATA, from the stream STREAM. It returns the number of
|
|||
|
objects actually read, which might be less than COUNT if a read
|
|||
|
error occurs or the end of the file is reached. This function
|
|||
|
returns a value of zero (and doesn't read anything) if either SIZE
|
|||
|
or COUNT is zero.
|
|||
|
|
|||
|
If `fread' encounters end of file in the middle of an object, it
|
|||
|
returns the number of complete objects read, and discards the
|
|||
|
partial object. Therefore, the stream remains at the actual end
|
|||
|
of the file.
|
|||
|
|
|||
|
-- Function: size_t fread_unlocked (void *DATA, size_t SIZE, size_t
|
|||
|
COUNT, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fread_unlocked' function is equivalent to the `fread'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
This function is a GNU extension.
|
|||
|
|
|||
|
-- Function: size_t fwrite (const void *DATA, size_t SIZE, size_t
|
|||
|
COUNT, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
|
|||
|
| *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
This function writes up to COUNT objects of size SIZE from the
|
|||
|
array DATA, to the stream STREAM. The return value is normally
|
|||
|
COUNT, if the call succeeds. Any other value indicates some sort
|
|||
|
of error, such as running out of space.
|
|||
|
|
|||
|
-- Function: size_t fwrite_unlocked (const void *DATA, size_t SIZE,
|
|||
|
size_t COUNT, FILE *STREAM)
|
|||
|
Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
|
|||
|
corrupt | *Note POSIX Safety Concepts::.
|
|||
|
|
|||
|
The `fwrite_unlocked' function is equivalent to the `fwrite'
|
|||
|
function except that it does not implicitly lock the stream.
|
|||
|
|
|||
|
This function is a GNU extension.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Formatted Output, Next: Customizing Printf, Prev: Block Input/Output, Up: I/O on Streams
|
|||
|
|
|||
|
12.12 Formatted Output
|
|||
|
======================
|
|||
|
|
|||
|
The functions described in this section (`printf' and related
|
|||
|
functions) provide a convenient way to perform formatted output. You
|
|||
|
call `printf' with a "format string" or "template string" that
|
|||
|
specifies how to format the values of the remaining arguments.
|
|||
|
|
|||
|
Unless your program is a filter that specifically performs line- or
|
|||
|
character-oriented processing, using `printf' or one of the other
|
|||
|
related functions described in this section is usually the easiest and
|
|||
|
most concise way to perform output. These functions are especially
|
|||
|
useful for printing error messages, tables of data, and the like.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Formatted Output Basics:: Some examples to get you started.
|
|||
|
* Output Conversion Syntax:: General syntax of conversion
|
|||
|
specifications.
|
|||
|
* Table of Output Conversions:: Summary of output conversions and
|
|||
|
what they do.
|
|||
|
* Integer Conversions:: Details about formatting of integers.
|
|||
|
* Floating-Point Conversions:: Details about formatting of
|
|||
|
floating-point numbers.
|
|||
|
* Other Output Conversions:: Details about formatting of strings,
|
|||
|
characters, pointers, and the like.
|
|||
|
* Formatted Output Functions:: Descriptions of the actual functions.
|
|||
|
* Dynamic Output:: Functions that allocate memory for the output.
|
|||
|
* Variable Arguments Output:: `vprintf' and friends.
|
|||
|
* Parsing a Template String:: What kinds of args does a given template
|
|||
|
call for?
|
|||
|
* Example of Parsing:: Sample program using `parse_printf_format'.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Formatted Output Basics, Next: Output Conversion Syntax, Up: Formatted Output
|
|||
|
|
|||
|
12.12.1 Formatted Output Basics
|
|||
|
-------------------------------
|
|||
|
|
|||
|
The `printf' function can be used to print any number of arguments.
|
|||
|
The template string argument you supply in a call provides information
|
|||
|
not only about the number of additional arguments, but also about their
|
|||
|
types and what style should be used for printing them.
|
|||
|
|
|||
|
Ordinary characters in the template string are simply written to the
|
|||
|
output stream as-is, while "conversion specifications" introduced by a
|
|||
|
`%' character in the template cause subsequent arguments to be
|
|||
|
formatted and written to the output stream. For example,
|
|||
|
|
|||
|
int pct = 37;
|
|||
|
char filename[] = "foo.txt";
|
|||
|
printf ("Processing of `%s' is %d%% finished.\nPlease be patient.\n",
|
|||
|
filename, pct);
|
|||
|
|
|||
|
produces output like
|
|||
|
|
|||
|
Processing of `foo.txt' is 37% finished.
|
|||
|
Please be patient.
|
|||
|
|
|||
|
This example shows the use of the `%d' conversion to specify that an
|
|||
|
`int' argument should be printed in decimal notation, the `%s'
|
|||
|
conversion to specify printing of a string argument, and the `%%'
|
|||
|
conversion to print a literal `%' character.
|
|||
|
|
|||
|
There are also conversions for printing an integer argument as an
|
|||
|
unsigned value in octal, decimal, or hexadecimal radix (`%o', `%u', or
|
|||
|
`%x', respectively); or as a character value (`%c').
|
|||
|
|
|||
|
Floating-point numbers can be printed in normal, fixed-point notation
|
|||
|
using the `%f' conversion or in exponential notation using the `%e'
|
|||
|
conversion. The `%g' conversion uses either `%e' or `%f' format,
|
|||
|
depending on what is more appropriate for the magnitude of the
|
|||
|
particular number.
|
|||
|
|
|||
|
You can control formatting more precisely by writing "modifiers"
|
|||
|
between the `%' and the character that indicates which conversion to
|
|||
|
apply. These slightly alter the ordinary behavior of the conversion.
|
|||
|
For example, most conversion specifications permit you to specify a
|
|||
|
minimum field width and a flag indicating whether you want the result
|
|||
|
left- or right-justified within the field.
|
|||
|
|
|||
|
The specific flags and modifiers that are permitted and their
|
|||
|
interpretation vary depending on the particular conversion. They're all
|
|||
|
described in more detail in the following sections. Don't worry if this
|
|||
|
all seems excessively complicated at first; you can almost always get
|
|||
|
reasonable free-format output without using any of the modifiers at all.
|
|||
|
The modifiers are mostly used to make the output look "prettier" in
|
|||
|
tables.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Output Conversion Syntax, Next: Table of Output Conversions, Prev: Formatted Output Basics, Up: Formatted Output
|
|||
|
|
|||
|
12.12.2 Output Conversion Syntax
|
|||
|
--------------------------------
|
|||
|
|
|||
|
This section provides details about the precise syntax of conversion
|
|||
|
specifications that can appear in a `printf' template string.
|
|||
|
|
|||
|
Characters in the template string that are not part of a conversion
|
|||
|
specification are printed as-is to the output stream. Multibyte
|
|||
|
character sequences (*note Character Set Handling::) are permitted in a
|
|||
|
template string.
|
|||
|
|
|||
|
The conversion specifications in a `printf' template string have the
|
|||
|
general form:
|
|||
|
|
|||
|
% [ PARAM-NO $] FLAGS WIDTH [ . PRECISION ] TYPE CONVERSION
|
|||
|
|
|||
|
or
|
|||
|
|
|||
|
% [ PARAM-NO $] FLAGS WIDTH . * [ PARAM-NO $] TYPE CONVERSION
|
|||
|
|
|||
|
For example, in the conversion specifier `%-10.8ld', the `-' is a
|
|||
|
flag, `10' specifies the field width, the precision is `8', the letter
|
|||
|
`l' is a type modifier, and `d' specifies the conversion style. (This
|
|||
|
particular type specifier says to print a `long int' argument in
|
|||
|
decimal notation, with a minimum of 8 digits left-justified in a field
|
|||
|
at least 10 characters wide.)
|
|||
|
|
|||
|
In more detail, output conversion specifications consist of an
|
|||
|
initial `%' character followed in sequence by:
|
|||
|
|
|||
|
* An optional specification of the parameter used for this format.
|
|||
|
Normally the parameters to the `printf' function are assigned to
|
|||
|
the formats in the order of appearance in the format string. But
|
|||
|
in some situations (such as message translation) this is not
|
|||
|
desirable and this extension allows an explicit parameter to be
|
|||
|
specified.
|
|||
|
|
|||
|
The PARAM-NO parts of the format must be integers in the range of
|
|||
|
1 to the maximum number of arguments present to the function call.
|
|||
|
Some implementations limit this number to a certain upper bound.
|
|||
|
The exact limit can be retrieved by the following constant.
|
|||
|
|
|||
|
-- Macro: NL_ARGMAX
|
|||
|
The value of `NL_ARGMAX' is the maximum value allowed for the
|
|||
|
specification of a positional parameter in a `printf' call.
|
|||
|
The actual value in effect at runtime can be retrieved by
|
|||
|
using `sysconf' using the `_SC_NL_ARGMAX' parameter *note
|
|||
|
Sysconf Definition::.
|
|||
|
|
|||
|
Some systems have a quite low limit such as 9 for System V
|
|||
|
systems. The GNU C Library has no real limit.
|
|||
|
|
|||
|
If any of the formats has a specification for the parameter
|
|||
|
position all of them in the format string shall have one.
|
|||
|
Otherwise the behavior is undefined.
|
|||
|
|
|||
|
* Zero or more "flag characters" that modify the normal behavior of
|
|||
|
the conversion specification.
|
|||
|
|
|||
|
* An optional decimal integer specifying the "minimum field width".
|
|||
|
If the normal conversion produces fewer characters than this, the
|
|||
|
field is padded with spaces to the specified width. This is a
|
|||
|
_minimum_ value; if the normal conversion produces more characters
|
|||
|
than this, the field is _not_ truncated. Normally, the output is
|
|||
|
right-justified within the field.
|
|||
|
|
|||
|
You can also specify a field width of `*'. This means that the
|
|||
|
next argument in the argument list (before the actual value to be
|
|||
|
printed) is used as the field width. The value must be an `int'.
|
|||
|
If the value is negative, this means to set the `-' flag (see
|
|||
|
below) and to use the absolute value as the field width.
|
|||
|
|
|||
|
* An optional "precision" to specify the number of digits to be
|
|||
|
written for the numeric conversions. If the precision is
|
|||
|
specified, it consists of a period (`.') followed optionally by a
|
|||
|
decimal integer (which defaults to zero if omitted).
|
|||
|
|
|||
|
You can also specify a precision of `*'. This means that the next
|
|||
|
argument in the argument list (before the actual value to be
|
|||
|
printed) is used as the precision. The value must be an `int',
|
|||
|
and is ignored if it is negative. If you specify `*' for both the
|
|||
|
field width and precision, the field width argument precedes the
|
|||
|
precision argument. Other C library versions may not recognize
|
|||
|
this syntax.
|
|||
|
|
|||
|
* An optional "type modifier character", which is used to specify the
|
|||
|
data type of the corresponding argument if it differs from the
|
|||
|
default type. (For example, the integer conversions assume a type
|
|||
|
of `int', but you can specify `h', `l', or `L' for other integer
|
|||
|
types.)
|
|||
|
|
|||
|
* A character that specifies the conversion to be applied.
|
|||
|
|
|||
|
The exact options that are permitted and how they are interpreted
|
|||
|
vary between the different conversion specifiers. See the descriptions
|
|||
|
of the individual conversions for information about the particular
|
|||
|
options that they use.
|
|||
|
|
|||
|
With the `-Wformat' option, the GNU C compiler checks calls to
|
|||
|
`printf' and related functions. It examines the format string and
|
|||
|
verifies that the correct number and types of arguments are supplied.
|
|||
|
There is also a GNU C syntax to tell the compiler that a function you
|
|||
|
write uses a `printf'-style format string. *Note Declaring Attributes
|
|||
|
of Functions: (gcc)Function Attributes, for more information.
|
|||
|
|
|||
|
|
|||
|
File: libc.info, Node: Table of Output Conversions, Next: Integer Conversions, Prev: Output Conversion Syntax, Up: Formatted Output
|
|||
|
|
|||
|
12.12.3 Table of Output Conversions
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
Here is a table summarizing what all the different conversions do:
|
|||
|
|
|||
|
`%d', `%i'
|
|||
|
Print an integer as a signed decimal number. *Note Integer
|
|||
|
Conversions::, for details. `%d' and `%i' are synonymous for
|
|||
|
output, but are different when used with `scanf' for input (*note
|
|||
|
Table of Input Conversions::).
|
|||
|
|
|||
|
`%o'
|
|||
|
Print an integer as an unsigned octal number. *Note Integer
|
|||
|
Conversions::, for details.
|
|||
|
|
|||
|
`%u'
|
|||
|
Print an integer as an unsigned decimal number. *Note Integer
|
|||
|
Conversions::, for details.
|
|||
|
|
|||
|
`%x', `%X'
|
|||
|
Print an integer as an unsigned hexadecimal number. `%x' uses
|
|||
|
lower-case letters and `%X' uses upper-case. *Note Integer
|
|||
|
Conversions::, for details.
|
|||
|
|
|||
|
`%f'
|
|||
|
Print a floating-point number in normal (fixed-point) notation.
|
|||
|
*Note Floating-Point Conversions::, for details.
|
|||
|
|
|||
|
`%e', `%E'
|
|||
|
Print a floating-point number in exponential notation. `%e' uses
|
|||
|
lower-case letters and `%E' uses upper-case. *Note Floating-Point
|
|||
|
Conversions::, for details.
|
|||
|
|
|||
|
`%g', `%G'
|
|||
|
Print a floating-point number in either normal or exponential
|
|||
|
notation, whichever is more appropriate for its magnitude. `%g'
|
|||
|
uses lower-case letters and `%G' uses upper-case. *Note
|
|||
|
Floating-Point Conversions::, for details.
|
|||
|
|
|||
|
`%a', `%A'
|
|||
|
Print a floating-point number in a hexadecimal fractional notation
|
|||
|
with the exponent to base 2 represented in decimal digits. `%a'
|
|||
|
uses lower-case letters and `%A' uses upper-case. *Note
|
|||
|
Floating-Point Conversions::, for details.
|
|||
|
|
|||
|
`%c'
|
|||
|
Print a single character. *Note Other Output Conversions::.
|
|||
|
|
|||
|
`%C'
|
|||
|
This is an alias for `%lc' which is supported for compatibility
|
|||
|
with the Unix standard.
|
|||
|
|
|||
|
`%s'
|
|||
|
Print a string. *Note Other Output Conversions::.
|
|||
|
|
|||
|
`%S'
|
|||
|
This is an alias for `%ls' which is supported for compatibility
|
|||
|
with the Unix standard.
|
|||
|
|
|||
|
`%p'
|
|||
|
Print the value of a pointer. *Note Other Output Conversions::.
|
|||
|
|
|||
|
`%n'
|
|||
|
Get the number of characters printed so far. *Note Other Output
|
|||
|
Conversions::. Note that this conversion specification never
|
|||
|
produces any output.
|
|||
|
|
|||
|
`%m'
|
|||
|
Print the string corresponding to the value of `errno'. (This is
|
|||
|
a GNU extension.) *Note Other Output Conversions::.
|
|||
|
|
|||
|
`%%'
|
|||
|
Print a literal `%' character. *Note Other Output Conversions::.
|
|||
|
|
|||
|
If the syntax of a conversion specification is invalid, unpredictable
|
|||
|
things will happen, so don't do this. If there aren't enough function
|
|||
|
arguments provided to supply values for all the conversion
|
|||
|
specifications in the template string, or if the arguments are not of
|
|||
|
the correct types, the results are unpredictable. If you supply more
|
|||
|
arguments than conversion specifications, the extra argument values are
|
|||
|
simply ignored; this is sometimes useful.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Local Variables:
|
|||
|
coding: utf-8
|
|||
|
End:
|