home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.c      Meh, in C you gotta define EVERYTHING      243,242 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 242,465 of 243,242   
   Bonita Montero to All   
   Re: is_binary_file()   
   16 Dec 25 17:24:49   
   
   From: Bonita.Montero@gmail.com   
      
   How long have you been dealing with that ? 10 days ?   
   I finished the AVX-512 version in C++ in two hours.   
      
   Am 16.12.2025 um 01:26 schrieb Michael Sanders:   
   > On Fri, 12 Dec 2025 15:33:01 -0800, Chris M. Thomasson wrote:   
   >   
   >> define the probability? Say in 0...1?   
   > Probabilities for Chris... Enjoy.   
   >   
   > #include    
   > #include    
   > #include    
   >   
   > /*   
   >   * map_strict[]   
   >   *   
   >   * Valid bytes:   
   >   *   - ASCII printable: 0x20–0x7E   
   >   *   - ISO-8859-1 high printable: 0xA0–0xFF   
   >   *   - Whitespace: TAB (0x09), LF (0x0A), CR (0x0D)   
   >   *   
   >   * Invalid bytes (binary indicators):   
   >   *   - NULL byte (0x00)   
   >   *   - C0 controls (0x01–0x08, 0x0B–0x0C, 0x0E–0x1F)   
   >   *   - DEL (0x7F)   
   >   *   - C1 controls (0x80–0x9F)   
   >   */   
   >   
   > static const uint8_t map_strict[256] = {   
   >      0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0, // 00   
   >      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 10   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 20   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 30   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 40   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 50   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 60   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, // 70   
   >      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 80   
   >      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 90   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // A0   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // B0   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // C0   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // D0   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // E0   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1  // F0   
   > };   
   >   
   > /*   
   >   * map_loose[]   
   >   *   
   >   * Valid bytes:   
   >   *   - ASCII printable characters: 0x20–0x7E   
   >   *   - Whitespace: TAB (0x09), LF (0x0A), CR (0x0D)   
   >   *   - High bytes: 0x80–0xFF   
   >   *   
   >   * Invalid bytes (binary indicators):   
   >   *   - NULL byte: 0x00   
   >   *   - C0 control codes: 0x01–0x08, 0x0B–0x0C, 0x0E–0x1F   
   >   *   - DEL character: 0x7F   
   >   */   
   >   
   > static const uint8_t map_loose[256] = {   
   >      0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0, // 00   
   >      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 10   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 20   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 30   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 40   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 50   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 60   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 70   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 80   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 90   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // A0   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // B0   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // C0   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // D0   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // E0   
   >      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1  // F0   
   > };   
   >   
   > /*   
   >   * is_text_file(const char *path, const uint8_t map[256], double   
   probability)   
   >   *   
   >   * Determines whether a file is likely a text file driven by a byte map   
   >   * & probability threshold.   
   >   *   
   >   * Signature:   
   >   *   
   >   *   path   
   >   *     Pathname of the file to examine. The function follows symlinks   
   >   *     & only operates on regular files.   
   >   *   
   >   *   map[256]   
   >   *     A 256-entry lookup table indexed by byte value (0–255).   
   >   *     Each entry must be either:   
   >   *       1 -> byte is considered valid text   
   >   *       0 -> byte is considered invalid (binary indicator)   
   >   *   
   >   *   probability   
   >   *     Maximum allowed percentage (0.0 to 100.0) of invalid bytes.   
   >   *     If the percentage of bytes for which map[byte] == 0 exceeds   
   >   *     this value, the file is classified as non-text.   
   >   *   
   >   * Behavior:   
   >   *   - Reads the file in binary mode.   
   >   *   - Counts total bytes & 'bad' bytes (map[] == 0).   
   >   *   - Returns 1 if bad byte percentage <= probability.   
   >   *   - Returns 0 if bad byte percentage > probability.   
   >   *   - Returns -1 on access/open errors or if the file is not regular.   
   >   *   - Function exits early if impossible to satisfy probability threshold.   
   >   *   
   >   * Returns:   
   >   *   1 - text   
   >   *   0 - binary indicator   
   >   *  -1 - could not open   
   >   *   
   >   * Example with 94.3% probability threshold:   
   >   *    is_text_file("./example.txt", your_map[256], 94.3)   
   >   *   
   >   */   
   >   
   > int is_text_file(const char *path, const uint8_t map[256], double   
   probability) {   
   >   
   >      struct stat st;   
   >      if (stat(path, &st) != 0) return -1; // can not access file   
   >      if (!S_ISREG(st.st_mode)) return -1; // reject: directori   
   s/devices/sockets   
   >      FILE *f = fopen(path, "rb"); if (!f) return -1; // could not open file   
   >   
   >      // 4KB: 4096, 8KB: 8192, 16KB: 16384, 32KB: 32768, 64KB: 65536   
   >      unsigned char buf[16384];   
   >      size_t n, i;   
   >      size_t total = 0;   
   >      size_t bad = 0;   
   >   
   >      while ((n = fread(buf, 1, sizeof(buf), f)) > 0) {   
   >          for (i = 0; i < n; i++) {   
   >              total++;   
   >              if (!map[buf[i]]) bad++;   
   >              if (((double)bad / total) * 100.0 > probability) {   
   >                  fclose(f);   
   >                  return 0; // not text   
   >              }   
   >          }   
   >      }   
   >   
   >      fclose(f);   
   >   
   >      if (total == 0) return 0; // empty file or total binary...   
   >   
   >      // final probability check   
   >      return (((double)bad / total) * 100.0 <= probability) ? 1 : 0;   
   > }   
   >   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca