mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 03:27:39 +00:00
ec480f5aa0
- Every unit test now passes on Apple Silicon. The final piece of this puzzle was porting our POSIX threads cancelation support, since that works differently on ARM64 XNU vs. AMD64. Our semaphore support on Apple Silicon is also superior now compared to AMD64, thanks to the grand central dispatch library which lets *NSYNC locks go faster. - The Cosmopolitan runtime is now more stable, particularly on Windows. To do this, thread local storage is mandatory at all runtime levels, and the innermost packages of the C library is no longer being built using ASAN. TLS is being bootstrapped with a 128-byte TIB during the process startup phase, and then later on the runtime re-allocates it either statically or dynamically to support code using _Thread_local. fork() and execve() now do a better job cooperating with threads. We can now check how much stack memory is left in the process or thread when functions like kprintf() / execve() etc. call alloca(), so that ENOMEM can be raised, reduce a buffer size, or just print a warning. - POSIX signal emulation is now implemented the same way kernels do it with pthread_kill() and raise(). Any thread can interrupt any other thread, regardless of what it's doing. If it's blocked on read/write then the killer thread will cancel its i/o operation so that EINTR can be returned in the mark thread immediately. If it's doing a tight CPU bound operation, then that's also interrupted by the signal delivery. Signal delivery works now by suspending a thread and pushing context data structures onto its stack, and redirecting its execution to a trampoline function, which calls SetThreadContext(GetCurrentThread()) when it's done. - We're now doing a better job managing locks and handles. On NetBSD we now close semaphore file descriptors in forked children. Semaphores on Windows can now be canceled immediately, which means mutexes/condition variables will now go faster. Apple Silicon semaphores can be canceled too. We're now using Apple's pthread_yield() funciton. Apple _nocancel syscalls are now used on XNU when appropriate to ensure pthread_cancel requests aren't lost. The MbedTLS library has been updated to support POSIX thread cancelations. See tool/build/runitd.c for an example of how it can be used for production multi-threaded tls servers. Handles on Windows now leak less often across processes. All i/o operations on Windows are now overlapped, which means file pointers can no longer be inherited across dup() and fork() for the time being. - We now spawn a thread on Windows to deliver SIGCHLD and wakeup wait4() which means, for example, that posix_spawn() now goes 3x faster. POSIX spawn is also now more correct. Like Musl, it's now able to report the failure code of execve() via a pipe although our approach favors using shared memory to do that on systems that have a true vfork() function. - We now spawn a thread to deliver SIGALRM to threads when setitimer() is used. This enables the most precise wakeups the OS makes possible. - The Cosmopolitan runtime now uses less memory. On NetBSD for example, it turned out the kernel would actually commit the PT_GNU_STACK size which caused RSS to be 6mb for every process. Now it's down to ~4kb. On Apple Silicon, we reduce the mandatory upstream thread size to the smallest possible size to reduce the memory overhead of Cosmo threads. The examples directory has a program called greenbean which can spawn a web server on Linux with 10,000 worker threads and have the memory usage of the process be ~77mb. The 1024 byte overhead of POSIX-style thread-local storage is now optional; it won't be allocated until the pthread_setspecific/getspecific functions are called. On Windows, the threads that get spawned which are internal to the libc implementation use reserve rather than commit memory, which shaves a few hundred kb. - sigaltstack() is now supported on Windows, however it's currently not able to be used to handle stack overflows, since crash signals are still generated by WIN32. However the crash handler will still switch to the alt stack, which is helpful in environments with tiny threads. - Test binaries are now smaller. Many of the mandatory dependencies of the test runner have been removed. This ensures many programs can do a better job only linking the the thing they're testing. This caused the test binaries for LIBC_FMT for example, to decrease from 200kb to 50kb - long double is no longer used in the implementation details of libc, except in the APIs that define it. The old code that used long double for time (instead of struct timespec) has now been thoroughly removed. - ShowCrashReports() is now much tinier in MODE=tiny. Instead of doing backtraces itself, it'll just print a command you can run on the shell using our new `cosmoaddr2line` program to view the backtrace. - Crash report signal handling now works in a much better way. Instead of terminating the process, it now relies on SA_RESETHAND so that the default SIG_IGN behavior can terminate the process if necessary. - Our pledge() functionality has now been fully ported to AARCH64 Linux. |
||
---|---|---|
.. | ||
awk.1 | ||
awk.h | ||
awk.mk | ||
awkgram.tab.c | ||
awkgram.tab.h | ||
awkgram.y | ||
b.c | ||
cmd.c | ||
cmd.h | ||
lex.c | ||
lib.c | ||
LICENSE | ||
main.c | ||
maketab.c | ||
parse.c | ||
proctab.c | ||
README | ||
README.cosmo | ||
reflow.awk | ||
run.c | ||
tran.c |
AWK(1) General Commands Manual AWK(1) 𝐍𝐀𝐌𝐄 awk - pattern-directed scanning and processing language 𝐒𝐘𝐍𝐎𝐏𝐒𝐈𝐒 𝗮𝘄𝗸 [ -𝐅 f̲s̲ ] [ -𝘃 v̲a̲r̲=̲v̲a̲l̲u̲e̲ ] [ '̲p̲r̲o̲g̲'̲ | -𝗳 p̲r̲o̲g̲f̲i̲l̲e̲ ] [ f̲i̲l̲e̲ .̲.̲.̲ ] 𝐃𝐄𝐒𝐂𝐑𝐈𝐏𝐓𝐈𝐎𝐍 A̲w̲k̲ scans each input f̲i̲l̲e̲ for lines that match any of a set of patterns specified literally in p̲r̲o̲g̲ or in one or more files specified as -𝗳 p̲r̲o̲g̲‐̲ f̲i̲l̲e̲. With each pattern there can be an associated action that will be performed when a line of a f̲i̲l̲e̲ matches the pattern. Each line is matched against the pattern portion of every pattern-action statement; the associated action is performed for each matched pattern. The file name - means the standard input. Any f̲i̲l̲e̲ of the form v̲a̲r̲=̲v̲a̲l̲u̲e̲ is treated as an assignment, not a filename, and is executed at the time it would have been opened if it were a filename. The option -𝘃 followed by v̲a̲r̲=̲v̲a̲l̲u̲e̲ is an assignment to be done before p̲r̲o̲g̲ is executed; any number of -𝘃 options may be present. The -𝐅 f̲s̲ option defines the input field separator to be the regular expression f̲s̲. An input line is normally made up of fields separated by white space, or by the regular expression 𝐅𝐒. The fields are denoted $𝟭, $𝟮, ..., while $𝟬 refers to the entire line. If 𝐅𝐒 is null, the input line is split into one field per character. A pattern-action statement has the form: p̲a̲t̲t̲e̲r̲n̲ { a̲c̲t̲i̲o̲n̲ } A missing { a̲c̲t̲i̲o̲n̲ } means print the line; a missing pattern always matches. Pattern-action statements are separated by newlines or semi‐ colons. An action is a sequence of statements. A statement can be one of the following: if( e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ ) s̲t̲a̲t̲e̲m̲e̲n̲t̲ [ else s̲t̲a̲t̲e̲m̲e̲n̲t̲ ] while( e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ ) s̲t̲a̲t̲e̲m̲e̲n̲t̲ for( e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ ; e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ ; e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ ) s̲t̲a̲t̲e̲m̲e̲n̲t̲ for( v̲a̲r̲ in a̲r̲r̲a̲y̲ ) s̲t̲a̲t̲e̲m̲e̲n̲t̲ do s̲t̲a̲t̲e̲m̲e̲n̲t̲ while( e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ ) break continue { [ s̲t̲a̲t̲e̲m̲e̲n̲t̲ .̲.̲.̲ ] } e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ # commonly v̲a̲r̲ =̲ e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ print [ e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲-̲l̲i̲s̲t̲ ] [ > e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ ] printf f̲o̲r̲m̲a̲t̲ [ , e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲-̲l̲i̲s̲t̲ ] [ > e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ ] return [ e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ ] next # skip remaining patterns on this input line nextfile # skip rest of this file, open next, start at top delete a̲r̲r̲a̲y̲[ e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ ]# delete an array element delete a̲r̲r̲a̲y̲ # delete all elements of array exit [ e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ ] # exit immediately; status is e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ Statements are terminated by semicolons, newlines or right braces. An empty e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲-̲l̲i̲s̲t̲ stands for $𝟬. String constants are quoted " ", with the usual C escapes recognized within. Expressions take on string or numeric values as appropriate, and are built using the operators + - * / % ^ (exponentiation), and concatenation (indicated by white space). The operators ! ++ -- += -= *= /= %= ^= > >= < <= == != ?: are also available in expressions. Variables may be scalars, array elements (de‐ noted x̲[i̲]) or fields. Variables are initialized to the null string. Array subscripts may be any string, not necessarily numeric; this allows for a form of associative memory. Multiple subscripts such as [𝗶,𝗷,𝗸] are permitted; the constituents are concatenated, separated by the value of 𝐒𝐔𝐁𝐒𝐄𝐏. The 𝗽𝗿𝗶𝗻𝘁 statement prints its arguments on the standard output (or on a file if > f̲i̲l̲e̲ or >> f̲i̲l̲e̲ is present or on a pipe if | c̲m̲d̲ is present), separated by the current output field separator, and terminated by the output record separator. f̲i̲l̲e̲ and c̲m̲d̲ may be literal names or parenthe‐ sized expressions; identical string values in different statements denote the same open file. The 𝗽𝗿𝗶𝗻𝘁𝗳 statement formats its expression list ac‐ cording to the f̲o̲r̲m̲a̲t̲ (see p̲r̲i̲n̲t̲f̲(3)). The built-in function 𝗰𝗹𝗼𝘀𝗲(e̲x̲p̲r̲) closes the file or pipe e̲x̲p̲r̲. The built-in function 𝗳𝗳𝗹𝘂𝘀𝗵(e̲x̲p̲r̲) flushes any buffered output for the file or pipe e̲x̲p̲r̲. The mathematical functions 𝗮𝘁𝗮𝗻𝟮, 𝗰𝗼𝘀, 𝗲𝘅𝗽, 𝗹𝗼𝗴, 𝘀𝗶𝗻, and 𝘀𝗾𝗿𝘁 are built in. Other built-in functions: 𝗹𝗲𝗻𝗴𝘁𝗵 the length of its argument taken as a string, number of elements in an array for an array argument, or length of $𝟬 if no argu‐ ment. 𝗿𝗮𝗻𝗱 random number on [0,1). 𝘀𝗿𝗮𝗻𝗱 sets seed for 𝗿𝗮𝗻𝗱 and returns the previous seed. 𝗶𝗻𝘁 truncates to an integer value. 𝘀𝘂𝗯𝘀𝘁𝗿(s̲, m̲ [, n̲]) the n̲-character substring of s̲ that begins at position m̲ counted from 1. If no n̲, use the rest of the string. 𝗶𝗻𝗱𝗲𝘅(s̲, t̲) the position in s̲ where the string t̲ occurs, or 0 if it does not. 𝗺𝗮𝘁𝗰𝗵(s̲, r̲) the position in s̲ where the regular expression r̲ occurs, or 0 if it does not. The variables 𝐑𝐒𝐓𝐀𝐑𝐓 and 𝐑𝐋𝐄𝐍𝐆𝐓𝐇 are set to the po‐ sition and length of the matched string. 𝘀𝗽𝗹𝗶𝘁(s̲, a̲ [, f̲s̲]) splits the string s̲ into array elements a̲[𝟭], a̲[𝟮], ..., a̲[n̲], and returns n̲. The separation is done with the regular expres‐ sion f̲s̲ or with the field separator 𝐅𝐒 if f̲s̲ is not given. An empty string as field separator splits the string into one array element per character. 𝘀𝘂𝗯(r̲, t̲ [, s̲]) substitutes t̲ for the first occurrence of the regular expression r̲ in the string s̲. If s̲ is not given, $𝟬 is used. 𝗴𝘀𝘂𝗯(r̲, t̲ [, s̲]) same as 𝘀𝘂𝗯 except that all occurrences of the regular expression are replaced; 𝘀𝘂𝗯 and 𝗴𝘀𝘂𝗯 return the number of replacements. 𝘀𝗽𝗿𝗶𝗻𝘁𝗳(f̲m̲t̲, e̲x̲p̲r̲, .̲.̲.̲) the string resulting from formatting e̲x̲p̲r̲ .̲.̲.̲ according to the p̲r̲i̲n̲t̲f̲(3) format f̲m̲t̲. 𝘀𝘆𝘀𝘁𝗲𝗺(c̲m̲d̲) executes c̲m̲d̲ and returns its exit status. This will be -1 upon error, c̲m̲d̲'s exit status upon a normal exit, 256 + s̲i̲g̲ upon death-by-signal, where s̲i̲g̲ is the number of the murdering signal, or 512 + s̲i̲g̲ if there was a core dump. 𝘁𝗼𝗹𝗼𝘄𝗲𝗿(s̲t̲r̲) returns a copy of s̲t̲r̲ with all upper-case characters translated to their corresponding lower-case equivalents. 𝘁𝗼𝘂𝗽𝗽𝗲𝗿(s̲t̲r̲) returns a copy of s̲t̲r̲ with all lower-case characters translated to their corresponding upper-case equivalents. The ``function'' 𝗴𝗲𝘁𝗹𝗶𝗻𝗲 sets $𝟬 to the next input record from the cur‐ rent input file; 𝗴𝗲𝘁𝗹𝗶𝗻𝗲 < f̲i̲l̲e̲ sets $𝟬 to the next record from f̲i̲l̲e̲. 𝗴𝗲𝘁𝗹𝗶𝗻𝗲 x̲ sets variable x̲ instead. Finally, c̲m̲d̲ | 𝗴𝗲𝘁𝗹𝗶𝗻𝗲 pipes the out‐ put of c̲m̲d̲ into 𝗴𝗲𝘁𝗹𝗶𝗻𝗲; each call of 𝗴𝗲𝘁𝗹𝗶𝗻𝗲 returns the next line of output from c̲m̲d̲. In all cases, 𝗴𝗲𝘁𝗹𝗶𝗻𝗲 returns 1 for a successful input, 0 for end of file, and -1 for an error. Patterns are arbitrary Boolean combinations (with ! || &&) of regular ex‐ pressions and relational expressions. Regular expressions are as in e̲g̲r̲e̲p̲; see g̲r̲e̲p̲(1). Isolated regular expressions in a pattern apply to the entire line. Regular expressions may also occur in relational ex‐ pressions, using the operators ~ and !~. /r̲e̲/ is a constant regular ex‐ pression; any string (constant or variable) may be used as a regular ex‐ pression, except in the position of an isolated regular expression in a pattern. A pattern may consist of two patterns separated by a comma; in this case, the action is performed for all lines from an occurrence of the first pattern though an occurrence of the second. A relational expression is one of the following: e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ m̲a̲t̲c̲h̲o̲p̲ r̲e̲g̲u̲l̲a̲r̲-̲e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ r̲e̲l̲o̲p̲ e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ e̲x̲p̲r̲e̲s̲s̲i̲o̲n̲ 𝗶𝗻 a̲r̲r̲a̲y̲-̲n̲a̲m̲e̲ (e̲x̲p̲r̲,e̲x̲p̲r̲,̲.̲.̲.̲) 𝗶𝗻 a̲r̲r̲a̲y̲-̲n̲a̲m̲e̲ where a r̲e̲l̲o̲p̲ is any of the six relational operators in C, and a m̲a̲t̲c̲h̲o̲p̲ is either ~ (matches) or !~ (does not match). A conditional is an arith‐ metic expression, a relational expression, or a Boolean combination of these. The special patterns 𝐁𝐄𝐆𝐈𝐍 and 𝐄𝐍𝐃 may be used to capture control before the first input line is read and after the last. 𝐁𝐄𝐆𝐈𝐍 and 𝐄𝐍𝐃 do not combine with other patterns. They may appear multiple times in a program and execute in the order they are read by a̲w̲k̲. Variable names with special meanings: 𝐀𝐑𝐆𝐂 argument count, assignable. 𝐀𝐑𝐆𝐕 argument array, assignable; non-null members are taken as file‐ names. 𝐂𝐎𝐍𝐕𝐅𝐌𝐓 conversion format used when converting numbers (default %.𝟲𝗴). 𝐄𝐍𝐕𝐈𝐑𝐎𝐍 array of environment variables; subscripts are names. 𝐅𝐈𝐋𝐄𝐍𝐀𝐌𝐄 the name of the current input file. 𝐅𝐍𝐑 ordinal number of the current record in the current file. 𝐅𝐒 regular expression used to separate fields; also settable by option -𝐅f̲s̲. 𝐍𝐅 number of fields in the current record. 𝐍𝐑 ordinal number of the current record. 𝐎𝐅𝐌𝐓 output format for numbers (default %.𝟲𝗴). 𝐎𝐅𝐒 output field separator (default space). 𝐎𝐑𝐒 output record separator (default newline). 𝐑𝐋𝐄𝐍𝐆𝐓𝐇 the length of a string matched by 𝗺𝗮𝘁𝗰𝗵. 𝐑𝐒 input record separator (default newline). If empty, blank lines separate records. If more than one character long, 𝐑𝐒 is treated as a regular expression, and records are separated by text matching the expression. 𝐑𝐒𝐓𝐀𝐑𝐓 the start position of a string matched by 𝗺𝗮𝘁𝗰𝗵. 𝐒𝐔𝐁𝐒𝐄𝐏 separates multiple subscripts (default 034). Functions may be defined (at the position of a pattern-action statement) thus: 𝗳𝘂𝗻𝗰𝘁𝗶𝗼𝗻 𝗳𝗼𝗼(𝗮, 𝗯, 𝗰) { ...; 𝗿𝗲𝘁𝘂𝗿𝗻 𝘅 } Parameters are passed by value if scalar and by reference if array name; functions may be called recursively. Parameters are local to the func‐ tion; all other variables are global. Thus local variables may be cre‐ ated by providing excess parameters in the function definition. 𝐄𝐍𝐕𝐈𝐑𝐎𝐍𝐌𝐄𝐍𝐓 𝐕𝐀𝐑𝐈𝐀𝐁𝐋𝐄𝐒 If 𝐏𝐎𝐒𝐈𝐗𝐋𝐘_𝐂𝐎𝐑𝐑𝐄𝐂𝐓 is set in the environment, then a̲w̲k̲ follows the POSIX rules for 𝘀𝘂𝗯 and 𝗴𝘀𝘂𝗯 with respect to consecutive backslashes and amper‐ sands. 𝐄𝐗𝐀𝐌𝐏𝐋𝐄𝐒 length($0) > 72 Print lines longer than 72 characters. { print $2, $1 } Print first two fields in opposite order. BEGIN { FS = ",[ \t]*|[ \t]+" } { print $2, $1 } Same, with input fields separated by comma and/or spaces and tabs. { s += $1 } END { print "sum is", s, " average is", s/NR } Add up first column, print sum and average. /start/, /stop/ Print all lines between start/stop pairs. BEGIN { # Simulate echo(1) for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i] printf "\n" exit } 𝐒𝐄𝐄 𝐀𝐋𝐒𝐎 g̲r̲e̲p̲(1), l̲e̲x̲(1), s̲e̲d̲(1) A. V. Aho, B. W. Kernighan, P. J. Weinberger, T̲h̲e̲ A̲W̲K̲ P̲r̲o̲g̲r̲a̲m̲m̲i̲n̲g̲ L̲a̲n̲‐̲ g̲u̲a̲g̲e̲, Addison-Wesley, 1988. ISBN 0-201-07981-X. 𝐁𝐔𝐆𝐒 There are no explicit conversions between numbers and strings. To force an expression to be treated as a number add 0 to it; to force it to be treated as a string concatenate "" to it. The scope rules for variables in functions are a botch; the syntax is worse. Only eight-bit characters sets are handled correctly. 𝐔𝐍𝐔𝐒𝐔𝐀𝐋 𝐅𝐋𝐎𝐀𝐓𝐈𝐍𝐆-𝐏𝐎𝐈𝐍𝐓 𝐕𝐀𝐋𝐔𝐄𝐒 A̲w̲k̲ was designed before IEEE 754 arithmetic defined Not-A-Number (NaN) and Infinity values, which are supported by all modern floating-point hardware. Because a̲w̲k̲ uses s̲t̲r̲t̲o̲d̲(3) and a̲t̲o̲f̲(3) to convert string values to dou‐ ble-precision floating-point values, modern C libraries also convert strings starting with 𝗶𝗻𝗳 and 𝗻𝗮𝗻 into infinity and NaN values respec‐ tively. This led to strange results, with something like this: echo nancy | awk '{ print $1 + 0 }' printing 𝗻𝗮𝗻 instead of zero. A̲w̲k̲ now follows GNU AWK, and prefilters string values before attempting to convert them to numbers, as follows: H̲e̲x̲a̲d̲e̲c̲i̲m̲a̲l̲ v̲a̲l̲u̲e̲s̲ Hexadecimal values (allowed since C99) convert to zero, as they did prior to C99. N̲a̲N̲ v̲a̲l̲u̲e̲s̲ The two strings +𝗻𝗮𝗻 and -𝗻𝗮𝗻 (case independent) convert to NaN. No others do. (NaNs can have signs.) I̲n̲f̲i̲n̲i̲t̲y̲ v̲a̲l̲u̲e̲s̲ The two strings +𝗶𝗻𝗳 and -𝗶𝗻𝗳 (case independent) convert to posi‐ tive and negative infinity, respectively. No others do. AWK(1)