home *** CD-ROM | disk | FTP | other *** search
/ The Pier Shareware 6 / The_Pier_Shareware_Number_6_(The_Pier_Exchange)_(1995).iso / 024 / psi110g.zip / MKNAME.C < prev    next >
C/C++ Source or Header  |  1994-04-17  |  5KB  |  145 lines

  1. /* routines to override the standard Borland library routines */
  2. /* PA0GRI , N1BEE , aparent origin PE1CHL */
  3. /* Compile into _TEXT segment with -zC_TEXT */
  4.   
  5. /* 920703, 920808: more patching to work with BC++ 3.1  -- N1BEE
  6.         (becoming sorry he ever wrote this module...)
  7.   
  8.    PLEASE DO NOT CHANGE THE ANSI STYLE FUNCTION DEFINITIONS TO K&R STYLE.
  9.    THE COMPILER CANNOT DETECT TYPE MISMATCH ERRORS IF THAT IS DONE.  THIS
  10.    ENTIRE MODULE IS COMPILER-SPECIFIC ANYWAY, SO PORTABILITY IS NO ISSUE.
  11.   
  12.    Letters in comments in brackets indicate nesting level of conditionals.
  13.   
  14.    This file is also extensively cleaned up.
  15. */
  16.   
  17. #include <dos.h>
  18. #include <io.h>
  19. #include "global.h"
  20.   
  21. #ifdef __TURBOC__                       /* [A] */
  22.   
  23. /*-------------------------------------------------------------------
  24.         ANSI function prototypes
  25. -------------------------------------------------------------------*/
  26.   
  27. char * getnenv __ARGS((char *name));    /* In pc.c */
  28.   
  29. #ifdef __BORLANDC__                     /* [AB] */
  30. #if __BORLANDC__ >= 0x0410              /* [ABC] Borland C++ 3.1 and later */
  31. #define mkname(a,b,c) __MKNAME(a,b,c)
  32. char * near pascal __MKNAME __ARGS((char *,char *,unsigned));
  33. char * near pascal __TMPNAM __ARGS((char *,unsigned *));
  34.   
  35. #elif __BORLANDC__ == 0x0400            /* [ABC] BC++ 3.0 only */
  36. #define mkname(a,b,c) __MKNAME(a,b,c)
  37. char * near pascal __MKNAME __ARGS((char *,char *,unsigned));
  38.   
  39. #else                                   /* [ABC] BC++ 2.0 only */
  40. #define mkname(a,b,c) __MKNAME(a,c)
  41. char * near pascal __MKNAME __ARGS((char *,unsigned));
  42.   
  43. #endif                                  /* [ABC] */
  44. #else                                   /* [AB] TC or TC++ */
  45. #define mkname(a,b,c) __MKNAME(a,c)
  46. char * pascal __MKNAME __ARGS((char *,unsigned));
  47.   
  48. #endif /* __BORLANDC__ */               /* [AB] */
  49.   
  50.   
  51. /*-------------------------------------------------------------------
  52.         __MKNAME()
  53. -------------------------------------------------------------------*/
  54.   
  55. #ifdef __BORLANDC__                     /* [AB] BC++ */
  56. char * near pascal mkname(char *tmpname,char *prefix,unsigned tmpnum)
  57.                                         /* 'prefix' will never be used */
  58.   
  59. #else                                   /* [AB] TC or TC++ */
  60. char *pascal mkname(tmpname,notused,tmpnum)
  61. char *tmpname;
  62. unsigned int tmpnum;
  63.   
  64. #endif /* __BORLANDC__ */               /* [AB] */
  65.   
  66. {
  67.     char *tmpdir,*p;
  68.     static char staticname[80];
  69.   
  70.     if(tmpname == NULL)
  71.         tmpname = staticname;
  72.   
  73.     p = tmpdir = getnenv("TMP");    /* get tempdir name */
  74.     if(p[0] != '\0')
  75.         p += strlen(p) - 1;     /* point to last character */
  76.   
  77.     sprintf(tmpname,"%s%sTMP%u.$$$",tmpdir,
  78.     ((*p != '/' && *p != '\\') ? "/" : ""),tmpnum);
  79.   
  80.     return tmpname;
  81. }
  82.   
  83. /*-------------------------------------------------------------------
  84.         tmpnam()/__TMPNAM()
  85. -------------------------------------------------------------------*/
  86.   
  87. /* For the earlier compilers, __MKNAME() and tmpnam() were bound into
  88.    the same source module, and therefore into the same OBJ module,
  89.    which meant that replacing __MKNAME() forced us to replace tmpnam()
  90.    and its global data.  With the newer compiler, tmpnam() is in a
  91.    separate module, but all tmpnam() does is call __TMPNAM(), which
  92.    is in the same module as __MKNAME().  As a result, the newer
  93.    compiler no longer requires us to replace tmpnam(), but rather
  94.    __TMPNAM().
  95. */
  96.   
  97. #if !defined(__BORLANDC__) || (__BORLANDC__ <= 0x0400)
  98.                                         /* [AB] BC++ 3.0 and earlier */
  99.   
  100. unsigned int _tmpnum = 0;
  101.   
  102. char *tmpnam(name)
  103. char *name;
  104. {
  105.     do {
  106.   
  107.         if(_tmpnum == 0xffff)
  108.             _tmpnum = 2;
  109.         else
  110.             ++_tmpnum;
  111.   
  112.         name = mkname(name,"TMP",_tmpnum);
  113.   
  114.     } while(access(name,0) != -1);
  115.   
  116.     return name;
  117. }
  118.   
  119.   
  120. #else                                   /* [AB] BC++ 3.1 and later */
  121.   
  122. /* The following few lines of code which make up __TMPNAM()
  123.    are lifted almost directly from the Borland library source,
  124.    which is "Copyright (c) 1987, 1992 by Borland International".
  125.    This routine is called only from tmpnam() and tmpfile() in
  126.    the Borland library.  ("-1U"?)  -- N1BEE
  127. */
  128.   
  129. char * near pascal __TMPNAM(char *s,unsigned *numP)
  130. {
  131.     unsigned attr;
  132.   
  133.     do
  134.         s = mkname(s,(char *)NULL,*numP += ((*numP == -1U) ? 2 : 1));
  135.   
  136.         while(_dos_getfileattr(s,&attr) == 0);
  137.   
  138.     return(s);
  139. }
  140.   
  141. #endif                                  /* [AB] */
  142.   
  143. #endif /* __TURBOC__ */                 /* [A] */
  144.   
  145.