home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume23 / trn / part13 / threads.c < prev    next >
C/C++ Source or Header  |  1991-08-22  |  2KB  |  107 lines

  1. /* $Header: threads.c,v 4.3.3.2 90/08/20 16:49:38 davison Trn $
  2. **
  3. ** $Log:    threads.c,v $
  4. ** Revision 4.3.3.2  90/08/20  16:49:38  davison
  5. ** Enlarged path buffers to be more consistent.
  6. ** 
  7. ** Revision 4.3.3.1  90/07/21  20:33:23  davison
  8. ** Initial Trn Release
  9. ** 
  10. */
  11.  
  12. #include "EXTERN.h"
  13. #include "common.h"
  14. #include "threads.h"
  15.  
  16. #ifdef USETHREADS
  17.  
  18. /* Change a newsgroup name into the name of the thread data file.  We
  19. ** subsitute any '.'s in the group name into '/'s (unless LONG_THREAD_NAMES
  20. ** is defined), prepend the path, and append the '/.thread' (or '.th') on to
  21. ** the end.
  22. */
  23. char *
  24. thread_name( group )
  25. char *group;
  26. {
  27.     register char *ptr;
  28.     static char name_buff[512];
  29. #ifndef LONG_THREAD_NAMES
  30.     char group_buff[512];
  31.  
  32.     strcpy( group_buff, group);
  33.     ptr = group = group_buff;
  34.     while( (ptr = index( ptr, '.' )) ) {
  35.     *ptr = '/';
  36.     }
  37. #endif
  38. #ifdef SUFFIX
  39.     sprintf( name_buff, "%s/%s%s", THREAD_DIR, group, SUFFIX );
  40. #else
  41.     sprintf( name_buff, "%s/%s", THREAD_DIR, group );
  42. #endif
  43.  
  44.     return name_buff;
  45. }
  46.  
  47. /* Determine this machine's byte map for WORDs and LONGs.  A byte map is an
  48. ** array of BYTEs (sizeof (WORD) or sizeof (LONG) of them) with the 0th BYTE
  49. ** being the byte number of the high-order byte in my <type>, and so forth.
  50. */
  51. void
  52. mybytemap( map )
  53. BMAP *map;
  54. {
  55.     union {
  56.     BYTE b[sizeof (LONG)];
  57.     WORD w;
  58.     LONG l;
  59.     } u;
  60.     register BYTE *mp;
  61.     register int i, j;
  62.  
  63.     mp = &map->w[sizeof (WORD)];
  64.     u.w = 1;
  65.     for( i = sizeof (WORD); i > 0; i-- ) {
  66.     for( j = 0; j < sizeof (WORD); j++ ) {
  67.         if( u.b[j] != 0 ) {
  68.         break;
  69.         }
  70.     }
  71.     if( j == sizeof (WORD) ) {
  72.         goto bad_news;
  73.     }
  74.     *--mp = j;
  75.     while( u.b[j] != 0 && u.w ) {
  76.         u.w <<= 1;
  77.     }
  78.     }
  79.  
  80.     mp = &map->l[sizeof (LONG)];
  81.     u.l = 1;
  82.     for( i = sizeof (LONG); i > 0; i-- ) {
  83.     for( j = 0; j < sizeof (LONG); j++ ) {
  84.         if( u.b[j] != 0 ) {
  85.         break;
  86.         }
  87.     }
  88.     if( j == sizeof (LONG) ) {
  89.       bad_news:
  90.         /* trouble -- set both to *something* consistent */
  91.         for( j = 0; j < sizeof (WORD); j++ ) {
  92.         map->w[j] = j;
  93.         }
  94.         for( j = 0; j < sizeof (LONG); j++ ) {
  95.         map->l[j] = j;
  96.         }
  97.         return;
  98.     }
  99.     *--mp = j;
  100.     while( u.b[j] != 0 && u.l ) {
  101.         u.l <<= 1;
  102.     }
  103.     }
  104. }
  105.  
  106. #endif /* USETHREADS */
  107.