Advertisement
InnadrilCastle

Untitled

Jan 15th, 2022
1,044
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.25 KB | None | 0 0
  1. /*****************************************************************************************************************
  2.  *                                                                                                               *
  3.  * Write a program to "fold" long input lines into two or more shorter lines after the last non-blank character  *
  4.  * that occurs before the n-th column of input. Make sure your program does something intelligent with very long *
  5.  * lines, and if there are no blanks or tabs before the specified column.                                        *
  6.  *                                                                                                               *
  7.  *****************************************************************************************************************/
  8.  
  9. #include <stdio.h>
  10.  
  11. #define MAXLINE 80                                              /* maximalna dlzka riadka pred pokusom o zalomenie */
  12. #define TABSIZE 8
  13. #define NLYES 1                                                 /* funkcia printBuffer() ma tlacit aj '\n' */
  14. #define NLNO 0                                                  /* funkcia printBuffer() nema tlacit aj '\n' */
  15.  
  16. int getBuffer(s, start)                                         /* funkcia ocakava pole znakov, do ktoreho od pozicie s[start] nacita znaky az do pozicie s[MAXLINE-1] */
  17. char s[];                                                       /* deklaracia lokalnych premennych */
  18. int start;
  19. {
  20.         while (start < MAXLINE) {                               /* kym sa nedostaneme az na posledny index pola s[] */
  21.                 s[start] = getchar();                           /* nacitame znak */
  22.                 if (s[start] == EOF || s[start] == '\n') {      /* sme EOF alebo '\n'? */
  23.                         ++start;                                /* ano, tak posunieme index za posledny zapisany znak */
  24.                         break;                                  /* a vyskocime z cyklu "while (start < MAXLINE)" */
  25.                 }
  26.                 else if (s[start] == '\t')                      /* sme tabulator? */
  27.                         if ((start + TABSIZE) >= MAXLINE) {     /* ano, tak dostaneme sa s tabulaorovou dlzkou TABSIZE na aktualnej pozicii v riadku za MAXLINE dlzku? */
  28.                                 s[start++] = '\n';              /* ano, tak nahradime tabulator novym riadkom, posunieme index start za posledny zapisany znak */
  29.                                 break;                          /* a zabezpecime vyskocenie z cyklu "while (start < MAXLINE)" */
  30.                         }
  31.                 ++start;                                        /* nie sme EOF ani '\n', tak posunieme index na dalsiu poziciu s[] */
  32.         }
  33.         return(start);                                          /* vratime index, ktory ukazuje za posledny zapisany znak do s[] */
  34. }
  35.  
  36. void printBuffer(s, goal, nl)                                   /* funkcia vytlaci znaky od s[0] az po s[goal]. Podla hodnoty "nl" nasledne moze vytlacit znak '\n' */
  37. char s[];                                                       /* deklaracia lokalnych premennych */
  38. int goal, nl;
  39. {
  40.         int i = 0;                                              /* vzdialenost od zaciatku s[] nastavime na nulu */
  41.  
  42.         while (i <= goal)                                       /* kym sa nedostaneme az na s[goal] */
  43.                 putchar(s[i++]);                                /* vytlacime dany znak a posunieme sa vo vzdialenosti od zaciatku s[] */
  44.         if (nl == NLYES)                                        /* ak sme dostali ako paramter NLYES, vytlacime aj '\n' */
  45.                 putchar('\n');
  46. }
  47.  
  48. int main(void) {
  49.         char buffer[MAXLINE];                                   /* alokujeme si pole znakov o dlzke MAXLINE */
  50.         int loaded = 1;                                         /* zabezpecime uvodne zbehnutie cyklu "while (loaded != 0)" */
  51.         int i = 0;                                              /* vzdialenost od zaciatku pola buffer[] */
  52.         int j = 0;                                              /* vzdialenost od zaciatku pola buffer[] */
  53.  
  54.         while (loaded != 0) {                                   /* nekonecny cyklus, funkcne pobezykym nedetegujeme EOF */
  55.                 loaded = getBuffer(buffer, i);                  /* getBuffer() poviem nech zapise od buffer[i] po buffer[MAXLINE] znaky, vrateny loaded ukazuje "za" posledny zapisany znak do buffer[] */
  56.                 if (loaded < MAXLINE)                           /* skoncila funkcia getBuffer() skor, nez zaplnila cely buffer[MAXLINE] ? */
  57.                         if (buffer[--loaded] != '\n')                   /* nacitali sme menej ako MAXLINE znakov a posledny znak nie je '\n'? */
  58.                                 loaded = 0;                             /* tak to potom prislo EOF, zabezpecime vyskocenie z "while (loaded != 0)" */
  59.                         else {
  60.                                 printBuffer(buffer, loaded, NLNO);      /* dostali sme menej ako MAXLINE znakov a nasledny '\n', tak to vypiseme */
  61.                                 i = 0;                                  /* nastavime ukazovatel na zaciatok riadku */
  62.                                 loaded = 1;
  63.                         }
  64.                 else {                                          /* dostali sme buffer naplneny az po MAXLINE */
  65.                         i = MAXLINE;                            /* nastavime sa "za" posledny znak pola buffer[], aby sme mohli prehladavat jeho polozky odzadu */
  66.                         while (--i >= 0)                        /* budeme odzadu prechadzat celu dlzku pola buffer[] */
  67.                                 if (buffer[i] == '\t' || buffer[i] == ' ')      /* sme biely znak? */
  68.                                         break;                                  /* ano, tak vyskocme z "while (--i >= 0)" */
  69.                         if (i > 0) {                            /* skoncil "while (--i >= 0)" skor, nez sme prisli na zaciatok buffer[]? */
  70.                                 printBuffer(buffer, i++, NLYES);/* ano, takze sme nasli biely znak, tak vytlacme vsetko od zaciatku az po ten biely znak, i posunme na prvy nepouzity znak z buffer[] */
  71.                                 j = 0;
  72.                                 while (i < MAXLINE)                     /* mame nacitany buffer az do MAXLINE, v buffer[i] je pozicia prveho este nepouziteho znaku */
  73.                                         buffer[j++] = buffer[i++];      /* od buffer[0] postupne dalej kopirujeme este nepouzite znaky od buffer[i] */
  74.                                 i = j;                                  /* i ukazuje na prve pole buffer[], kde je uz buffer[] pripraveny na zapis */
  75.                         }
  76.                         else {                                  /* v buffer[MAXSIZE] sme biely znak nenasli */
  77.                                 printBuffer(buffer, loaded, NLNO);      /* tak vytlacime cely buffer ... */
  78.                                 while ((buffer[0] = getchar()) != EOF)  /* ... a kym nenacitame EOF alebo biely znak, budeme nacitavat a tlacit, co dostaneme */
  79.                                         if (buffer[0] == '\t' || buffer[0] == '\n' || buffer[0] == ' ')
  80.                                                 break;
  81.                                         else
  82.                                                 putchar(buffer[0]);
  83.                                 if (buffer[0] == '\t' || buffer[0] == '\n' || buffer[0] == ' ') {       /* vyskocili sme z "while ((buffer[0] = getchar()) != EOF)" pre biely znak? */
  84.                                         putchar('\n');                                                  /* ano, tak vytlacime '\n' */
  85.                                         i = 0;                                                          /* nastavime sa na zaciatok riadku */
  86.                                 }
  87.                                 else                                                                    /* nie, takze musel prist EOF */
  88.                                         loaded = 0;                                                     /* tak zabezpecime vyskocenie z "while (loaded != 0)" */
  89.                         }
  90.                 }
  91.         }
  92.         return 0;                                               /* slusne sa rozlucime */
  93. }
  94.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement