RicardasSim

trying count lines from memory buffer

Jul 2nd, 2019
731
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.64 KB | None | 0 0
  1. //-std=c99 -Wall -Wextra -Wpedantic -Wshadow
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <stdbool.h>
  6.  
  7. int main () {
  8.  
  9.     FILE *fp;
  10.     unsigned int fileSize;
  11.     char *buffer;
  12.     size_t result;
  13.     unsigned int numOfLines = 0;
  14.     char *cur, *end;
  15.     bool befNotEmpty = false;
  16.    
  17.     //#define STRSIZE 1024
  18.     //static char str[STRSIZE];
  19.    
  20.     fp = fopen("file.txt" , "r");
  21.    
  22.     if(fp == NULL)
  23.     {
  24.         printf("Error opening file");
  25.         return -1;
  26.     }
  27.    
  28. /*
  29. if(fseek(fp, 0L, SEEK_SET) != 0 )
  30. {
  31.   //Handle error
  32. }
  33. */  
  34.  
  35.     //obtain file size:
  36.     fseek(fp, 0 , SEEK_END);
  37.     fileSize = ftell(fp);
  38.     fseek(fp, 0, SEEK_SET);
  39.    
  40.     buffer = malloc(fileSize);
  41.  
  42.     if (buffer == NULL)
  43.     {
  44.         fclose(fp);
  45.         printf("Memory error\n");
  46.         return -1;
  47.     }
  48.  
  49.     result = fread(buffer, 1, fileSize, fp);
  50.  
  51.     if(result != fileSize)
  52.     {
  53.         free(buffer);
  54.         fclose(fp);
  55.         printf("Reading error\n");
  56.         return -1;
  57.     }
  58.  
  59.     /*
  60.         OD
  61.         OA
  62.         ODOA
  63.        
  64.         0A0D
  65.  
  66.         0A0A0A0A..., 0D0D0D0D...        
  67.  
  68.         can be badly formatted
  69.        
  70.         can end without line terminator
  71.  
  72.     */
  73.  
  74.     end = buffer + fileSize;
  75.     cur = buffer;
  76.    
  77.     while(1)
  78.     {
  79.         if(!(end-cur))
  80.         {
  81.             if(befNotEmpty) numOfLines++;
  82.             break;
  83.         }
  84.        
  85.         if(*cur == '\r')
  86.         {
  87.             befNotEmpty = false;
  88.             numOfLines++;
  89.            
  90.             if (++cur < end)
  91.             {
  92.                 if(*cur == '\n')
  93.                 {
  94.                     cur++;
  95.                     continue;
  96.                 }
  97.                 else if(*cur == '\r')
  98.                 {
  99.                     numOfLines++;
  100.                     cur++;
  101.                     continue;
  102.                 }
  103.             }
  104.             else break;
  105.         }
  106.         else if(*cur == '\n')
  107.         {
  108.             befNotEmpty = false;
  109.             numOfLines++;
  110.            
  111.             if (++cur < end)
  112.             {
  113.                 if(*cur == '\r')
  114.                 {
  115.                     cur++;
  116.                     continue;
  117.                 }
  118.                 else if(*cur == '\n')
  119.                 {
  120.                     numOfLines++;
  121.                     cur++;
  122.                     continue;
  123.                 }
  124.             }
  125.             else break;            
  126.         }
  127.         else befNotEmpty = true;
  128.        
  129.         cur++;
  130.     }
  131.  
  132.  
  133.  
  134.     printf("Number of lines: %d\n", numOfLines);
  135.    
  136.     free(buffer);
  137.     fclose(fp);
  138.  
  139.     printf("Bye bye.\n");
  140.    
  141.     return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment