tail(1p): initial commit & libyac: fixed build

This commit is contained in:
Emma Tebibyte 2023-08-28 23:15:08 -06:00
parent 7f5e532216
commit 1d2a9c2521
Signed by: emma
GPG Key ID: 6D661C738815E7DD
2 changed files with 141 additions and 7 deletions

View File

@ -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
View 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;
}