[comp.sources.wanted] HELP on MS-DOS TSR for Spanish

jjohnson@cs.ucf.edu (John Jjohnson) (02/14/91)

HELP! I've written a macro for use with the Brief program editor. The macro
      keeps a two character memory of your keystrokes. If the second
      character is recognized as one which indicates the preceding
      character should be "Spanish-ized", i.e., printed with tildes
      or accents, it erases the last two characters, prints the Spanish
      character using extended ASCII (128-255), and advances the cursor
      to where the next character should go.

PROBLEM STATEMENT:
      Can someone convert (or show me how to convert) this macro into
      a C program which can be made into an MS-DOS TSR (terminate and
      stay resident) program? I want to be able to use these Spanish
      characters on the DOS command line and in other editors\word
      processors, specifically WordScar and NerdPerfect.

E-MAIL IS PREFERRED!
      Since I'm not able to read this group often, please send ideas
      to "jjohnson@eola.cs.ucf.edu". Phone #407-381-2218. Collect calls
      and good suggestions will be accepted, but working code (in Turbo C
      or Turbo ASM or Microsoft C) will be worshipped!

      Thanks in advance to all: Mark Johnson
-----------------------------------------------------------(cut here)

   /*------------------------------------*/
   /* Written by Mark Johnson on 1/20/91 */
   /*------------------------------------*

   This macro may be used when editing any text file. To call
   it up, press the F10 key (execute macro), type SPANISH, and
   press return.

   Once loaded, the macro is called every time a printable
   key is pressed. The macro maintains a memory of the last
   two characters entered. If they match one of the two-character
   sequences defined to represent a single Spanish character,
   then the cursor will back up, erase the two English characters,
   replace them with the appropriate Spanish character, and then
   advance the cursor.

   The English-to-Spanish mapping is as follows:
       (values may show up in octal if using VI)

         a` =          n~ = $       ?? = (
         e` =         N~ = %       !! = -                       
         i` = !        u: =        << = .                             
         o` = "        U: =        >> = /                 
         u` = #        
                       n` = $
                       N` = %

   The AT-style keyboard has the left quote (my accent) and 
   the tilde character on the same key. The tilde requires the
   shift key. Since I am lazy, and since it makes no sense for 
   an accent to be placed over the letter "n", I allow the user
   to enter an accent (no shift required) or tilde after typing
   an "n" to get the spanish letter "$".
                                           
--------------------------------------------------------------------*/
            /* C-Brief Macro Language */
void spn()
{
   global string new_char;     /* will be type char (int?) in C */
   global string old_char;     /* '    '  '    '     '      '   */

   old_char = new_char;
   prev_char();                /* moves cursor back to last char typed */
   new_char = read(1);         /* read the last char */

   switch(new_char) {          /* special char { '~:?!< or > } ? */

      case "`":
         switch(old_char) {
            case "a": prev_char();      /* move cursor back again */
                      delete_char(2);   /* delete the unaccented a */
                      insert(" ");   /* chr$(160): a w/ accent  */
                                         
            case "e": prev_char();
                      delete_char(2);
                      insert("");       /* chr$(130) */

            case "i": prev_char();
                      delete_char(2);
                      insert("!");       /* chr$(161) */

            case "o": prev_char();
                      delete_char(2);
                      insert(""");       /* chr$(162) */

            case "u": prev_char();
                      delete_char(2);
                      insert("#");       /* chr$(163) */

            case "n": prev_char();
                      delete_char(2);
                      insert("$");       /* chr$(164) */

            case "N": prev_char();
                      delete_char(2);
                      insert("%");       /* chr$(165) */


            default: next_char();
         }

      case "~":
         switch(old_char) {
            case "n": prev_char();
                      delete_char(2);
                      insert("$");       /* chr$(164) */

            case "N": prev_char();
                      delete_char(2);
                      insert("%");       /* chr$(165) */

            default: next_char();
         }

      case ":":
         switch(old_char) {
            case "u": prev_char();
                      delete_char(2);
                      insert("");       /* chr$(129) */

            case "U": prev_char();
                      delete_char(2);
                      insert("");       /* chr$(154) */

            default: next_char();
         }

      case "?":
         switch(old_char) {
            case "?": prev_char();
                      delete_char(2);
                      insert("(");       /* chr$(168) */

            default: next_char();
         }

      case "!":
         switch(old_char) {
            case "!": prev_char();
                      delete_char(2);
                      insert("-");       /* chr$(173) */

            default: next_char();
         }

      case "<":
         switch(old_char) {
            case "<": prev_char();
                      delete_char(2);
                      insert(".");       /* chr$(174) */

            default: next_char();
         }

      case ">":
         switch(old_char) {
            case ">": prev_char();
                      delete_char(2);
                      insert("/");       /* chr$(175) */

            default: next_char();
         }

      default: next_char();
   }

}
/* This is analogous to the keyboard Interrupt Service Routine */

void spanish()                 /* the actual macro the user invokes   */
{
   register_macro(0,"spn");    /* registers "spn()" as a macro to be  */
}                              /* called every time a key is pressed. */

/* --- the end --- */

freeman@cs.ucf.edu (Holly Freeman) (02/15/91)

Sorry about the kludgey looking code! Those 8-bit extended ASCII
characters work fine between my PC and my local UNIX machine, but'
they apparently didn't go across the net too well. The ASCII values
in comments to the right of the INSERT("string constant") statements
are the correct decimal values for the extended ASCII characters.

Thanks again for any/all help. MarkJ
:w s2