5.13.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /** this one is buggy but does work for small input.
  2. */
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. int getfine(char* s);
  6. /* getline: read a line into s, return length */
  7. int getfine(char* s)
  8. {
  9. int c, i;
  10. for (i=0; ((c=getchar())!=EOF) && c!='\n'; i++)
  11. {
  12. *s = c;
  13. s++;
  14. }
  15. if (c == '\n')
  16. {
  17. *s = 0;
  18. ++i;
  19. }
  20. //printf("%d : len \n",i);
  21. return i-1;
  22. }
  23. int LINES=-1; // everything by default.
  24. int MAXLINES=100000;
  25. int main(int argc, char *argv[])
  26. {
  27. char *lineptr[MAXLINES];
  28. // while (argv!=0 && *argv!=0)
  29. // {argv--;}
  30. // -m
  31. argv++;
  32. if (argc > 1)
  33. {
  34. while (argv!=0 && *argv!=0)
  35. {
  36. if ((*argv)[0]=='-' && (*argv)[1]=='n')
  37. {
  38. argv++;
  39. LINES=atoi(*argv);
  40. break;
  41. }
  42. }
  43. }
  44. int ret=0;
  45. int i =0;
  46. for (; ; i++)
  47. {
  48. char *line = malloc(sizeof(char)*1000);
  49. ret=getfine(line);
  50. if (ret==0) break; //eof
  51. lineptr[i]=line;
  52. }
  53. for (int j=0;j<i ; j++)
  54. {
  55. if ( j>=i-LINES || (LINES<0))
  56. {
  57. printf("%s\n",lineptr[j]);
  58. free(lineptr[j]);
  59. continue;
  60. }
  61. if ( (j<=i-LINES) )
  62. {
  63. free(lineptr[j]);
  64. }
  65. }
  66. }