int main(int argc, char* argv []) { if (argc!=2) { std::cout<<"Usage : linecnt text_file \n\n"; return -1; }; int line=linecnt(argv[1]); std::cout<<line<<"\n"; };
int main(int argc, char **argv) { bool newrc, already; int rcfirst = 0; /* first message to print (from .rc) */ int rcback = 0; /* amount to back off of rcfirst */ int firstmsg = 0, nextmsg = 0, lastmsg = 0; int blast = 0; struct stat buf; /* stat to check access of bounds */ FILE *bounds; #ifdef UNBUFFERED setbuf(stdout, NULL); #endif setlocale(LC_ALL, ""); time(&t); setuid(uid = getuid()); ruptible = (signal(SIGINT, SIG_IGN) == SIG_DFL); if (ruptible) signal(SIGINT, SIG_DFL); argc--, argv++; while (argc > 0) { if (isdigit(argv[0][0])) { /* starting message # */ rcfirst = atoi(argv[0]); } else if (isdigit(argv[0][1])) { /* backward offset */ rcback = atoi( &( argv[0][1] ) ); } else { ptr = *argv; while (*ptr) switch (*ptr++) { case '-': break; case 'c': if (uid != SUPERUSER && uid != DAEMON) { fprintf(stderr, "Sorry\n"); exit(1); } clean = YES; break; case 'f': /* silently */ hush = YES; break; case 'h': /* headers only */ hdrs = YES; break; case 'l': /* local msgs only */ locomode = YES; break; case 'o': /* option to save last message */ lastcmd = YES; break; case 'p': /* pipe thru 'more' during long msgs */ use_pager = YES; break; case 'q': /* query only */ qopt = YES; break; case 's': /* sending TO msgs */ send_msg = YES; break; default: usage(); } } argc--, argv++; } /* * determine current message bounds */ snprintf(fname, sizeof(fname), "%s/%s", _PATH_MSGS, BOUNDS); /* * Test access rights to the bounds file * This can be a little tricky. if(send_msg), then * we will create it. We assume that if(send_msg), * then you have write permission there. * Else, it better be there, or we bail. */ if (send_msg != YES) { if (stat(fname, &buf) < 0) { if (hush != YES) { err(errno, "%s", fname); } else { exit(1); } } } bounds = fopen(fname, "r"); if (bounds != NULL) { fscanf(bounds, "%d %d\n", &firstmsg, &lastmsg); fclose(bounds); blast = lastmsg; /* save upper bound */ } if (clean) keep = t - (rcback? rcback : NDAYS) DAYS; if (clean || bounds == NULL) { /* relocate message bounds */ struct dirent *dp; struct stat stbuf; bool seenany = NO; DIR *dirp; dirp = opendir(_PATH_MSGS); if (dirp == NULL) err(errno, "%s", _PATH_MSGS); firstmsg = 32767; lastmsg = 0; for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)){ char *cp = dp->d_name; int i = 0; if (dp->d_ino == 0) continue; if (clean) snprintf(inbuf, sizeof(inbuf), "%s/%s", _PATH_MSGS, cp); while (isdigit(*cp)) i = i * 10 + *cp++ - '0'; if (*cp) continue; /* not a message! */ if (clean) { if (stat(inbuf, &stbuf) != 0) continue; if (stbuf.st_mtime < keep && stbuf.st_mode&S_IWRITE) { unlink(inbuf); continue; } } if (i > lastmsg) lastmsg = i; if (i < firstmsg) firstmsg = i; seenany = YES; } closedir(dirp); if (!seenany) { if (blast != 0) /* never lower the upper bound! */ lastmsg = blast; firstmsg = lastmsg + 1; } else if (blast > lastmsg) lastmsg = blast; if (!send_msg) { bounds = fopen(fname, "w"); if (bounds == NULL) err(errno, "%s", fname); chmod(fname, CMODE); fprintf(bounds, "%d %d\n", firstmsg, lastmsg); fclose(bounds); } } if (send_msg) { /* * Send mode - place msgs in _PATH_MSGS */ bounds = fopen(fname, "w"); if (bounds == NULL) err(errno, "%s", fname); nextmsg = lastmsg + 1; snprintf(fname, sizeof(fname), "%s/%d", _PATH_MSGS, nextmsg); newmsg = fopen(fname, "w"); if (newmsg == NULL) err(errno, "%s", fname); chmod(fname, CMODE); fprintf(bounds, "%d %d\n", firstmsg, nextmsg); fclose(bounds); sending = YES; if (ruptible) signal(SIGINT, onintr); if (isatty(fileno(stdin))) { ptr = getpwuid(uid)->pw_name; printf("Message %d:\nFrom %s %sSubject: ", nextmsg, ptr, ctime(&t)); fflush(stdout); fgets(inbuf, sizeof inbuf, stdin); putchar('\n'); fflush(stdout); fprintf(newmsg, "From %s %sSubject: %s\n", ptr, ctime(&t), inbuf); blankline = seensubj = YES; } else blankline = seensubj = NO; for (;;) { fgets(inbuf, sizeof inbuf, stdin); if (feof(stdin) || ferror(stdin)) break; blankline = (blankline || (inbuf[0] == '\n')); seensubj = (seensubj || (!blankline && (strncmp(inbuf, "Subj", 4) == 0))); fputs(inbuf, newmsg); } #ifdef OBJECT if (!seensubj) { printf("NOTICE: Messages should have a Subject field!\n"); #ifdef REJECT unlink(fname); #endif exit(1); } #endif exit(ferror(stdin)); } if (clean) exit(0); /* * prepare to display messages */ totty = (isatty(fileno(stdout)) != 0); use_pager = use_pager && totty; snprintf(fname, sizeof(fname), "%s/%s", getenv("HOME"), MSGSRC); msgsrc = fopen(fname, "r"); if (msgsrc) { newrc = NO; fscanf(msgsrc, "%d\n", &nextmsg); fclose(msgsrc); if (nextmsg > lastmsg+1) { printf("Warning: bounds have been reset (%d, %d)\n", firstmsg, lastmsg); truncate(fname, (off_t)0); newrc = YES; } else if (!rcfirst) rcfirst = nextmsg - rcback; } else newrc = YES; msgsrc = fopen(fname, "r+"); if (msgsrc == NULL) msgsrc = fopen(fname, "w"); if (msgsrc == NULL) err(errno, "%s", fname); if (rcfirst) { if (rcfirst > lastmsg+1) { printf("Warning: the last message is number %d.\n", lastmsg); rcfirst = nextmsg; } if (rcfirst > firstmsg) firstmsg = rcfirst; /* don't set below first msg */ } if (newrc) { nextmsg = firstmsg; fseek(msgsrc, 0L, 0); fprintf(msgsrc, "%d\n", nextmsg); fflush(msgsrc); } #ifdef V7 if (totty) { struct winsize win; if (ioctl(fileno(stdout), TIOCGWINSZ, &win) != -1) Lpp = win.ws_row; if (Lpp <= 0) { if (tgetent(inbuf, getenv("TERM")) <= 0 || (Lpp = tgetnum("li")) <= 0) { Lpp = NLINES; } } } #endif Lpp -= 6; /* for headers, etc. */ already = NO; prevmsg = firstmsg; printing = YES; if (ruptible) signal(SIGINT, onintr); /* * Main program loop */ for (msg = firstmsg; msg <= lastmsg; msg++) { snprintf(fname, sizeof(fname), "%s/%d", _PATH_MSGS, msg); newmsg = fopen(fname, "r"); if (newmsg == NULL) continue; gfrsub(newmsg); /* get From and Subject fields */ if (locomode && !local) { fclose(newmsg); continue; } if (qopt) { /* This has to be located here */ printf("There are new messages.\n"); exit(0); } if (already && !hdrs) putchar('\n'); /* * Print header */ if (totty) signal(SIGTSTP, onsusp); (void) setjmp(tstpbuf); already = YES; nlines = 2; if (seenfrom) { printf("Message %d:\nFrom %s %s", msg, from, date); nlines++; } if (seensubj) { printf("Subject: %s", subj); nlines++; } else { if (seenfrom) { putchar('\n'); nlines++; } while (nlines < 6 && fgets(inbuf, sizeof inbuf, newmsg) && inbuf[0] != '\n') { fputs(inbuf, stdout); nlines++; } } lct = linecnt(newmsg); if (lct) printf("(%d%sline%s) ", lct, seensubj? " " : " more ", (lct == 1) ? "" : "s"); if (hdrs) { printf("\n-----\n"); fclose(newmsg); continue; } /* * Ask user for command */ if (totty) ask(lct? MORE : (msg==lastmsg? NOMORE : NEXT)); else inbuf[0] = 'y'; if (totty) signal(SIGTSTP, SIG_DFL); cmnd: in = inbuf; switch (*in) { case 'x': case 'X': exit(0); case 'q': case 'Q': quitit = YES; printf("--Postponed--\n"); exit(0); /* intentional fall-thru */ case 'n': case 'N': if (msg >= nextmsg) sep = "Flushed"; prevmsg = msg; break; case 'p': case 'P': use_pager = (*in++ == 'p'); /* intentional fallthru */ case '\n': case 'y': default: if (*in == '-') { msg = prevmsg-1; sep = "replay"; break; } if (isdigit(*in)) { msg = next(in); sep = in; break; } prmesg(nlines + lct + (seensubj? 1 : 0)); prevmsg = msg; } printf("--%s--\n", sep); sep = "-"; if (msg >= nextmsg) { nextmsg = msg + 1; fseek(msgsrc, 0L, 0); fprintf(msgsrc, "%d\n", nextmsg); fflush(msgsrc); } if (newmsg) fclose(newmsg); if (quitit) break; } /* * Make sure .rc file gets updated */ if (--msg >= nextmsg) { nextmsg = msg + 1; fseek(msgsrc, 0L, 0); fprintf(msgsrc, "%d\n", nextmsg); fflush(msgsrc); } if (already && !quitit && lastcmd && totty) { /* * save or reply to last message? */ msg = prevmsg; ask(NOMORE); if (inbuf[0] == '-' || isdigit(inbuf[0])) goto cmnd; } if (!(already || hush || qopt)) printf("No new messages.\n"); exit(0); }