#include #include #include #include #include #include #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; } }