home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mididll.zip / mfvlq / MFVLQ.C next >
Text File  |  1993-10-05  |  2KB  |  84 lines

  1. /* ===========================================================================
  2.  * mfvlq.c
  3.  *
  4.  * Converts the variable length quantity typed by the user into a LONG and displays that.
  5.  * =========================================================================
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <os2.h>
  10.  
  11. #include "midifile.h"
  12.  
  13.  
  14. /* A buffer to hold user input */
  15. UCHAR buffer[4096];
  16.  
  17.  
  18.  
  19. /* *************************** hex2bin() ******************************
  20.  * Convert an ascii hex numeric char (ie, '0' to '9', 'A' to 'F') to its binary equivalent.
  21.  ******************************************************************* */
  22.  
  23. USHORT hex2bin(UCHAR c)
  24. {
  25.    if(c < 0x3A)
  26.      return (c - 48);
  27.    else
  28.      return (( c & 0xDF) - 55);
  29. }
  30.  
  31.  
  32.  
  33. /* ********************************** main() ***********************************
  34.  * Program entry point. Calls the MIDIFILE.DLL function MidiVLQToLong.
  35.  *************************************************************************** */
  36.  
  37. main(int argc, char *argv[], char *envp[])
  38. {
  39.     register USHORT i;
  40.     ULONG conv, final;
  41.     register UCHAR * ptr = &buffer[0];
  42.     register UCHAR * arg;
  43.  
  44.     /* If no args supplied by user, exit with usage info */
  45.     if ( argc < 2 )
  46.     {
  47.      printf("This program converts the variable length quantity\r\n");
  48.      printf("(ie, series of bytes) into a ULONG and displays that.\r\n");
  49.      printf("It requires MIDIFILE.DLL to run.\r\n");
  50.      printf("Syntax: MFVLQ.EXE [...bytes...]\r\n");
  51.      exit(1);
  52.     }
  53.  
  54.     /* Convert ascii numerals to byte values, and store in buffer */
  55.     *(ptr)++ = 0;
  56.     for (i=1; i<argc; i++)
  57.     {
  58.      arg = argv[i];
  59.      if ( *arg == '0' && (*(arg+1) == 'x' || *(arg+1) == 'X') )
  60.      {
  61.           arg+=2;
  62.           conv = (ULONG)hex2bin(*(arg)++);
  63.           conv = (conv << 4) + (ULONG)hex2bin(*(arg)++);
  64.      }
  65.      else
  66.      {
  67.           conv = (ULONG)atoi(arg);
  68.      }
  69.      *(ptr)++ = (UCHAR)conv | 0x80;
  70.     }
  71.     *(ptr-1) &= 0x7F;
  72.  
  73.     /* Null terminate the buffer. This ensures that MidiVLQToLong() definitely sees a final
  74.     terminating byte to the variable length quantity. Remember that all bytes except for the
  75.     last byte of the variable length quantity have bit #7 set. */
  76.     *(ptr) = 0;
  77.  
  78.     /* Call MIDIFILE.DLL function to do the conversion, and print it  */
  79.     final = MidiVLQToLong(&buffer[1], &conv);
  80.     printf("ULONG value = 0x%08lx\r\n%ld bytes converted\r\n", final, conv);
  81.  
  82.     exit(0);
  83. }
  84.