1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-10 12:40:58 +02:00
Commit graph

4052 commits

Author SHA1 Message Date
Bart Schaefer
f85cb45045 Merge branch 'typesettounset' into declarednull
Adds 'setopt typeset_to_unset', documentation, failure tests for POSIX incompatibilies, etc.
2021-04-13 21:30:06 -07:00
Bart Schaefer
fbc1125316 Change DECLAREDNULL to DEFAULTED 2021-04-13 21:18:35 -07:00
Bart Schaefer
f621fb7ab8 Fix ${(t)var} output, add comparative test cases 2021-04-13 21:18:35 -07:00
Bart Schaefer
dcd4439a9f Missed files from POSXIBUILTINS commit 2021-04-13 21:18:35 -07:00
Bart Schaefer
69bd4a197c Final repairs for declared state of tied arrays
Fixups still required in bin_typeset, but assignments to scalar work.
2021-04-13 21:18:35 -07:00
Bart Schaefer
733c166115 Additional tied-array cleanup when tied scalar had a previous value 2021-04-13 21:18:35 -07:00
Bart Schaefer
ec4093659b Unset of a tied local scalar previously left it using tiedarr_gsu 2021-04-13 21:18:35 -07:00
Bart Schaefer
709af2bf3c Partial fix for handling of tied arrays.
As of this commit when a tied array is declared but neither the scalar
nor the array has an initializer, the array is initialized to empty.

The scalar struct param of a tied pair stores a direct pointer to the
internal array value of the array struct param, and upon assignment
modifies it without referring to the containing struct.  This means
that there's no opportunity to clear the PM_DECLAREDNULL bits on both
structs when the scalar is assigned.  Conversely, assigning to the
array does use the struct for the scalar.
2021-04-13 21:18:35 -07:00
Bart Schaefer
d0a25afe32 Choose a better bit-value for PM_DECLARED 2021-04-13 21:18:34 -07:00
Bart Schaefer
dddae7f055 Add PM_DECLARED and PM_DECLAREDNULL parameter flags.
This addresses the issue that "typeset foo" creates $foo set to an
empty string, which differs from typeset handling in bash and ksh.
It does this by concealing the internal value rather than alter
the way internal values are defaulted.

This imposes the following changes:

A typeset variable with no assignment triggers NO_UNSET warnings
when the name is used in parameter expansion or math.

The typeset -AEFHLRTZailux options are applied upon the first
assignment to the variable.  Explicit unset before the first
assignment discards all of those properties.  If any option is
applied to an existing name, historic behavior is unchanged.

Consequent to the foregoing, the (t) parameter expansion flag
prints nothing until after the first assignment, and the (i)
and (I) subscript flags also print nothing.

The bash behavior of "unset foo; typeset -p foo" is NOT used.
This is called out as an emulation distinction, not a change.

The test cases have not been updated, so several now fail.
The test harness has been updated to declare default values.
2021-04-13 21:18:34 -07:00
Bart Schaefer
b3613e4895 Change TYPESET_DOES_NOT_SET to TYPESET_TO_UNSET to avoid double-negative 2021-04-12 13:59:06 -07:00
Jun-ichi Takimoto
a90d5ab901 48439: remove macros that became unnecessary by df48cc8 2021-04-12 14:42:29 +09:00
Oliver Kiddle
704d10989e 48504: use SEEK_ macros in fseek() calls 2021-04-11 22:26:36 +02:00
Michael Stapelberg
6388156233 45396: readhistfile: avoid thousands of lseek(2) syscalls via ftell() 2021-04-11 21:38:27 +02:00
brian m. carlson
f7a417388c 47794: exec: run final pipeline command in a subshell in sh mode
zsh typically runs the final command in a pipeline in the main shell
instead of a subshell.  However, POSIX specifies that all commands in a
pipeline run in a subshell, but permits zsh's behavior as an extension.
The default /bin/sh implementations on various Linux distros and the
BSDs always use a subshell for all components of a pipeline.

Since zsh may be used as /bin/sh in some cases (such as macOS Catalina),
it makes sense to have the common sh behavior when emulating sh, so do
that by checking for being the final item of a multi-item pipeline and
creating a subshell in that case.

From the comment above execpline(), we know the following:

 last1 is a flag that this command is the last command in a shell that
 is about to exit, so we can exec instead of forking.  It gets passed
 all the way down to execcmd() which actually makes the decision.  A 0
 is always passed if the command is not the last in the pipeline. […]
 If last1 is zero but the command is at the end of a pipeline, we pass
 2 down to execcmd().

So there are three cases to consider in this code:

• last1 is 0, which means we are not at the end of a pipeline, in which
 case we should not change behavior.
• last1 is 1, which means we are effectively running in a subshell,
 because nothing that happens due to the exec is going to affect the
 actual shell, since it will have been replaced.  So there is nothing
 to do here.
• last1 is 2, which means our command is at the end of the pipeline, so
 in sh mode we should create a subshell by forking.

input is nonzero if the input to this process is a pipe that we've
opened.  At the end of a multi-stage pipeline, it will necessarily be
nonzero.

Note that several of the tests may appear bizarre, since most developers
do not place useless variable assignments directly at the end of a
pipeline.  However, as the function tests demonstrate, there are cases
where assignments may occur when a shell function is used at the end of
a command.  The remaining assignment tests simply test additional cases,
such as the use of local, that would otherwise be untested.
2021-04-10 17:56:39 -05:00
Bart Schaefer
408a830483 47913: implement CASE_PATHS option to make NO_CASE_GLOB more sensible 2021-04-10 14:26:46 -07:00
Bart Schaefer
e67ccd7f1e Add TYPESET_DOES_NOT_SET option (cf. 48469) 2021-04-10 14:13:02 -07:00
Bart Schaefer
fd89e7cefa Change DECLAREDNULL to DEFAULTED 2021-04-10 14:12:29 -07:00
Bart Schaefer
d649bf78dc Fix ${(t)var} output, add comparative test cases 2021-04-10 14:12:29 -07:00
Bart Schaefer
2eb9289d12 Missed files from POSXIBUILTINS commit 2021-04-10 14:12:29 -07:00
Bart Schaefer
b1bd99b67f Final repairs for declared state of tied arrays
Fixups still required in bin_typeset, but assignments to scalar work.
2021-04-10 14:12:29 -07:00
Bart Schaefer
fa5f59bf71 Additional tied-array cleanup when tied scalar had a previous value 2021-04-10 14:12:29 -07:00
Bart Schaefer
7a2d6589ba Unset of a tied local scalar previously left it using tiedarr_gsu 2021-04-10 14:12:29 -07:00
Bart Schaefer
128035c93c Partial fix for handling of tied arrays.
As of this commit when a tied array is declared but neither the scalar
nor the array has an initializer, the array is initialized to empty.

The scalar struct param of a tied pair stores a direct pointer to the
internal array value of the array struct param, and upon assignment
modifies it without referring to the containing struct.  This means
that there's no opportunity to clear the PM_DECLAREDNULL bits on both
structs when the scalar is assigned.  Conversely, assigning to the
array does use the struct for the scalar.
2021-04-10 14:12:29 -07:00
Bart Schaefer
a8f2a5d0c8 Choose a better bit-value for PM_DECLARED 2021-04-10 14:12:29 -07:00
Bart Schaefer
36886b5bac Add PM_DECLARED and PM_DECLAREDNULL parameter flags.
This addresses the issue that "typeset foo" creates $foo set to an
empty string, which differs from typeset handling in bash and ksh.
It does this by concealing the internal value rather than alter
the way internal values are defaulted.

This imposes the following changes:

A typeset variable with no assignment triggers NO_UNSET warnings
when the name is used in parameter expansion or math.

The typeset -AEFHLRTZailux options are applied upon the first
assignment to the variable.  Explicit unset before the first
assignment discards all of those properties.  If any option is
applied to an existing name, historic behavior is unchanged.

Consequent to the foregoing, the (t) parameter expansion flag
prints nothing until after the first assignment, and the (i)
and (I) subscript flags also print nothing.

The bash behavior of "unset foo; typeset -p foo" is NOT used.
This is called out as an emulation distinction, not a change.

The test cases have not been updated, so several now fail.
The test harness has been updated to declare default values.
2021-04-10 14:12:29 -07:00
Peter Stephenson
283d2f3c27 48432 and enable test: fix quotiing of zstyle -L for zstyle -e 2021-04-09 21:01:37 +01:00
Felipe Contreras
df48cc8404 47785: remove deprecated autoconf functions
STDC_HEADERS and TIME_WITH_SYS_TIME are deprecated.
2021-04-09 21:45:11 +02:00
Daniel Shahaf
4ba9008ec7 48379: Make the parameter expansion subscript flags parse error message, "error in flags", identify the location of the parse error. 2021-04-08 02:19:39 +00:00
Jun-ichi Takimoto
9562a1ee7b 48391: fix display problem in menu-complete
Take account of the trailing file type character even when '-d disp'
is given to compadd.
2021-04-06 23:38:52 +09:00
Jun-ichi Takimoto
0f62e07c80 48389: getkeystring() should not return ptr to local var
Now it returns NULL if called with GETKEY_SINGLE_CHAR and next character
is not found. Caller must check the return value.
2021-04-06 23:05:03 +09:00
Felipe Contreras
94b5446838 47784: silence a compiler waring from pattern.c 2021-04-04 14:48:01 +09:00
Oliver Kiddle
0721060f36 47510: drop code that avoided termcap for named colours
The inconsistency caused test failures where TERM is e.g. rxvt-unicode.
This also makes a couple of bits available in zattr by removing flags
indicating whether to use termcap which is not an attribute as such.
2021-04-03 00:58:45 +02:00
Mikael Magnusson
ea3351c496 48202 + 48366: Fix handling of NUL bytes in zexpandtabs multibyte version 2021-04-01 09:50:52 +02:00
Stephane Chazelas
d96c898101 47745: Fix [:IDENT:] vs posixidentifiers
wcsitype(c, IIDENT) should return false for non-ASCII characters
when the POSIX_IDENTIFIERS option is on, not the other way round.
2021-03-23 00:15:09 -05:00
Peter Stephenson
6bef719302 users/26509: fix for r -L
fc with the -L option should ignore remote entires, rather than
reading them and treating them as an error.
2021-02-18 21:37:08 +00:00
Martijn Dekker
9c0533931c 48073: Add fc -s as POSIX way of rerunning command without starting editor 2021-02-17 10:21:08 +00:00
Justine Tunney
326d9c203b Allow more scripts without #!
This change modifies the zsh binary safety check surrounding execve() so
it can run shell scripts having concatenated binary content. We're using
the same safety check as FreeBSD /bin/sh [1]. POSIX was recently revised
to require this behavior:

    "The input file may be of any type, but the initial portion of the
     file intended to be parsed according to the shell grammar (XREF to
     XSH 2.10.2 Shell Grammar Rules) shall consist of characters and
     shall not contain the NUL character. The shell shall not enforce
     any line length limits."

    "Earlier versions of this standard required that input files to the
     shell be text files except that line lengths were unlimited.
     However, that was overly restrictive in relation to the fact that
     shells can parse a script without a trailing newline, and in
     relation to a common practice of concatenating a shell script
     ending with an 'exit' or 'exec $command' with a binary data payload
     to form a single-file self-extracting archive." [2] [3]

One example use case of such scripts, is the Cosmopolitan C Library [4]
which configuse the GNU Linker to output a polyglot shell+binary format
that runs on Linux / Mac / Windows / FreeBSD / OpenBSD.

[1] 9a1cd36331
[2] http://austingroupbugs.net/view.php?id=1250
[3] http://austingroupbugs.net/view.php?id=1226#c4394
[4] https://justine.lol/cosmopolitan/index.html
2021-02-16 09:16:20 +00:00
Joshua Krusell
3d6e5b6231 47905: Add leading '-' to zparseopts option parsing errors 2021-02-13 00:54:59 +01:00
Bart Schaefer
2cf6032a30 47997: Disable XTRACE around user-defined completion widgets. 2021-02-11 19:13:47 -08:00
Bart Schaefer
465738fc25 47895: Remove trailing spaces from "print -ac" output lines. 2021-02-04 17:52:22 -08:00
Joshua Krusell
9120d1e841 47899: Improve error message from zparseopts. 2021-02-03 11:33:47 +00:00
GammaFunction
5d14b6eb71 47744: Fix vi repeats with hooks in use. 2021-01-27 10:04:40 +00:00
Peiyuan Song
bf8ca5f019 47840: make zpty module work on Cygwin 2021-01-20 13:33:52 +09:00
Bart Schaefer
3499a676fa 47704: fix scope for "private -p" 2020-12-02 20:14:45 -08:00
Mikael Magnusson
8773f01f2b 47494, 47495: Add -n option to strftime 2020-10-25 23:06:02 +01:00
Jun-ichi Takimoto
b6ba74cd4e 47301: Fix print -v metafication 2020-10-25 23:05:19 +01:00
Roman Perepelitsa
ead29c2a36 Fix a race condition in zf_mkdir -p
If ~/foo does not exist and `zf_mkdir -p zf_mkdir -p` is executed
concurrently in multiple shells, it was possible prior to this patch
for the command to fail with EEXIST.
2020-10-23 11:42:30 +02:00
Bart Schaefer
04bd9a44a7 Unposted - fix comment 2020-09-13 17:13:51 -07:00
Bart Schaefer
63b6398b70 47364: Enable extendedglob in pattern with ${(*)name/pattern/replacement}
Mikael Magnusson: 47382: Completion for 47364
2020-09-13 16:19:52 -07:00