summaryrefslogtreecommitdiffstats
path: root/upstream/archlinux/man1/perlclib.1perl
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/archlinux/man1/perlclib.1perl')
-rw-r--r--upstream/archlinux/man1/perlclib.1perl327
1 files changed, 327 insertions, 0 deletions
diff --git a/upstream/archlinux/man1/perlclib.1perl b/upstream/archlinux/man1/perlclib.1perl
new file mode 100644
index 00000000..148ae4d7
--- /dev/null
+++ b/upstream/archlinux/man1/perlclib.1perl
@@ -0,0 +1,327 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "PERLCLIB 1perl"
+.TH PERLCLIB 1perl 2024-02-11 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+perlclib \- Internal replacements for standard C library functions
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+One thing Perl porters should note is that \fIperl\fR doesn't tend to use that
+much of the C standard library internally; you'll see very little use of,
+for example, the \fIctype.h\fR functions in there. This is because Perl
+tends to reimplement or abstract standard library functions, so that we
+know exactly how they're going to operate.
+.PP
+This is a reference card for people who are familiar with the C library
+and who want to do things the Perl way; to tell them which functions
+they ought to use instead of the more normal C functions.
+.SS Conventions
+.IX Subsection "Conventions"
+In the following tables:
+.ie n .IP """t""" 3
+.el .IP \f(CWt\fR 3
+.IX Item "t"
+is a type.
+.ie n .IP """p""" 3
+.el .IP \f(CWp\fR 3
+.IX Item "p"
+is a pointer.
+.ie n .IP """n""" 3
+.el .IP \f(CWn\fR 3
+.IX Item "n"
+is a number.
+.ie n .IP """s""" 3
+.el .IP \f(CWs\fR 3
+.IX Item "s"
+is a string.
+.PP
+\&\f(CW\*(C`sv\*(C'\fR, \f(CW\*(C`av\*(C'\fR, \f(CW\*(C`hv\*(C'\fR, etc. represent variables of their respective types.
+.SS "File Operations"
+.IX Subsection "File Operations"
+Instead of the \fIstdio.h\fR functions, you should use the Perl abstraction
+layer. Instead of \f(CW\*(C`FILE*\*(C'\fR types, you need to be handling \f(CW\*(C`PerlIO*\*(C'\fR
+types. Don't forget that with the new PerlIO layered I/O abstraction
+\&\f(CW\*(C`FILE*\*(C'\fR types may not even be available. See also the \f(CW\*(C`perlapio\*(C'\fR
+documentation for more information about the following functions:
+.PP
+.Vb 1
+\& Instead Of: Use:
+\&
+\& stdin PerlIO_stdin()
+\& stdout PerlIO_stdout()
+\& stderr PerlIO_stderr()
+\&
+\& fopen(fn, mode) PerlIO_open(fn, mode)
+\& freopen(fn, mode, stream) PerlIO_reopen(fn, mode, perlio) (Dep\-
+\& recated)
+\& fflush(stream) PerlIO_flush(perlio)
+\& fclose(stream) PerlIO_close(perlio)
+.Ve
+.SS "File Input and Output"
+.IX Subsection "File Input and Output"
+.Vb 1
+\& Instead Of: Use:
+\&
+\& fprintf(stream, fmt, ...) PerlIO_printf(perlio, fmt, ...)
+\&
+\& [f]getc(stream) PerlIO_getc(perlio)
+\& [f]putc(stream, n) PerlIO_putc(perlio, n)
+\& ungetc(n, stream) PerlIO_ungetc(perlio, n)
+.Ve
+.PP
+Note that the PerlIO equivalents of \f(CW\*(C`fread\*(C'\fR and \f(CW\*(C`fwrite\*(C'\fR are slightly
+different from their C library counterparts:
+.PP
+.Vb 2
+\& fread(p, size, n, stream) PerlIO_read(perlio, buf, numbytes)
+\& fwrite(p, size, n, stream) PerlIO_write(perlio, buf, numbytes)
+\&
+\& fputs(s, stream) PerlIO_puts(perlio, s)
+.Ve
+.PP
+There is no equivalent to \f(CW\*(C`fgets\*(C'\fR; one should use \f(CW\*(C`sv_gets\*(C'\fR instead:
+.PP
+.Vb 1
+\& fgets(s, n, stream) sv_gets(sv, perlio, append)
+.Ve
+.SS "File Positioning"
+.IX Subsection "File Positioning"
+.Vb 1
+\& Instead Of: Use:
+\&
+\& feof(stream) PerlIO_eof(perlio)
+\& fseek(stream, n, whence) PerlIO_seek(perlio, n, whence)
+\& rewind(stream) PerlIO_rewind(perlio)
+\&
+\& fgetpos(stream, p) PerlIO_getpos(perlio, sv)
+\& fsetpos(stream, p) PerlIO_setpos(perlio, sv)
+\&
+\& ferror(stream) PerlIO_error(perlio)
+\& clearerr(stream) PerlIO_clearerr(perlio)
+.Ve
+.SS "Memory Management and String Handling"
+.IX Subsection "Memory Management and String Handling"
+.Vb 1
+\& Instead Of: Use:
+\&
+\& t* p = malloc(n) Newx(p, n, t)
+\& t* p = calloc(n, s) Newxz(p, n, t)
+\& p = realloc(p, n) Renew(p, n, t)
+\& memcpy(dst, src, n) Copy(src, dst, n, t)
+\& memmove(dst, src, n) Move(src, dst, n, t)
+\& memcpy(dst, src, sizeof(t)) StructCopy(src, dst, t)
+\& memset(dst, 0, n * sizeof(t)) Zero(dst, n, t)
+\& memzero(dst, 0) Zero(dst, n, char)
+\& free(p) Safefree(p)
+\&
+\& strdup(p) savepv(p)
+\& strndup(p, n) savepvn(p, n) (Hey, strndup doesn\*(Aqt
+\& exist!)
+\&
+\& strstr(big, little) instr(big, little)
+\& strcmp(s1, s2) strLE(s1, s2) / strEQ(s1, s2)
+\& / strGT(s1,s2)
+\& strncmp(s1, s2, n) strnNE(s1, s2, n) / strnEQ(s1, s2, n)
+\&
+\& memcmp(p1, p2, n) memNE(p1, p2, n)
+\& !memcmp(p1, p2, n) memEQ(p1, p2, n)
+.Ve
+.PP
+Notice the different order of arguments to \f(CW\*(C`Copy\*(C'\fR and \f(CW\*(C`Move\*(C'\fR than used
+in \f(CW\*(C`memcpy\*(C'\fR and \f(CW\*(C`memmove\*(C'\fR.
+.PP
+Most of the time, though, you'll want to be dealing with SVs internally
+instead of raw \f(CW\*(C`char *\*(C'\fR strings:
+.PP
+.Vb 6
+\& strlen(s) sv_len(sv)
+\& strcpy(dt, src) sv_setpv(sv, s)
+\& strncpy(dt, src, n) sv_setpvn(sv, s, n)
+\& strcat(dt, src) sv_catpv(sv, s)
+\& strncat(dt, src) sv_catpvn(sv, s)
+\& sprintf(s, fmt, ...) sv_setpvf(sv, fmt, ...)
+.Ve
+.PP
+Note also the existence of \f(CW\*(C`sv_catpvf\*(C'\fR and \f(CW\*(C`sv_vcatpvfn\*(C'\fR, combining
+concatenation with formatting.
+.PP
+Sometimes instead of zeroing the allocated heap by using \fBNewxz()\fR you
+should consider "poisoning" the data. This means writing a bit
+pattern into it that should be illegal as pointers (and floating point
+numbers), and also hopefully surprising enough as integers, so that
+any code attempting to use the data without forethought will break
+sooner rather than later. Poisoning can be done using the \fBPoison()\fR
+macros, which have similar arguments to \fBZero()\fR:
+.PP
+.Vb 4
+\& PoisonWith(dst, n, t, b) scribble memory with byte b
+\& PoisonNew(dst, n, t) equal to PoisonWith(dst, n, t, 0xAB)
+\& PoisonFree(dst, n, t) equal to PoisonWith(dst, n, t, 0xEF)
+\& Poison(dst, n, t) equal to PoisonFree(dst, n, t)
+.Ve
+.SS "Character Class Tests"
+.IX Subsection "Character Class Tests"
+There are several types of character class tests that Perl implements.
+The only ones described here are those that directly correspond to C
+library functions that operate on 8\-bit characters, but there are
+equivalents that operate on wide characters, and UTF\-8 encoded strings.
+All are more fully described in "Character classification" in perlapi and
+"Character case changing" in perlapi.
+.PP
+The C library routines listed in the table below return values based on
+the current locale. Use the entries in the final column for that
+functionality. The other two columns always assume a POSIX (or C)
+locale. The entries in the ASCII column are only meaningful for ASCII
+inputs, returning FALSE for anything else. Use these only when you
+\&\fBknow\fR that is what you want. The entries in the Latin1 column assume
+that the non-ASCII 8\-bit characters are as Unicode defines, them, the
+same as ISO\-8859\-1, often called Latin 1.
+.PP
+.Vb 1
+\& Instead Of: Use for ASCII: Use for Latin1: Use for locale:
+\&
+\& isalnum(c) isALPHANUMERIC(c) isALPHANUMERIC_L1(c) isALPHANUMERIC_LC(c)
+\& isalpha(c) isALPHA(c) isALPHA_L1(c) isALPHA_LC(u )
+\& isascii(c) isASCII(c) isASCII_LC(c)
+\& isblank(c) isBLANK(c) isBLANK_L1(c) isBLANK_LC(c)
+\& iscntrl(c) isCNTRL(c) isCNTRL_L1(c) isCNTRL_LC(c)
+\& isdigit(c) isDIGIT(c) isDIGIT_L1(c) isDIGIT_LC(c)
+\& isgraph(c) isGRAPH(c) isGRAPH_L1(c) isGRAPH_LC(c)
+\& islower(c) isLOWER(c) isLOWER_L1(c) isLOWER_LC(c)
+\& isprint(c) isPRINT(c) isPRINT_L1(c) isPRINT_LC(c)
+\& ispunct(c) isPUNCT(c) isPUNCT_L1(c) isPUNCT_LC(c)
+\& isspace(c) isSPACE(c) isSPACE_L1(c) isSPACE_LC(c)
+\& isupper(c) isUPPER(c) isUPPER_L1(c) isUPPER_LC(c)
+\& isxdigit(c) isXDIGIT(c) isXDIGIT_L1(c) isXDIGIT_LC(c)
+\&
+\& tolower(c) toLOWER(c) toLOWER_L1(c)
+\& toupper(c) toUPPER(c)
+.Ve
+.PP
+To emphasize that you are operating only on ASCII characters, you can
+append \f(CW\*(C`_A\*(C'\fR to each of the macros in the ASCII column: \f(CW\*(C`isALPHA_A\*(C'\fR,
+\&\f(CW\*(C`isDIGIT_A\*(C'\fR, and so on.
+.PP
+(There is no entry in the Latin1 column for \f(CW\*(C`isascii\*(C'\fR even though there
+is an \f(CW\*(C`isASCII_L1\*(C'\fR, which is identical to \f(CW\*(C`isASCII\*(C'\fR; the
+latter name is clearer. There is no entry in the Latin1 column for
+\&\f(CW\*(C`toupper\*(C'\fR because the result can be non\-Latin1. You have to use
+\&\f(CW\*(C`toUPPER_uvchr\*(C'\fR, as described in "Character case changing" in perlapi.)
+.SS "\fIstdlib.h\fP functions"
+.IX Subsection "stdlib.h functions"
+.Vb 1
+\& Instead Of: Use:
+\&
+\& atof(s) Atof(s)
+\& atoi(s) grok_atoUV(s, &uv, &e)
+\& atol(s) grok_atoUV(s, &uv, &e)
+\& strtod(s, &p) Strtod(s, &p)
+\& strtol(s, &p, n) Strtol(s, &p, b)
+\& strtoul(s, &p, n) Strtoul(s, &p, b)
+.Ve
+.PP
+Typical use is to do range checks on \f(CW\*(C`uv\*(C'\fR before casting:
+.PP
+.Vb 9
+\& int i; UV uv;
+\& char* end_ptr = input_end;
+\& if (grok_atoUV(input, &uv, &end_ptr)
+\& && uv <= INT_MAX)
+\& i = (int)uv;
+\& ... /* continue parsing from end_ptr */
+\& } else {
+\& ... /* parse error: not a decimal integer in range 0 .. MAX_IV */
+\& }
+.Ve
+.PP
+Notice also the \f(CW\*(C`grok_bin\*(C'\fR, \f(CW\*(C`grok_hex\*(C'\fR, and \f(CW\*(C`grok_oct\*(C'\fR functions in
+\&\fInumeric.c\fR for converting strings representing numbers in the respective
+bases into \f(CW\*(C`NV\*(C'\fRs. Note that \fBgrok_atoUV()\fR doesn't handle negative inputs,
+or leading whitespace (being purposefully strict).
+.PP
+Note that \fBstrtol()\fR and \fBstrtoul()\fR may be disguised as \fBStrtol()\fR, \fBStrtoul()\fR,
+\&\fBAtol()\fR, \fBAtoul()\fR. Avoid those, too.
+.PP
+In theory \f(CW\*(C`Strtol\*(C'\fR and \f(CW\*(C`Strtoul\*(C'\fR may not be defined if the machine perl is
+built on doesn't actually have strtol and strtoul. But as those 2
+functions are part of the 1989 ANSI C spec we suspect you'll find them
+everywhere by now.
+.PP
+.Vb 3
+\& int rand() double Drand01()
+\& srand(n) { seedDrand01((Rand_seed_t)n);
+\& PL_srand_called = TRUE; }
+\&
+\& exit(n) my_exit(n)
+\& system(s) Don\*(Aqt. Look at pp_system or use my_popen.
+\&
+\& getenv(s) PerlEnv_getenv(s)
+\& setenv(s, val) my_setenv(s, val)
+.Ve
+.SS "Miscellaneous functions"
+.IX Subsection "Miscellaneous functions"
+You should not even \fBwant\fR to use \fIsetjmp.h\fR functions, but if you
+think you do, use the \f(CW\*(C`JMPENV\*(C'\fR stack in \fIscope.h\fR instead.
+.PP
+For \f(CW\*(C`signal\*(C'\fR/\f(CW\*(C`sigaction\*(C'\fR, use \f(CW\*(C`rsignal(signo, handler)\*(C'\fR.
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+perlapi, perlapio, perlguts