SHARE
TWEET

Untitled

a guest Dec 16th, 2018 55 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #ifndef __PROGTEST__
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <ctype.h>
  6. #include <assert.h>
  7. #endif /* __PROGTEST__ */
  8.  
  9. int getNextWordLength(const char * src){
  10.     int i;
  11.     for (i = 0; (src[i] != ' ') && (src[i] != '\n') && (src[i] != '\0'); i++){}
  12.     return i;
  13. }
  14.  
  15.  
  16. char * wordWrap ( int width, const char * src )
  17. {
  18.     char *temp = (char *) calloc(strlen(src), sizeof(char));
  19.  
  20.     for (unsigned int i = 0; i < strlen(src); i++){
  21.         if (src[i] == '\t')
  22.             temp[i] = ' ';
  23.         else
  24.             temp[i] = src[i];
  25.     }
  26.     char *str = (char *) calloc(strlen(src), sizeof(char));
  27.     // x is the index where we put the next letter
  28.     int x = 0;
  29.     int widthRemaining = width;
  30.     int realNewLine = 0;
  31.  
  32.     for (int i = 0; temp[i] != '\0'; i++){
  33.         char currentLetter = temp[i];
  34.         char lastLetter = temp[i-1];
  35.         char nextLetter = temp[i+1];
  36.  
  37.         if (currentLetter== '\t')
  38.             currentLetter = ' ';
  39.  
  40.         if (currentLetter == '\n'){
  41.             if ((widthRemaining != width)){
  42.                 if (!(((currentLetter == '\n') && (lastLetter == '\n')) || ((currentLetter == '\n') && (nextLetter == '\n')))){
  43.                     str[x] = ' ';
  44.                     x++;
  45.                     widthRemaining--;
  46.  
  47.                 }
  48.                 if (lastLetter == '\n' && nextLetter != '\n') {
  49.                     str[x] = '\n';
  50.                     x++;
  51.                     str[x] = '\n';
  52.                     x++;
  53.                     widthRemaining = width;
  54.                 }
  55.  
  56.                 continue;
  57.             }
  58.             else if ((lastLetter == '\n') || (nextLetter != '\n')){
  59.                 continue;
  60.             }
  61.             else{
  62.                 str[x] = '\n';
  63.                 x++;
  64.                 str[x] = '\n';
  65.                 x++;
  66.                 continue;
  67.             }
  68.         }
  69.  
  70.  
  71.         if (currentLetter == ' '){
  72.             if ((lastLetter == ' ') || (nextLetter == '\n') || (lastLetter == '\n')){
  73.                 continue;
  74.             }
  75.  
  76.             str[x] = currentLetter;
  77.             x++;
  78.             widthRemaining--;
  79.         }
  80.  
  81.         //Start of new word
  82.         else if (currentLetter != ' '){
  83.             //Get length of next word
  84.             int nextWordLength = getNextWordLength(temp+i);
  85.  
  86.             //If a word is too big for any line return null
  87.             if (nextWordLength > width)
  88.                 return NULL;
  89.  
  90.             // If the word fits on the line, add it and move i
  91.             if (nextWordLength <= widthRemaining){
  92.                 for (int z = 0; z < nextWordLength; z++){
  93.                     //str = (char *) realloc(str, (x+1));
  94.                     str[x+z] = temp[i+z];
  95.                     widthRemaining--;
  96.                 }
  97.                 i += nextWordLength-1;
  98.                 x += nextWordLength;
  99.                 realNewLine = 0;
  100.             }
  101.             // If it doesn't fit, add a newline character
  102.             else{
  103.                 if ((lastLetter == ' ') || (!realNewLine))
  104.                     x--;
  105.                 str[x] = '\n';
  106.                 realNewLine = 1;
  107.                 x++;
  108.                 i--;
  109.                 widthRemaining = width;
  110.             }
  111.         }
  112.  
  113.     }
  114.  
  115.     int y = x;
  116.     for (int p = 1; str[y-p] == '\n' || str[y-p] == ' '; p++)
  117.         x--;
  118.     str[x] = '\n';
  119.     str[x+1] = '\0';
  120.  
  121.     //str = (char*)realloc(str, 682* 4);
  122.  
  123.     return str;
  124. }
  125.  
  126.  
  127. #ifndef __PROGTEST__
  128. int                main                                     ( void )
  129. {
  130.   char * res;
  131.   const char * s0 =
  132.     "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer metus\n"
  133.     "pede, pretium vitae, rhoncus et, auctor sit amet, ligula. Integer volutpat\n"
  134.     "orci et elit. Nunc tempus, urna at sollicitudin rutrum, arcu libero rhoncus\n"
  135.     "lectus, vitae feugiat purus orci ultricies turpis. Pellentesque habitant\n"
  136.     "morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam\n"
  137.     "in pede. Etiam eu sem id urna ultricies congue. Vestibulum porttitor\n"
  138.     "ultrices neque. Mauris semper, mauris ut feugiat ultricies, augue purus\n"
  139.     "tincidunt  elit, eu interdum ante nisl ac ante. Pellentesque dui. Vestibulum\n"
  140.     "pretium, augue non cursus pretium, nibh dolor laoreet leo, sed pharetra pede\n"
  141.     "libero non diam.";
  142.  
  143.   const char * s1 =
  144.     "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer metus\n"
  145.     "pede, pretium vitae, rhoncus et, auctor sit amet, ligula. Integer volutpat\n"
  146.     "orci et elit. Nunc tempus, urna at sollicitudin rutrum, arcu libero rhoncus\n"
  147.     "lectus, vitae feugiat purus orci ultricies turpis. Pellentesque habitant\n"
  148.     "morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam\n"
  149.     "in pede. Etiam eu sem id urna ultricies congue. Vestibulum porttitor\n"
  150.     "ultrices neque. Mauris semper, mauris ut feugiat ultricies, augue purus\n"
  151.     "tincidunt  elit, eu interdum ante nisl ac ante. Pellentesque dui. Vestibulum\n"
  152.     "pretium, augue non cursus pretium, nibh\tdolor laoreet leo, sed pharetra pede\n"
  153.     "libero non diam.\n"
  154.     "\n"
  155.     "Proin est nisi,                     gravida ac, vulputate id, fringilla sit\n"
  156.     "amet, magna. Nam congue cursus magna. In malesuada, velit a gravida sodales,\n"
  157.     "dolor nisl vestibulum orci, sit amet sagittis mauris tellus nec purus. Nulla\n"
  158.     "eget risus. Quisque nec sapien blandit odio convallis ullamcorper. Lorem\n"
  159.     "ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque cursus.\n"
  160.     "Aliquam tempus neque vitae libero molestie ut auctor.\n"
  161.     "\n"
  162.     "\n"
  163.     "\n"
  164.     "In nec massa eu tortor vulputate suscipit.\tNam tristique magna nec pede. Sed\n"
  165.     "a nisi. Nulla sed augue ut risus placerat porttitor. Ut aliquam. Nulla\n"
  166.     "facilisi. Nulla vehicula nibh ac sapien. Nunc facilisis dapibus ipsum. Donec\n"
  167.     "sed mauris. Nulla quam nisi, laoreet non, dignissim posuere, lacinia nec,\n"
  168.     "turpis. Mauris malesuada nisi sed enim. In hac habitasse platea dictumst.\n"
  169.     "Fusce    faucibus, turpis nec auctor posuere, nulla tellus scelerisque metus,\n"
  170.     "quis molestie mi dui id quam. Mauris vestibulum. Nam ullamcorper.\n"
  171.     "\n";
  172.   res = wordWrap ( 40, s0 );
  173.  
  174.   assert ( ! strcmp ( res,
  175.     "Lorem ipsum dolor sit amet, consectetuer\n"
  176.     "adipiscing elit. Integer metus pede,\n"
  177.     "pretium vitae, rhoncus et, auctor sit\n"
  178.     "amet, ligula. Integer volutpat orci et\n"
  179.     "elit. Nunc tempus, urna at sollicitudin\n"
  180.     "rutrum, arcu libero rhoncus lectus,\n"
  181.     "vitae feugiat purus orci ultricies\n"
  182.     "turpis. Pellentesque habitant morbi\n"
  183.     "tristique senectus et netus et malesuada\n"
  184.     "fames ac turpis egestas. Nam in pede.\n"
  185.     "Etiam eu sem id urna ultricies congue.\n"
  186.     "Vestibulum porttitor ultrices neque.\n"
  187.     "Mauris semper, mauris ut feugiat\n"
  188.     "ultricies, augue purus tincidunt elit,\n"
  189.     "eu interdum ante nisl ac ante.\n"
  190.     "Pellentesque dui. Vestibulum pretium,\n"
  191.     "augue non cursus pretium, nibh dolor\n"
  192.     "laoreet leo, sed pharetra pede libero\n"
  193.     "non diam.\n" ) );
  194.   free ( res );
  195.  
  196.   res = wordWrap ( 120, s0 );
  197.   assert ( ! strcmp ( res,
  198.     "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer metus pede, pretium vitae, rhoncus et, auctor sit\n"
  199.     "amet, ligula. Integer volutpat orci et elit. Nunc tempus, urna at sollicitudin rutrum, arcu libero rhoncus lectus, vitae\n"
  200.     "feugiat purus orci ultricies turpis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac\n"
  201.     "turpis egestas. Nam in pede. Etiam eu sem id urna ultricies congue. Vestibulum porttitor ultrices neque. Mauris semper,\n"
  202.     "mauris ut feugiat ultricies, augue purus tincidunt elit, eu interdum ante nisl ac ante. Pellentesque dui. Vestibulum\n"
  203.     "pretium, augue non cursus pretium, nibh dolor laoreet leo, sed pharetra pede libero non diam.\n" ) );
  204.   free ( res );
  205.  
  206.   res = wordWrap ( 10, s1 );
  207.   assert ( res == NULL );
  208.  
  209.   res = wordWrap ( 40, s1 );
  210.   assert ( ! strcmp ( res,
  211.     "Lorem ipsum dolor sit amet, consectetuer\n"
  212.     "adipiscing elit. Integer metus pede,\n"
  213.     "pretium vitae, rhoncus et, auctor sit\n"
  214.     "amet, ligula. Integer volutpat orci et\n"
  215.     "elit. Nunc tempus, urna at sollicitudin\n"
  216.     "rutrum, arcu libero rhoncus lectus,\n"
  217.     "vitae feugiat purus orci ultricies\n"
  218.     "turpis. Pellentesque habitant morbi\n"
  219.     "tristique senectus et netus et malesuada\n"
  220.     "fames ac turpis egestas. Nam in pede.\n"
  221.     "Etiam eu sem id urna ultricies congue.\n"
  222.     "Vestibulum porttitor ultrices neque.\n"
  223.     "Mauris semper, mauris ut feugiat\n"
  224.     "ultricies, augue purus tincidunt elit,\n"
  225.     "eu interdum ante nisl ac ante.\n"
  226.     "Pellentesque dui. Vestibulum pretium,\n"
  227.     "augue non cursus pretium, nibh dolor\n"
  228.     "laoreet leo, sed pharetra pede libero\n"
  229.     "non diam.\n"
  230.     "\n"
  231.     "Proin est nisi, gravida ac, vulputate\n"
  232.     "id, fringilla sit amet, magna. Nam\n"
  233.     "congue cursus magna. In malesuada, velit\n"
  234.     "a gravida sodales, dolor nisl vestibulum\n"
  235.     "orci, sit amet sagittis mauris tellus\n"
  236.     "nec purus. Nulla eget risus. Quisque nec\n"
  237.     "sapien blandit odio convallis\n"
  238.     "ullamcorper. Lorem ipsum dolor sit amet,\n"
  239.     "consectetuer adipiscing elit.\n"
  240.     "Pellentesque cursus. Aliquam tempus\n"
  241.     "neque vitae libero molestie ut auctor.\n"
  242.     "\n"
  243.     "In nec massa eu tortor vulputate\n"
  244.     "suscipit. Nam tristique magna nec pede.\n"
  245.     "Sed a nisi. Nulla sed augue ut risus\n"
  246.     "placerat porttitor. Ut aliquam. Nulla\n"
  247.     "facilisi. Nulla vehicula nibh ac sapien.\n"
  248.     "Nunc facilisis dapibus ipsum. Donec sed\n"
  249.     "mauris. Nulla quam nisi, laoreet non,\n"
  250.     "dignissim posuere, lacinia nec, turpis.\n"
  251.     "Mauris malesuada nisi sed enim. In hac\n"
  252.     "habitasse platea dictumst. Fusce\n"
  253.     "faucibus, turpis nec auctor posuere,\n"
  254.     "nulla tellus scelerisque metus, quis\n"
  255.     "molestie mi dui id quam. Mauris\n"
  256.     "vestibulum. Nam ullamcorper.\n" ) );
  257.   free ( res );
  258.  
  259.   res = wordWrap ( 80, s1 );
  260.   assert ( ! strcmp ( res,
  261.     "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer metus pede,\n"
  262.     "pretium vitae, rhoncus et, auctor sit amet, ligula. Integer volutpat orci et\n"
  263.     "elit. Nunc tempus, urna at sollicitudin rutrum, arcu libero rhoncus lectus,\n"
  264.     "vitae feugiat purus orci ultricies turpis. Pellentesque habitant morbi tristique\n"
  265.     "senectus et netus et malesuada fames ac turpis egestas. Nam in pede. Etiam eu\n"
  266.     "sem id urna ultricies congue. Vestibulum porttitor ultrices neque. Mauris\n"
  267.     "semper, mauris ut feugiat ultricies, augue purus tincidunt elit, eu interdum\n"
  268.     "ante nisl ac ante. Pellentesque dui. Vestibulum pretium, augue non cursus\n"
  269.     "pretium, nibh dolor laoreet leo, sed pharetra pede libero non diam.\n"
  270.     "\n"
  271.     "Proin est nisi, gravida ac, vulputate id, fringilla sit amet, magna. Nam congue\n"
  272.     "cursus magna. In malesuada, velit a gravida sodales, dolor nisl vestibulum orci,\n"
  273.     "sit amet sagittis mauris tellus nec purus. Nulla eget risus. Quisque nec sapien\n"
  274.     "blandit odio convallis ullamcorper. Lorem ipsum dolor sit amet, consectetuer\n"
  275.     "adipiscing elit. Pellentesque cursus. Aliquam tempus neque vitae libero molestie\n"
  276.     "ut auctor.\n"
  277.     "\n"
  278.     "In nec massa eu tortor vulputate suscipit. Nam tristique magna nec pede. Sed a\n"
  279.     "nisi. Nulla sed augue ut risus placerat porttitor. Ut aliquam. Nulla facilisi.\n"
  280.     "Nulla vehicula nibh ac sapien. Nunc facilisis dapibus ipsum. Donec sed mauris.\n"
  281.     "Nulla quam nisi, laoreet non, dignissim posuere, lacinia nec, turpis. Mauris\n"
  282.     "malesuada nisi sed enim. In hac habitasse platea dictumst. Fusce faucibus,\n"
  283.     "turpis nec auctor posuere, nulla tellus scelerisque metus, quis molestie mi dui\n"
  284.     "id quam. Mauris vestibulum. Nam ullamcorper.\n" ) );
  285.   free ( res );
  286.  
  287.   return 0;
  288. }
  289. #endif /* __PROGTEST__ */
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top