Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.94 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdbool.h>
  4. #include <stdlib.h>
  5. #include <errno.h>
  6. #define MAX_LEN 10
  7.  
  8.  
  9. int checkInput(int * argc ,char *argv[] , FILE ** fr ){
  10. int i = 0 ;
  11.  
  12. switch (*argc )
  13. {
  14. //tail soubor
  15. case 2:
  16. *fr = fopen( argv[1], "r" );
  17. if ( fr == NULL ) {
  18. printf("Nepodarilo sa otvorit soubor. \n");
  19. return 1;
  20. }
  21. break;
  22. //tail -n +3
  23.  
  24. case 3:
  25. // -n
  26. if (strncmp("-n",argv[1],2 ) != 0 || strlen(argv[1]) != 2 ){
  27. printf("Argument %s je chybny\n",argv[1]);
  28. return 1;
  29. }
  30.  
  31. // +3
  32. while( argv[2][i] !=0){
  33. if( argv[2][i] == '1' ||
  34. argv[2][i] == '2' ||
  35. argv[2][i] == '3' ||
  36. argv[2][i] == '4' ||
  37. argv[2][i] == '5' ||
  38. argv[2][i] == '6' ||
  39. argv[2][i] == '7' ||
  40. argv[2][i] == '8' ||
  41. argv[2][i] == '9' ||
  42. argv[2][i] == '0' || (argv[2][i] == '+' && i == 0 )
  43.  
  44. ){
  45. i++;
  46. }
  47.  
  48. else{
  49. printf("zle cislo %s ", argv[2] );
  50. return 1;
  51. }
  52.  
  53. }
  54. if ( strlen(argv[2]) == 1 && argv[2][0]=='+'){
  55. printf("zle cislo %s ", argv[2] );
  56. return 1;
  57. }
  58.  
  59.  
  60. break;
  61. //tail -n +3 soubor
  62. case 4:
  63. //-n
  64. if (strncmp("-n",argv[1],2 ) != 0 || strlen(argv[1]) != 2 ){
  65. printf("Argument %s je chybny\n",argv[1]);
  66. return 1;
  67. }
  68.  
  69. // +3
  70. while( argv[2][i] !=0){
  71. if( argv[2][i] == '1' ||
  72. argv[2][i] == '2' ||
  73. argv[2][i] == '3' ||
  74. argv[2][i] == '4' ||
  75. argv[2][i] == '5' ||
  76. argv[2][i] == '6' ||
  77. argv[2][i] == '7' ||
  78. argv[2][i] == '8' ||
  79. argv[2][i] == '9' ||
  80. argv[2][i] == '0' || (argv[2][i] == '+' && i == 0 )
  81.  
  82. ){
  83. i++;
  84. }
  85.  
  86. else{
  87. printf("zle cislo %s ", argv[2] );
  88. return 1;
  89. }
  90.  
  91. }
  92. if ( strlen(argv[2]) == 1 && argv[2][0]=='+'){
  93. printf("zle cislo %s ", argv[2] );
  94. return 1;
  95. }
  96.  
  97.  
  98.  
  99. // soubor
  100. *fr = fopen( argv[3], "r" );
  101. //printf("%s",argv[3]);
  102. if ( *fr == NULL ) {
  103. printf("Nepodarilo sa otvorit soubor. \n");
  104. return 1;
  105. }
  106.  
  107. break;
  108.  
  109.  
  110. default:
  111. printf("Zly pocet argumentov \n");
  112. return 1;
  113. break;
  114. }
  115.  
  116.  
  117. return 0;
  118. }
  119.  
  120. int ignore(FILE *f, char endofline)
  121. {
  122. int character;
  123. while (((character = fgetc(f)) != endofline) && (character != EOF)) {
  124. continue;
  125. }
  126. if (character == EOF) {
  127. return 1;
  128. }
  129.  
  130. return 0;
  131. }
  132.  
  133.  
  134. int tailPrint( FILE * fr , size_t numberOfLines, bool operatorflag){
  135. //printf("%lu %d",numberOfLines, operatorflag);
  136. bool overflow = false;
  137. if ( numberOfLines == 0 && operatorflag == false ){
  138. return 0;
  139. }
  140.  
  141. if ( numberOfLines == 1 && operatorflag == true ){
  142. numberOfLines = 0;
  143. }
  144.  
  145. if ( operatorflag){
  146. int len;
  147. size_t counter = 0;
  148. char array_of_line[MAX_LEN+2];
  149. strncpy(array_of_line, "", MAX_LEN);
  150. while (fgets(array_of_line, MAX_LEN+2, fr) != NULL) {
  151. counter++;
  152.  
  153. len = strlen(array_of_line);
  154. if (array_of_line[len - 1] != '\n') {
  155. if (ignore(fr, '\n') == 0) {
  156. array_of_line[len - 1] = '\n';
  157. if ( overflow == false){
  158. //fprintf(stderr, "Prilis velka delka radku!\n");
  159. overflow = true ;
  160. }
  161. }
  162. }
  163. if (counter >= numberOfLines){
  164. printf("%s", array_of_line);
  165. }
  166.  
  167. }
  168.  
  169. }
  170.  
  171. else{
  172. // char buff[numberOfLines][MAX_LEN+2];
  173. char ** buff = (char **) calloc(numberOfLines,sizeof(char*));
  174. for( size_t i = 0 ; i < numberOfLines; i++){
  175. buff[i] = (char * ) calloc( MAX_LEN+2,sizeof(char));
  176. }
  177.  
  178. int len;
  179. size_t last = 0;
  180. int more = 0;
  181. bool overflow = false;
  182. for (size_t i = 0; i < numberOfLines; i++){
  183. strncpy(buff[i], "", MAX_LEN+2);
  184. }
  185.  
  186. while (fgets(buff[last], MAX_LEN+2, fr) != NULL) {
  187. len = strlen(buff[last]);
  188. if (buff[last][len - 1] != '\n') {
  189. if (ignore(fr, '\n') == 0) {
  190. buff[last][len - 1] = '\n';
  191. if ( overflow == false){
  192. fprintf(stderr, "Prilis velka delka radku!\n");\
  193. overflow = true ;
  194. }
  195. }
  196.  
  197. }
  198. last++;
  199. if (last == numberOfLines) {
  200. last = 0;
  201. more = 1;
  202. }
  203. }
  204. if (more == 0) {
  205.  
  206. for (size_t i = 0; i <= last; i++){
  207. printf("%s", buff[i]);
  208. }
  209. } else {
  210.  
  211. for (size_t i = last; i < numberOfLines; i++){
  212. printf("%s", buff[i]);
  213. }
  214. for (size_t i = 0; i < last; i++){
  215. printf("%s", buff[i]);
  216. }
  217. }
  218.  
  219. for ( size_t i = 0; i < numberOfLines; i++ )
  220. {
  221. free(buff[i]);
  222. }
  223.  
  224. free(buff);
  225.  
  226. }
  227.  
  228. return 0;
  229. }
  230.  
  231.  
  232.  
  233. int main( int argc, char *argv[]){
  234.  
  235. FILE * fr = NULL ;
  236. bool operatorFlag = false;
  237. size_t numberOfLines = 10 ;
  238.  
  239.  
  240. if ( checkInput(&argc, argv, &fr ) == 1 ) {
  241. return 1;
  242. }
  243.  
  244. if( argc > 2 && argv[2][0] == '+' ){
  245. operatorFlag = true;
  246. }
  247.  
  248. if (argc > 2 ){
  249. if ( sscanf( argv[2],"%lu", &numberOfLines) != 1 ){
  250. return 1;
  251. }
  252. }
  253.  
  254.  
  255. switch (argc)
  256. {
  257. case 2:
  258.  
  259. tailPrint(fr , 10 , false );
  260. /* code */
  261. break;
  262. case 3:
  263.  
  264. // std in
  265. tailPrint(stdin,numberOfLines , operatorFlag);
  266.  
  267. break;
  268. case 4:
  269.  
  270. tailPrint( fr , numberOfLines, operatorFlag );
  271.  
  272. break;
  273. default:
  274. break;
  275. }
  276.  
  277.  
  278. if ( fr != NULL){
  279. fclose(fr);
  280. }
  281.  
  282. return 0;
  283. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement