Commit Graph

1728 Commits

Author SHA1 Message Date
Michael Forney
8ca79a2993 linecmp: Handle NUL bytes properly
Test case:

if [ "$(printf 'a\na\0b' | ./sort -u)" = "$(printf 'a\na\0b')" ] ; then
	echo pass
else
	echo fail
fi
2016-07-09 10:09:50 +01:00
Michael Forney
a944b682a6 sort: Fix line comparison when col buffer contains data from longer line
I'm not sure if there are other implications of this or not, but
the issue is that columns() uses len to store the allocated buffer
size, but linecmp() compares up to len bytes. If those trailing
bytes do not match, the line is considered not matching, even though
the relevant parts of the buffer do match.

To resolve this, also keep track of column capacity. Additionally,
since there is no reason to keep the existing data when resizing,
just use free and emalloc rather than erealloc.

The simplest case I could reduce it to is this:

if [ "$(printf '%s\n' a a xxb xxc | ./sort -u)" = "$(printf '%s\n' a xxb xxc)" ] ; then
	echo pass
else
	echo fail
fi
2016-07-09 10:09:50 +01:00
Michael Forney
d827fcace2 ls: Simplify some logic
- After first iteration, set first to 0 instead of !first.
- If Hflag || Lflag, then mkent used stat instead of lstat, so the
  entity cannot be a symlink.
- Print path prefix along with directory name.
- In the 'if (Rflag)' block, just use 1 instead of Rflag.
2016-07-09 10:09:50 +01:00
Michael Forney
ea03da0bda ls: Don't show directory name with single directory operand
This fixes the issue b107489bf2 tried
to fix, but doesn't break -R (which
bb83eade39 tried to fix).
2016-07-09 10:09:50 +01:00
Michael Forney
e8e9b97baf Revert "ls: only display directory headers when more than one directory is specified"
This reverts commit b107489bf2.
2016-07-09 10:09:50 +01:00
Michael Forney
b91b9e79ec Revert "Fix showing directories when -R flag is set in ls(1)"
This reverts commit bb83eade39.

This commit causes the loop through dents at the end of main to
continue past the end of the dents array, causing a crash when
called with multiple directory arguments.
2016-07-09 10:09:50 +01:00
pranomostro
229d7cc89a printf: support escaping '%' with '%%'. See printf(1p) EXAMPLES section. 2016-06-27 11:21:47 +01:00
sin
11d8e91042 tee: Make sure we continue on error 2016-06-23 19:38:05 +01:00
Michael Forney
0ba879cdba grep: Fix -v output and exit status
Previously, it printed lines that didn't match some pattern. Instead,
it should print lines that don't match *any* pattern.

Test case:

out=$(echo foo | ./grep -v -e foo -e bar)
if [ "$?" = 1 ] && [ -z "$out" ] ; then
	echo pass
else
	echo fail
fi
2016-05-14 12:58:38 +01:00
Michael Forney
e6b3af07cf grep: Fix exit status with -F when last line doesn't match
Test case:

if printf '%s\n' foo bar | ./grep -F foo >/dev/null ; then
	echo pass
else
	echo fail
fi
2016-05-14 12:58:38 +01:00
Michael Forney
8636c956d9 grep: Reverse some if-else logic
This way, people don't have to do double negatives in their head.
2016-05-14 12:58:38 +01:00
FRIGN
c7ea20a9cb Update Kurt H. Maier's E-Mail address 2016-04-29 12:16:51 +01:00
FRIGN
afc944d9b8 Remove locale-cancer from grep(1)
What in the actual fuck? Check the ml history on why we won't use
locale() functions in this context.
2016-04-29 12:16:51 +01:00
Mattias Andrée
727f795e94 grep: fix UTF-8 support
Signed-off-by: Mattias Andrée <maandree@kth.se>
2016-04-20 22:57:40 +01:00
Mattias Andrée
7250fb6968 printenv: exit status is 2 on failure
This provides a reliable and portable way to
test whether an environment variable is defined.

(Of course, if you are using glibc you may get
false positives if you include a = in the query.)

Signed-off-by: Mattias Andrée <maandree@kth.se>
2016-04-20 22:57:40 +01:00
Mattias Andrée
dfc94e0221 ls: fix segfault when timestamp is out of range for struct tm
Signed-off-by: Mattias Andrée <maandree@kth.se>
2016-04-20 22:57:40 +01:00
Mattias Andrée
33c5c71e01 Update test.1:
Document -ef, -ot, and -nt.
-k was already documented somewhy it seems...

Signed-off-by: Mattias Andrée <maandree@kth.se>
2016-04-20 22:57:40 +01:00
Hiltjo Posthuma
8d96afd4fb touch: make invalid date an error and fix uninitialised value
reproduce: touch -t 12345678 mytralala

would only give a warning and use uninitialised time values. The proper
way is to treat it as an error. Clear the "struct tm" and kill some lines
just in case.
2016-04-15 19:53:01 +01:00
sin
d89cd48118 test: Sort includes 2016-03-26 19:07:45 +00:00
sin
4093341657 test: Remove unused variable 2016-03-26 08:18:47 +00:00
Mattias Andrée
35a114acd5 test: add support for big integers
Signed-off-by: Mattias Andrée <maandree@kth.se>
2016-03-26 08:18:47 +00:00
Mattias Andrée
1ea414e300 test: add -k, -ef, -ot, and -nt
Signed-off-by: Mattias Andrée <maandree@kth.se>
2016-03-26 08:18:47 +00:00
Mattias Andrée
44a6d65832 *sum: support - when using -c
Signed-off-by: Mattias Andrée <maandree@kth.se>
2016-03-26 08:18:47 +00:00
Michael Forney
75611997f9 sort: Fix -c option
In eb9bda8787, a bug was introduced in the
handling of -1 return values from getline. Since the type of the len
field in struct line is unsigned, the break condition was never true.
This caused sort -c to never succeed.
2016-03-13 11:08:36 +00:00
Eivind Uggedal
d4f7ecd334 uniq: always store previous line length
A bug was introduced in the NUL support refactor leading to
the length of the previous line only being saved if the
previous line was shorter than the current line. If triggered
this lead to copying too much data into the previous line buffer.

Behavior before:

	printf '1234\na\n' | ./uniq
	1234
	a
	4

Behavior after:

	printf '1234\na\n' | ./uniq
	1234
	a
2016-03-11 15:38:36 +00:00
FRIGN
515525997c Fix linecmp() to return correct values 2016-03-11 15:38:36 +00:00
FRIGN
0b87cd4c61 Properly use delimlen instead of len in paste(1) 2016-03-10 13:39:49 +00:00
FRIGN
7fd88bdc6f xargs(1) already supports NUL characters 2016-03-10 08:48:09 +00:00
FRIGN
5b7df455f8 Change paste(1) a bit to prepare libutf changes 2016-03-10 08:48:09 +00:00
FRIGN
e537186ba4 Support NUL containing lines in uniq(1) 2016-03-10 08:48:09 +00:00
FRIGN
b58884312c Support NUL containing lines in nl(1) and reuse the line-buffer(!) 2016-03-10 08:48:09 +00:00
FRIGN
c25996924b Support NUL containing lines in join(1)
while also simplyfing the line-field-parser.
2016-03-10 08:48:09 +00:00
FRIGN
d7741c7725 Support NUL containing lines in fold(1) and reuse the line-buffer(!) 2016-03-10 08:48:09 +00:00
FRIGN
dc5190eab1 logger(1) is NUL compliant
because we can't call the syslog-syscall without becoming unportable.
The syslog() libc-function does not accept a length though, so we're
fucked. Anyway, let's carry on.
2016-03-10 08:48:09 +00:00
FRIGN
00b579566a Use the UTF8_POINT macro in cols(1)
No need for libutf any more
2016-03-10 08:48:09 +00:00
FRIGN
cc3aefa488 Support NUL containing lines in cut(1) 2016-03-10 08:48:09 +00:00
FRIGN
5ad71a466b Error out when giving an empty delimiter to sort(1) 2016-03-10 08:48:09 +00:00
FRIGN
3debc5e064 Add linecmp() 2016-03-10 08:48:09 +00:00
FRIGN
698a14b1da Indent README headings properly 2016-03-10 08:48:09 +00:00
FRIGN
45b42516d4 Support NUL containing lines in head(1)
Very trivial this time.
2016-03-10 08:48:09 +00:00
FRIGN
886fca3fd6 Support NUL containing lines in tail(1)
This was rather simple this time.
2016-03-10 08:48:09 +00:00
FRIGN
0fa5a3e5bb Rename struct linebufline to struct line and add linecmp()
This simplifies the handling in sort(1) and comm(1) quite a bit.
2016-03-10 08:48:09 +00:00
FRIGN
54d3f3b3a5 Rename linecmp and line-structs in join(1) and sort(1)
We will steal the names for the global functions.
2016-03-10 08:48:09 +00:00
FRIGN
d585d4b028 No need for += when res is 0 anyway 2016-03-10 08:48:09 +00:00
FRIGN
eebba22577 Support NUL containing lines in comm(1) 2016-03-10 08:48:09 +00:00
FRIGN
691c54750f Don't mark cols(1) as NUL-compliant as of yet
Thing is, we don't yet have an updated utflen() ready for use. Although
prints the lines completely, it does not add a proper spacing between
each entry. This will be fixed later.
2016-03-10 08:48:09 +00:00
FRIGN
9d120b7b32 Actually move past the field separator
Previously, sort(1) failed on key-based sorting and was caught in an
infinite loop with the c-flag.
2016-03-10 08:48:09 +00:00
FRIGN
0e25f09b56 Remove debug info 2016-03-10 08:48:09 +00:00
FRIGN
19c0ca9830 Properly increment line lenght on edge-case in getlines() 2016-03-10 08:48:09 +00:00
FRIGN
eb9bda8787 Support NUL-containing lines in sort(1)
For sort(1) we need memmem(), which I imported from OpenBSD.
Inside sort(1), the changes involved working with the explicit lengths
given by getlines() earlier and rewriting some of the functions.

Now we can handle NUL-characters in the input just fine.
2016-03-10 08:48:09 +00:00