home *** CD-ROM | disk | FTP | other *** search
/ DOOM Companion (Alt) / DOOM Companion CD-ROM - iso / DOOM Companion CD-ROM.iso / other / doombsp / cmdlib.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-06  |  7.8 KB  |  60 lines

  1. // cmdlib.c
  2.  
  3.  
  4. #include "cmdlib.h"
  5.  
  6. #ifndef __NeXT__
  7.  
  8. #define PATHSEPERATOR   '\\'
  9. #endif
  10.  
  11. #ifdef __NeXT__
  12.  
  13. #define O_BINARY        0
  14. #define PATHSEPERATOR   '/'
  15.  
  16.  
  17. /*
  18. ================
  19. =
  20. = filelength
  21. =
  22. ================
  23. */
  24. int filelength (int handle)
  25. {
  26.     struct stat    fileinfo;
  27.     
  28.     if (fstat (handle,&fileinfo) == -1)
  29.     {
  30.         fprintf (stderr,"Error fstating");
  31.         exit (1);
  32.     }
  33.     return fileinfo.st_size;
  34. }
  35. int tell (int handle)
  36. {
  37.     return lseek (handle, 0, L_INCR);
  38. }
  39. char *strupr (char *start)
  40. {
  41.     char    *in;
  42.     in = start;
  43.     while (*in)
  44.     {
  45.         *in = toupper(*in);
  46.         in++;
  47.     }
  48.     return start;
  49. }
  50. char *getcwd (char *path, int length)
  51. {
  52.     return getwd(path);
  53. }
  54. #endif
  55.  
  56.  
  57. /* globals for command line args */
  58. #ifdef __NeXT__
  59. extern int NXArgc;
  60. extern char **NXArgv;
  61. #define myargc    NXArgc
  62. #define myargv    NXArgv
  63. #endif
  64.  
  65. #ifdef __WATCOMC__
  66. extern int _argc;
  67. extern char **_argv;
  68. #define myargc    _argc
  69. #define myargv    _argv
  70. #endif
  71.  
  72.  
  73. /*
  74. =============================================================================
  75.  
  76.                         MISC FUNCTIONS
  77.  
  78. =============================================================================
  79. */
  80.  
  81. /*
  82. =================
  83. =
  84. = Error
  85. =
  86. = For abnormal program terminations
  87. =
  88. =================
  89. */
  90.  
  91. void Error (char *error, ...)
  92. {
  93.     va_list argptr;
  94.  
  95. #ifndef __NeXT__
  96.     if ( *(byte *)0x449 == 0x13)
  97.         TextMode ();
  98. #endif
  99.  
  100.     va_start (argptr,error);
  101.     vprintf (error,argptr);
  102.     va_end (argptr);
  103.     printf ("\n");
  104.     exit (1);
  105. }
  106.  
  107.  
  108. /*
  109. =================
  110. =
  111. = CheckParm
  112. =
  113. = Checks for the given parameter in the program's command line arguments
  114. =
  115. = Returns the argument number (1 to argc-1) or 0 if not present
  116. =
  117. =================
  118. */
  119.  
  120. int CheckParm (char *check)
  121. {
  122.     int             i;
  123.     char    *parm;
  124.  
  125.     for (i = 1;i<myargc;i++)
  126.     {
  127.         parm = myargv[i];
  128.  
  129.         if ( !isalpha(*parm) )  // skip - / \ etc.. in front of parm
  130.             if (!*++parm)
  131.                 continue;               // parm was only one char
  132.  
  133.         if ( !stricmp(check,parm) )
  134.             return i;
  135.     }
  136.  
  137.     return 0;
  138. }
  139.  
  140.  
  141.  
  142.  
  143. int SafeOpenWrite (char *filename)
  144. {
  145.     int     handle;
  146.  
  147.     handle = open(filename,O_RDWR | O_BINARY | O_CREAT | O_TRUNC
  148.     , 0666);
  149.  
  150.     if (handle == -1)
  151.         Error ("Error opening %s: %s",filename,strerror(errno));
  152.  
  153.     return handle;
  154. }
  155.  
  156. int SafeOpenRead (char *filename)
  157. {
  158.     int     handle;
  159.  
  160.     handle = open(filename,O_RDONLY | O_BINARY);
  161.  
  162.     if (handle == -1)
  163.         Error ("Error opening %s: %s",filename,strerror(errno));
  164.  
  165.     return handle;
  166. }
  167.  
  168.  
  169. void SafeRead (int handle, void *buffer, long count)
  170. {
  171.     unsigned        iocount;
  172.  
  173.     while (count)
  174.     {
  175.         iocount = count > 0x8000 ? 0x8000 : count;
  176.         if (read (handle,buffer,iocount) != iocount)
  177.             Error ("File read failure");
  178.         buffer = (void *)( (byte *)buffer + iocount );
  179.         count -= iocount;
  180.     }
  181. }
  182.  
  183.  
  184. void SafeWrite (int handle, void *buffer, long count)
  185. {
  186.     unsigned        iocount;
  187.  
  188.     while (count)
  189.     {
  190.         iocount = count > 0x8000 ? 0x8000 : count;
  191.         if (write (handle,buffer,iocount) != iocount)
  192.             Error ("File write failure");
  193.         buffer = (void *)( (byte *)buffer + iocount );
  194.         count -= iocount;
  195.     }
  196. }
  197.  
  198.  
  199. void *SafeMalloc (long size)
  200. {
  201.     void *ptr;
  202.  
  203.     ptr = malloc (size);
  204.  
  205.     if (!ptr)
  206.         Error ("Malloc failure for %lu bytes",size);
  207.  
  208.     return ptr;
  209. }
  210.  
  211.  
  212. /*
  213. ==============
  214. =
  215. = LoadFile
  216. =
  217. ==============
  218. */
  219.  
  220. long    LoadFile (char *filename, void **bufferptr)
  221. {
  222.     int             handle;
  223.     long    length;
  224.     void    *buffer;
  225.  
  226.     handle = SafeOpenRead (filename);
  227.     length = filelength (handle);
  228.     buffer = SafeMalloc (length);
  229.     SafeRead (handle, buffer, length);
  230.     close (handle);
  231.  
  232.     *bufferptr = buffer;
  233.     return length;
  234. }
  235.  
  236.  
  237. /*
  238. ==============
  239. =
  240. = SaveFile
  241. =
  242. ==============
  243. */
  244.  
  245. void    SaveFile (char *filename, void *buffer, long count)
  246. {
  247.     int             handle;
  248.  
  249.     handle = SafeOpenWrite (filename);
  250.     SafeWrite (handle, buffer, count);
  251.     close (handle);
  252. }
  253.  
  254.  
  255.  
  256. void DefaultExtension (char *path, char *extension)
  257. {
  258.     char    *src;
  259. //
  260. // if path doesn't have a .EXT, append extension
  261. // (extension should include the .)
  262. //
  263.     src = path + strlen(path) - 1;
  264.  
  265.     while (*src != PATHSEPERATOR && src != path)
  266.     {
  267.         if (*src == '.')
  268.             return;                 // it has an extension
  269.         src--;
  270.     }
  271.  
  272.     strcat (path, extension);
  273. }
  274.  
  275.  
  276. void DefaultPath (char *path, char *basepath)
  277. {
  278.     char    temp[128];
  279.  
  280.     if (path[0] == PATHSEPERATOR)
  281.         return;                                                 // absolute path location
  282.     strcpy (temp,path);
  283.     strcpy (path,basepath);
  284.     strcat (path,temp);
  285. }
  286.  
  287.  
  288. void    StripFilename (char *path)
  289. {
  290.     int             length;
  291.  
  292.     length = strlen(path)-1;
  293.     while (length > 0 && path[length] != PATHSEPERATOR)
  294.         length--;
  295.     path[length] = 0;
  296. }
  297.  
  298. void    StripExtension (char *path)
  299. {
  300.     int             length;
  301.  
  302.     length = strlen(path)-1;
  303.     while (length > 0 && path[length] != '.')
  304.         length--;
  305.     if (length)
  306.         path[length] = 0;
  307. }
  308.  
  309.  
  310. void ExtractFileBase (char *path, char *dest)
  311. {
  312.     char    *src;
  313.     int             length;
  314.  
  315.     src = path + strlen(path) - 1;
  316.  
  317. //
  318. // back up until a \ or the start
  319. //
  320.     while (src != path && *(src-1) != PATHSEPERATOR)
  321.         src--;
  322.  
  323. //
  324. // copy up to eight characters
  325. //
  326.     memset (dest,0,8);
  327.     length = 0;
  328.     while (*src && *src != '.')
  329.     {
  330.         if (++length == 9)
  331.             Error ("Filename base of %s >8 chars",path);
  332.         *dest++ = toupper(*src++);
  333.     }
  334. }
  335.  
  336.  
  337. /*
  338. ==============
  339. =
  340. = ParseNum / ParseHex
  341. =
  342. ==============
  343. */
  344.  
  345. long ParseHex (char *hex)
  346. {
  347.     char    *str;
  348.     long    num;
  349.  
  350.     num = 0;
  351.     str = hex;
  352.  
  353.     while (*str)
  354.     {
  355.         num <<= 4;
  356.         if (*str >= '0' && *str <= '9')
  357.             num += *str-'0';
  358.         else if (*str >= 'a' && *str <= 'f')
  359.             num += 10 + *str-'a';
  360.         else if (*str >= 'A' && *str <= 'F')
  361.             num += 10 + *str-'A';
  362.         else
  363.             Error ("Bad hex number: %s",hex);
  364.         str++;
  365.     }
  366.  
  367.     return num;
  368. }
  369.  
  370.  
  371. long ParseNum (char *str)
  372. {
  373.     if (str[0] == '$')
  374.         return ParseHex (str+1);
  375.     if (str[0] == '0' && str[1] == 'x')
  376.         return ParseHex (str+2);
  377.     return atol (str);
  378. }
  379.  
  380.  
  381. int GetKey (void)
  382. {
  383. #ifdef __NeXT__
  384.     return getchar ();
  385. #else
  386.     return _bios_keybrd (_KEYBRD_READ)&0xff;
  387. #endif
  388. }
  389.  
  390. /*
  391. ============================================================================
  392.  
  393.                     BYTE ORDER FUNCTIONS
  394.  
  395. ============================================================================
  396. */
  397.  
  398. #ifdef __BIG_ENDIAN__
  399. short   LittleShort (short l)
  400. {
  401.     byte    b1,b2;
  402.  
  403.     b1 = l&255;
  404.     b2 = (l>>8)&255;
  405.  
  406.     return (b1<<8) + b2;
  407. }
  408.  
  409. short   BigShort (short l)
  410. {
  411.     return l;
  412. }
  413.  
  414.  
  415. long    LittleLong (long l)
  416. {
  417.     byte    b1,b2,b3,b4;
  418.  
  419.     b1 = l&255;
  420.     b2 = (l>>8)&255;
  421.     b3 = (l>>16)&255;
  422.     b4 = (l>>24)&255;
  423.  
  424.     return ((long)b1<<24) + ((long)b2<<16) + ((long)b3<<8) + b4;
  425. }
  426.  
  427. long    BigLong (long l)
  428. {
  429.     return l;
  430. }
  431.  
  432.  
  433. #else
  434.  
  435. short   BigShort (short l)
  436. {
  437.     byte    b1,b2;
  438.  
  439.     b1 = l&255;
  440.     b2 = (l>>8)&255;
  441.  
  442.     return (b1<<8) + b2;
  443. }
  444.  
  445. short   LittleShort (short l)
  446. {
  447.     return l;
  448. }
  449.  
  450.  
  451. long    BigLong (long l)
  452. {
  453.     byte    b1,b2,b3,b4;
  454.  
  455.     b1 = l&255;
  456.     b2 = (l>>8)&255;
  457.     b3 = (l>>16)&255;
  458.     b4 = (l>>24)&255;
  459.  
  460.     return ((long)b1<<24) + ((long)b2<<16) + ((long)b3<<8) + b4;
  461. }
  462.  
  463. long    LittleLong (long l)
  464. {
  465.     return l;
  466. }
  467.  
  468.  
  469. #endif
  470. /*
  471. ============================================================================
  472.  
  473.                         BASIC GRAPHICS
  474.  
  475. ============================================================================
  476. */
  477.  
  478. byte    *screen;
  479. #define PEL_WRITE_ADR   0x3c8
  480. #define PEL_READ_ADR    0x3c7
  481. #define PEL_DATA                0x3c9
  482. #define PEL_MASK                0x3c6
  483.  
  484. /*
  485. ==============
  486. =
  487. = GetPalette
  488. =
  489. = Return an 8 bit / color palette
  490. =
  491. ==============
  492. */
  493.  
  494. void GetPalette (byte *pal)
  495. {
  496. #ifndef __NeXT__
  497.     int     i;
  498.  
  499.     outp (PEL_READ_ADR,0);
  500.     for (i=0 ; i<768 ; i++)
  501.         pal[i] = inp (PEL_DATA)<<2;
  502. #endif
  503. }
  504.  
  505. /*
  506. ==============
  507. =
  508. = SetPalette
  509. =
  510. = Sets an 8 bit / color palette
  511. =
  512. ==============
  513. */
  514.  
  515. void SetPalette (byte *pal)
  516. {
  517. #ifndef __NeXT__
  518.     int     i;
  519.  
  520.     outp (PEL_WRITE_ADR,0);
  521.     for (i=0 ; i<768 ; i++)
  522.         outp (PEL_DATA, pal[i]>>2);
  523. #endif
  524. }
  525.  
  526.  
  527. void VGAMode (void)
  528. {
  529. #ifndef __NeXT__
  530. union REGS      regs;        // scratch for int calls
  531.     regs.w.ax = 0x13;
  532.     int386 (0x10,(const union REGS *)®s,®s);
  533.     screen = (byte *)0xa0000;
  534. #else
  535.     screen = malloc (0x10000);
  536. #endif
  537.  
  538. }
  539.  
  540. void TextMode (void)
  541. {
  542. #ifndef __NeXT__
  543. union REGS      regs;        // scratch for int calls
  544.     regs.w.ax = 0x3;
  545.     int386 (0x10,(const union REGS *)®s,®s);
  546. #endif
  547. }
  548.