home *** CD-ROM | disk | FTP | other *** search
/ Unix System Administration Handbook 1997 October / usah_oct97.iso / news / nn.tar / nn-6.5.1 / pack_subject.c < prev    next >
C/C++ Source or Header  |  1995-04-29  |  1KB  |  75 lines

  1. /*
  2.  *    (c) Copyright 1990, Kim Fabricius Storm.  All rights reserved.
  3.  *
  4.  *    Pack subject by eliminating RE prefixes and - (nf) suffixes.
  5.  *    Also collapse multiple blanks into single blanks.
  6.  */
  7.  
  8. #include "config.h"
  9.  
  10. int
  11. pack_subject(dest, src, re_counter_ptr, max_length)
  12. register char *dest, *src;
  13. int *re_counter_ptr, max_length;
  14. {
  15.     register char *max_dest;
  16.     int re = 0;
  17.     char *start_dest = dest;
  18.  
  19.     if (src) {
  20.     max_dest = dest + max_length;
  21.  
  22.     while (*src) {
  23.         if (isspace(*src)) {
  24.         src++;
  25.         continue;
  26.         }
  27.  
  28.         /* count and remove 'Re: Re: ...' */
  29.  
  30.         if (*src != 'R' && *src != 'r') break;
  31.         *dest++ = *src++;
  32.  
  33.         if (*src != 'e' && *src != 'E') break;
  34.         *dest++ = *src++;
  35.  
  36.         if (*src == ':' || *src == ' ') {
  37.         src++;
  38.         dest = start_dest;
  39.         re++;
  40.         continue;
  41.         }
  42.  
  43.         if (*src != '^') break;
  44.  
  45.         src++;
  46.         dest = start_dest;
  47.  
  48.         while (isdigit(*src)) *dest++ = *src++;
  49.         if (dest == start_dest)
  50.         re++;
  51.         else {
  52.         *dest = NUL;
  53.         dest = start_dest;
  54.         re += atoi(dest);
  55.         }
  56.         if (*src == ':') src++;
  57.     }
  58.  
  59.     while (*src && dest < max_dest) {
  60.         if (*src == '-' && strncmp("- (nf)", src, 5) == 0) break;
  61.         if (isascii(*src) && isspace(*src)) {
  62.         do src++;
  63.         while (isascii(*src) && isspace(*src));
  64.         *dest++ = SP;
  65.         } else
  66.         *dest++ = *src++;
  67.     }
  68.     }
  69.  
  70.     *dest = NUL;
  71.     *re_counter_ptr = (char)re;
  72.  
  73.     return dest - start_dest;
  74. }
  75.