tail(1p): initial commit & libyac: fixed build
This commit is contained in:
parent
7f5e532216
commit
1d2a9c2521
14
Makefile
14
Makefile
@ -10,26 +10,26 @@
|
||||
PREFIX=/usr/local
|
||||
CFLAGS=-O3 -s -Wl,-z,noseparate-code,-z,nosectionheader -flto -Lbuild -lyac
|
||||
|
||||
build: build_dir lib cat false tail true
|
||||
build: build_dir cat false tail true
|
||||
|
||||
clean: build_dir
|
||||
rm -rf build/
|
||||
|
||||
cat: build_dir
|
||||
cat: build_dir lib
|
||||
cc $(CFLAGS) -o build/cat src/cat.c
|
||||
|
||||
false: build_dir
|
||||
false: build_dir lib
|
||||
cc $(CFLAGS) -o build/false src/false.c
|
||||
|
||||
tail: build_dir
|
||||
tail: build_dir lib
|
||||
cc $(CFLAGS) -o build/tail src/tail.c
|
||||
|
||||
true: build_dir
|
||||
true: build_dir lib
|
||||
cc $(CFLAGS) -o build/true src/true.c
|
||||
|
||||
lib:
|
||||
cc -c -fPIC $(CFLAGS) -o build/yac.o src/yac.c
|
||||
cc $(CFLAGS) -shared -o build/libyac.so build/yac.o
|
||||
cc $(CFLAGS) -c -fPIC -o build/yac.o src/yac.c
|
||||
cc -shared -o build/libyac.so build/yac.o
|
||||
|
||||
build_dir:
|
||||
mkdir -p build
|
||||
|
134
src/tail.c
Normal file
134
src/tail.c
Normal file
@ -0,0 +1,134 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Emma Tebibyte <emma@tebibyte.media>
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*
|
||||
* This file is part of YAC coreutils.
|
||||
*
|
||||
* YAC coreutils is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* YAC coreutils is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
||||
* details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see https://www.gnu.org/licenses/.
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <sysexits.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "yac.h"
|
||||
|
||||
void tail(FILE *file, bool c, bool f, long num) {
|
||||
long offset;
|
||||
if (c) { fseek(file, offset, SEEK_END); }
|
||||
else {
|
||||
for
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
bool c = false;
|
||||
bool f = false;
|
||||
bool n = false;
|
||||
long num;
|
||||
int opt;
|
||||
int i;
|
||||
|
||||
extern int optind;
|
||||
while ((opt = getopt(argc, argv, "c:fn:")) != -1) {
|
||||
switch (opt) {
|
||||
/*
|
||||
* From tail(1p):
|
||||
*
|
||||
* -c number The application shall ensure that the number option-argument
|
||||
* is a decimal integer, optionally including a sign. The sign
|
||||
* shall affect the location in the file, measured in bytes, to
|
||||
* begin the copying:
|
||||
*
|
||||
* ┌─────┬────────────────────────────────────────┐
|
||||
* │Sign │ Copying Starts │
|
||||
* ├─────┼────────────────────────────────────────┤
|
||||
* │ + │ Relative to the beginning of the file. │
|
||||
* │ - │ Relative to the end of the file. │
|
||||
* │none │ Relative to the end of the file. │
|
||||
* └─────┴────────────────────────────────────────┘
|
||||
* The application shall ensure that if the sign of the number
|
||||
* option-argument is '+', the number option-argument is a non-
|
||||
* zero decimal integer.
|
||||
*
|
||||
* The origin for counting shall be 1; that is, -c +1 represents
|
||||
* the first byte of the file, -c -1 the last.
|
||||
*
|
||||
* -f If the input file is a regular file or if the file operand
|
||||
* specifies a FIFO, do not terminate after the last line of the
|
||||
* input file has been copied, but read and copy further bytes
|
||||
* from the input file when they become available. If no file
|
||||
* operand is specified and standard input is a pipe or FIFO,
|
||||
* the -f option shall be ignored. If the input file is not a
|
||||
* FIFO, pipe, or regular file, it is unspecified whether or not
|
||||
* the -f option shall be ignored.
|
||||
*
|
||||
* -n number This option shall be equivalent to -c number, except the
|
||||
* starting location in the file shall be measured in lines
|
||||
* instead of bytes. The origin for counting shall be 1; that
|
||||
* is, -n +1 represents the first line of the file, -n -1 the
|
||||
* last.
|
||||
*
|
||||
* If neither -c nor -n is specified, -n 10 shall be assumed.
|
||||
*/
|
||||
case 'c':
|
||||
c = true;
|
||||
num = (long)optarg;
|
||||
break;
|
||||
case 'f':
|
||||
f = true;
|
||||
case 'n':
|
||||
n = true;
|
||||
num = (long)optarg;
|
||||
break;
|
||||
default:
|
||||
fprintf(
|
||||
stderr,
|
||||
"Usage: %s (-f) [-c characters] [-n lines] file...\n",
|
||||
argv[0]
|
||||
);
|
||||
return EX_USAGE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!n && !c) {
|
||||
num = 10;
|
||||
} else if (n && c) {
|
||||
fprintf(
|
||||
stderr,
|
||||
"Usage: %s (-f) [-c characters] [-n lines] file...\n",
|
||||
argv[0]
|
||||
);
|
||||
return EX_USAGE;
|
||||
}
|
||||
|
||||
if (optind = argc) {
|
||||
tail(stdin, c, f, num);
|
||||
}
|
||||
|
||||
FILE *file;
|
||||
|
||||
for (i = optind; i < argc; i++) {
|
||||
file = rfile(argv0, argv[i]);
|
||||
if file != NULL {
|
||||
tail(file, c, f, num);
|
||||
if (file != stdin) { fclose(file); }
|
||||
}
|
||||
}
|
||||
|
||||
return EX_OK;
|
||||
}
|
Loading…
Reference in New Issue
Block a user