home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1999 November / PCONLINE_11_99.ISO / filesbbs / OS2 / MMSRC029.ZIP / mmail-0.29 / mmail / misc.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1999-08-12  |  2.9 KB  |  146 lines

  1. /*
  2.  * MultiMail offline mail reader
  3.  * miscellaneous routines (global)
  4.  
  5.  Copyright (c) 1996 Toth Istvan <stoty@vma.bme.hu>
  6.  Copyright (c) 1999 William McBrine <wmcbrine@clark.net>
  7.  
  8.  Distributed under the GNU General Public License.
  9.  For details, see the file COPYING in the parent directory. */
  10.  
  11. #include "mmail.h"
  12.  
  13. // get a little-endian short, return an int
  14. unsigned getshort(const unsigned char *x)
  15. {
  16.     return ((unsigned) x[1] << 8) + (unsigned) x[0];
  17. }
  18.  
  19. // get a little-endian long
  20. unsigned long getlong(const unsigned char *x)
  21. {
  22.     return ((unsigned long) x[3] << 24) + ((unsigned long) x[2] << 16) +
  23.         ((unsigned long) x[1] << 8) + (unsigned long) x[0];
  24. }
  25.  
  26. // put an int into a little-endian short
  27. void putshort(unsigned char *dest, unsigned source)
  28. {
  29.     dest[0] = source & 0xff;
  30.     dest[1] = (source & 0xff00) >> 8;
  31. }
  32.  
  33. // put a long into a little-endian long
  34. void putlong(unsigned char *dest, unsigned long source)
  35. {
  36.     dest[0] = source & 0xff;
  37.     dest[1] = (source & 0xff00) >> 8;
  38.     dest[2] = (source & 0xff0000) >> 16;
  39.     dest[3] = (source & 0xff000000) >> 24;
  40. }
  41.  
  42. // takes off the spaces from the end of a string
  43. char *cropesp(char *st)
  44. {
  45.     char *p;
  46.  
  47.     for (p = st + strlen(st) - 1; (p > st) && (*p == ' '); p--);
  48.     p[1] = '\0';
  49.     return st;
  50. }
  51.  
  52. // converts spaces to underline characters
  53. char *unspace(char *source)
  54. {
  55.     for (unsigned c = 0; c < strlen(source); c++)
  56.         if (source[c] == ' ')
  57.             source[c] = '_';
  58.     return source;
  59. }
  60.  
  61. char *strdupplus(const char *original)
  62. {
  63.     char *tmp;
  64.  
  65.     if (original) {
  66.         tmp = new char[strlen(original) + 1];
  67.         strcpy(tmp, original);
  68.     } else
  69.         tmp = 0;
  70.  
  71.     return tmp;
  72. };
  73.  
  74. const char *findBaseName(const char *fileName)
  75. {
  76.     int c, d;
  77.     static char tmp[13];
  78.  
  79.     for (c = 0; (fileName[c] != '.') && (fileName[c]); c++);
  80.  
  81.     for (d = 0; d < c; d++)
  82.         tmp[d] = tolower(fileName[d]);
  83.     tmp[d] = '\0';
  84.  
  85.     return tmp;
  86. };
  87.  
  88. const char *stripre(const char *subject)
  89. {
  90.         if (!strncasecmp(subject, "re: ", 4))
  91.                 subject += 4;
  92.     return subject;
  93. }
  94.  
  95. // basically the equivalent of "strcasestr()", if there were such a thing
  96. const char *searchstr(const char *source, const char *item)
  97. {
  98.     const char *s, *s2;
  99.     int ilen = strlen(item) - 1;
  100.     bool found = false;
  101.  
  102.     char lower = tolower(*item), upper = toupper(*item);
  103.  
  104.     item++;
  105.  
  106.     do {
  107.         s = strchr(source, lower);
  108.         s2 = strchr(source, upper);
  109.         if (s2 && ((s2 < s) || !s))
  110.             s = s2;
  111.         if (s) {
  112.             source = s + 1;
  113.             found = !strncasecmp(source, item, ilen);
  114.         }
  115.     } while (s && !found && *source);
  116.  
  117.     return found ? s : 0;
  118. }
  119.  
  120. // Find the address in "Foo <foo@bar.baz>" or "foo@bar.baz (Foo)"
  121. const char *fromAddr(const char *source)
  122. {
  123.     static char tmp[100];
  124.     const char *index, *end = 0;
  125.  
  126.     index = strchr(source, '<');
  127.     if (index) {
  128.         index++;
  129.         end = strchr(index, '>');
  130.     } else {    // too simple-minded?
  131.         index = source;
  132.         end = strchr(index, ' ');
  133.     }
  134.  
  135.     if (end) {
  136.         int len = end - index;
  137.         if (len > 99)
  138.             len = 99;
  139.         strncpy(tmp, index, len);
  140.         tmp[len] = '\0';
  141.         return tmp;
  142.     }
  143.  
  144.     return source;
  145. }
  146.