Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdbool.h>
- #include <stdlib.h>
- #include <errno.h>
- #define MAX_LEN 10
- int checkInput(int * argc ,char *argv[] , FILE ** fr ){
- int i = 0 ;
- switch (*argc )
- {
- //tail soubor
- case 2:
- *fr = fopen( argv[1], "r" );
- if ( fr == NULL ) {
- printf("Nepodarilo sa otvorit soubor. \n");
- return 1;
- }
- break;
- //tail -n +3
- case 3:
- // -n
- if (strncmp("-n",argv[1],2 ) != 0 || strlen(argv[1]) != 2 ){
- printf("Argument %s je chybny\n",argv[1]);
- return 1;
- }
- // +3
- while( argv[2][i] !=0){
- if( argv[2][i] == '1' ||
- argv[2][i] == '2' ||
- argv[2][i] == '3' ||
- argv[2][i] == '4' ||
- argv[2][i] == '5' ||
- argv[2][i] == '6' ||
- argv[2][i] == '7' ||
- argv[2][i] == '8' ||
- argv[2][i] == '9' ||
- argv[2][i] == '0' || (argv[2][i] == '+' && i == 0 )
- ){
- i++;
- }
- else{
- printf("zle cislo %s ", argv[2] );
- return 1;
- }
- }
- if ( strlen(argv[2]) == 1 && argv[2][0]=='+'){
- printf("zle cislo %s ", argv[2] );
- return 1;
- }
- break;
- //tail -n +3 soubor
- case 4:
- //-n
- if (strncmp("-n",argv[1],2 ) != 0 || strlen(argv[1]) != 2 ){
- printf("Argument %s je chybny\n",argv[1]);
- return 1;
- }
- // +3
- while( argv[2][i] !=0){
- if( argv[2][i] == '1' ||
- argv[2][i] == '2' ||
- argv[2][i] == '3' ||
- argv[2][i] == '4' ||
- argv[2][i] == '5' ||
- argv[2][i] == '6' ||
- argv[2][i] == '7' ||
- argv[2][i] == '8' ||
- argv[2][i] == '9' ||
- argv[2][i] == '0' || (argv[2][i] == '+' && i == 0 )
- ){
- i++;
- }
- else{
- printf("zle cislo %s ", argv[2] );
- return 1;
- }
- }
- if ( strlen(argv[2]) == 1 && argv[2][0]=='+'){
- printf("zle cislo %s ", argv[2] );
- return 1;
- }
- // soubor
- *fr = fopen( argv[3], "r" );
- //printf("%s",argv[3]);
- if ( *fr == NULL ) {
- printf("Nepodarilo sa otvorit soubor. \n");
- return 1;
- }
- break;
- default:
- printf("Zly pocet argumentov \n");
- return 1;
- break;
- }
- return 0;
- }
- int ignore(FILE *f, char endofline)
- {
- int character;
- while (((character = fgetc(f)) != endofline) && (character != EOF)) {
- continue;
- }
- if (character == EOF) {
- return 1;
- }
- return 0;
- }
- int tailPrint( FILE * fr , size_t numberOfLines, bool operatorflag){
- //printf("%lu %d",numberOfLines, operatorflag);
- bool overflow = false;
- if ( numberOfLines == 0 && operatorflag == false ){
- return 0;
- }
- if ( numberOfLines == 1 && operatorflag == true ){
- numberOfLines = 0;
- }
- if ( operatorflag){
- int len;
- size_t counter = 0;
- char array_of_line[MAX_LEN+2];
- strncpy(array_of_line, "", MAX_LEN);
- while (fgets(array_of_line, MAX_LEN+2, fr) != NULL) {
- counter++;
- len = strlen(array_of_line);
- if (array_of_line[len - 1] != '\n') {
- if (ignore(fr, '\n') == 0) {
- array_of_line[len - 1] = '\n';
- if ( overflow == false){
- //fprintf(stderr, "Prilis velka delka radku!\n");
- overflow = true ;
- }
- }
- }
- if (counter >= numberOfLines){
- printf("%s", array_of_line);
- }
- }
- }
- else{
- // char buff[numberOfLines][MAX_LEN+2];
- char ** buff = (char **) calloc(numberOfLines,sizeof(char*));
- for( size_t i = 0 ; i < numberOfLines; i++){
- buff[i] = (char * ) calloc( MAX_LEN+2,sizeof(char));
- }
- int len;
- size_t last = 0;
- int more = 0;
- bool overflow = false;
- for (size_t i = 0; i < numberOfLines; i++){
- strncpy(buff[i], "", MAX_LEN+2);
- }
- while (fgets(buff[last], MAX_LEN+2, fr) != NULL) {
- len = strlen(buff[last]);
- if (buff[last][len - 1] != '\n') {
- if (ignore(fr, '\n') == 0) {
- buff[last][len - 1] = '\n';
- if ( overflow == false){
- fprintf(stderr, "Prilis velka delka radku!\n");\
- overflow = true ;
- }
- }
- }
- last++;
- if (last == numberOfLines) {
- last = 0;
- more = 1;
- }
- }
- if (more == 0) {
- for (size_t i = 0; i <= last; i++){
- printf("%s", buff[i]);
- }
- } else {
- for (size_t i = last; i < numberOfLines; i++){
- printf("%s", buff[i]);
- }
- for (size_t i = 0; i < last; i++){
- printf("%s", buff[i]);
- }
- }
- for ( size_t i = 0; i < numberOfLines; i++ )
- {
- free(buff[i]);
- }
- free(buff);
- }
- return 0;
- }
- int main( int argc, char *argv[]){
- FILE * fr = NULL ;
- bool operatorFlag = false;
- size_t numberOfLines = 10 ;
- if ( checkInput(&argc, argv, &fr ) == 1 ) {
- return 1;
- }
- if( argc > 2 && argv[2][0] == '+' ){
- operatorFlag = true;
- }
- if (argc > 2 ){
- if ( sscanf( argv[2],"%lu", &numberOfLines) != 1 ){
- return 1;
- }
- }
- switch (argc)
- {
- case 2:
- tailPrint(fr , 10 , false );
- /* code */
- break;
- case 3:
- // std in
- tailPrint(stdin,numberOfLines , operatorFlag);
- break;
- case 4:
- tailPrint( fr , numberOfLines, operatorFlag );
- break;
- default:
- break;
- }
- if ( fr != NULL){
- fclose(fr);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement