home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 181.img / TASM-101.ZIP / STRINGUP.C < prev    next >
Text File  |  1988-10-31  |  3KB  |  78 lines

  1.  
  2. /* Program to demonstrate the use of StringToUpper().
  3.    Calls StringToUpper to convert TestString to uppercase in
  4.    UpperCaseString, then prints UpperCaseString and its length.
  5. */
  6.  
  7. #pragma inline
  8. #include <stdio.h>
  9.  
  10. /* Function prototype for StringToUpper() */
  11. extern unsigned int StringToUpper(
  12. unsigned char far * DestFarString,
  13. unsigned char far * SourceFarString);
  14.  
  15. #define MAX_STRING_LENGTH 100
  16.  
  17. char *TestString = "This Started Out As Lowercase!";
  18.  
  19. char UpperCaseString[MAX_STRING_LENGTH];
  20.  
  21. main()
  22. {
  23.    unsigned int StringLength;
  24.  
  25.    /* Copy an uppercase version of TestString to UpperCaseString*/
  26.    StringLength = StringToUpper(UpperCaseString, TestString);
  27.  
  28.    /* Display the results of the conversion */
  29.    printf("Original string:\n%s\n\n", TestString);
  30.    printf("Uppercase string:\n%s\n\n", UpperCaseString);
  31.    printf("Number of characters: %d\n\n", StringLength);
  32. }
  33.  
  34. /* Function to perform high-speed translation to uppercase
  35.    from one far string to another
  36.  
  37.    Input:
  38.         DestFarString   - array in which to store uppercased
  39.                           string (will be zero-terminated)
  40.         SourceFarString - string containing characters to be
  41.                           converted to all uppercase (must be
  42.                           zero-terminated)
  43.  
  44.    Returns:
  45.         The length of the source string in characters, not
  46.         counting the terminating zero. */
  47.  
  48. unsigned int StringToUpper(unsigned char far * DestFarString,
  49.                            unsigned char far * SourceFarString)
  50. {
  51.    unsigned int  CharacterCount;
  52.  
  53.    #define LOWER_CASE_A 'a'
  54.    #define LOWER_CASE_Z 'z'
  55.       asm ADJUST_VALUE  EQU  20h;    /* amount to subtract from lowercase 
  56.                                         letters to make them uppercase */
  57.       asm  cld;
  58.       asm  push ds;                  /* save C's data segment */
  59.       asm  lds  si,SourceFarString;  /* load far pointer to source string */
  60.       asm  les  di,DestFarString;    /* load far pointer to destination string */
  61.       CharacterCount = 0;            /* count of characters */
  62.    StringToUpperLoop:
  63.       asm  lodsb;                    /* get the next character */
  64.       asm  cmp  al,LOWER_CASE_A;     /* if < a then it's not a lowercase letter */
  65.       asm  jb   SaveCharacter;
  66.       asm  cmp  al,LOWER_CASE_Z;     /* if > z then it's not a lowercase letter */
  67.       asm  ja   SaveCharacter;
  68.       asm  sub  al,ADJUST_VALUE;     /* it's lowercase; make it uppercase */
  69.    SaveCharacter:
  70.       asm  stosb;                    /* save the character */
  71.       CharacterCount++;              /* count this character */
  72.       asm  and  al,al;               /* is this the ending zero? */
  73.       asm  jnz  StringToUpperLoop;   /* no, process the next character, if any */
  74.       CharacterCount--;              /* don't count the terminating zero */
  75.       asm  pop  ds;                  /* restore C's data segment */
  76.       return(CharacterCount);
  77. }
  78.