micro-utils/src/coreutils/nl/nl.c

75 lines
1.2 KiB
C

#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "config.h"
int w_flag = 4;
int lines = 1;
int nl(const char *path) {
FILE *fp = stdin;
if (strcmp(path, "-"))
fp = fopen(path, "r");
if (fp == NULL) {
fprintf(stderr, "nl: %s: %s\n", path, strerror(errno));
return 1;
}
char *buf = NULL;
size_t size = 0;
while (getline(&buf, &size, fp) != EOF) {
if (strlen(buf) > 1)
fprintf(stdout, "%*d\t%s", w_flag, lines++, buf);
else
fprintf(stdout, "%*s\t%s", w_flag, " ", buf);
}
if (buf != NULL)
free(buf);
if (strcmp(path, "-"))
fclose(fp);
return 0;
}
int main(int argc, char **argv) {
int opt;
while ((opt = getopt(argc, argv, "w:v:")) != -1) {
switch (opt) {
case 'w':
w_flag = atoi(optarg);
break;
case 'v':
lines = atoi(optarg);
break;
default:
printf("nl [wv] [file1 file2...]\n\t-w N Width of line numbers\n\t-v N Start from N\n");
return 0;
}
}
argv += optind;
argc -= optind;
if (argc == 0)
return nl("-");
else {
int ret = 0;
for (int i = 0; i < argc; i++)
if (nl(argv[i]))
ret = 1;
return ret;
}
}