bug-gtypist
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bug-gtypist] bugfix for gtypist 2.9.5


From: Mihai Gătejescu
Subject: Re: [bug-gtypist] bugfix for gtypist 2.9.5
Date: Sun, 20 Oct 2019 23:59:57 +0300

Hello Paul,

Thank you for reaching to us. This is the second time I am contacted
in regards to Asian language support. So this is definitely something
I want included in a future release of GNU Typist.

As to the patch itself, it is too big for me to fully review right now. So
I will give you some quick feedback:

The patch include both the style/indentation changes and the functional
changes you made to the code. This makes it difficult for me to find
the changes that add the functionality.

To help me, could you please explain how your change works?
Did you use two solutions, one for drills and one for speed tests?

Best regards,
Mihai


PS Just a few days ago I read the Google Practises:
https://github.com/google/eng-practices. It informed my reply.

On Fri, Oct 18, 2019 at 4:10 PM paul <address@hidden> wrote:

>------------------------------------------------------------------
> From:   Felix Natter 
> Subject:   Re: [bug-gtypist] use gtypist typing chinese bugfix 
> Date:   Sat, 12 Sep 2015 11:51:22 +0200 
> User-agent:   Gnus/5.130006 (Ma Gnus v0.6) Emacs/24.4 (gnu/linux) 
>-------------------------------------------------------------------
>> Hello Simon Baldwin:
>> I am bienilz from China, when i use gtypist typing Chinese article, the
>> cursor on the screen not work fine:
>> 1. full char string but half char "^" to indicate error point is not a good
>> ideal;
>> 2. In speed test mode ,the backspace key typing will course cursor
>> misaligning the right char.
>> I just modify the source file to satisfy my purpose, but i am not sure the
>> result is right.
>
>Thank you for your contribution.
>Against which version was this patch applied?
>Could you please create a diff against your gtypist version?
>- copy the original gtypist.c to gtypist.c.orig
>- send us the output of:
>$ diff src/gtypist.c.orig src/gtypist.c
>Thanks and Best Regards,
>Felix Natter

Sorry for missing your mail. I just find it from www.
So this is the diff result for gtypist 2.9.5 bellow:

diff -u /home/paulwp86/Downloads/gtypist-2.9.5/src/gtypist.c.orig /home/paulwp86/Downloads/gtypist-2.9.5/src/gtypist.c
--- /home/paulwp86/Downloads/gtypist-2.9.5/src/gtypist.c.orig   2019-10-18 14:34:15.823622962 +0800
+++ /home/paulwp86/Downloads/gtypist-2.9.5/src/gtypist.c        2019-10-18 14:34:41.005562465 +0800
@@ -64,7 +64,7 @@

 /* character to be display to represent "enter key" */
 /* TODO: this requires beginner mode!
-#define RETURN_CHARACTER 0x000023CE */
+   #define RETURN_CHARACTER 0x000023CE */
 #define RETURN_CHARACTER 0x00000020

 /* a definition of a boolean type */
@@ -89,8 +89,8 @@
 /* yes/no responses and miscellanea */
 #define        QUERY_Y                 'Y'
 #define        QUERY_N                 'N'
-#define        DRILL_CH_ERR            '^'
-#define        DRILL_NL_ERR            '^'
+#define        DRILL_CH_ERR            L'^'
+#define        DRILL_NL_ERR            L'^'
 char *WAIT_MESSAGE;
 char *ERROR_TOO_HIGH_MSG;
 char *SKIPBACK_VIA_F_MSG;
@@ -128,8 +128,8 @@

 /* some colour definitions */
 static short   colour_array[] = {
-  COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW,
-  COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE };
+    COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW,
+    COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE };
 #define        NUM_COLOURS             (sizeof( colour_array ) / sizeof( short ))

 /* shortcuts for reverse/normal mode strings */
@@ -183,14 +183,14 @@
 /* a global area for associating function keys with labels */
 #define NFKEYS                 12              /* num of function keys */
 static char    *fkey_bindings[ NFKEYS ] =
-  { NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL };
+    { NULL, NULL, NULL, NULL, NULL, NULL,
+      NULL, NULL, NULL, NULL, NULL, NULL };
 /* table of pseudo-function keys, to allow ^Q to double as Fkey1, etc */
 #define        CTRL_OFFSET             0100            /* ctrl keys are 'X' - 0100 */
 static char    pfkeys[ NFKEYS ] =
-  { 'Q'-CTRL_OFFSET, 'W'-CTRL_OFFSET, 'E'-CTRL_OFFSET, 'R'-CTRL_OFFSET,
-    'T'-CTRL_OFFSET, 'Y'-CTRL_OFFSET, 'U'-CTRL_OFFSET, 'I'-CTRL_OFFSET,
-    'O'-CTRL_OFFSET, 'P'-CTRL_OFFSET, 'A'-CTRL_OFFSET, 'S'-CTRL_OFFSET };
+    { 'Q'-CTRL_OFFSET, 'W'-CTRL_OFFSET, 'E'-CTRL_OFFSET, 'R'-CTRL_OFFSET,
+      'T'-CTRL_OFFSET, 'Y'-CTRL_OFFSET, 'U'-CTRL_OFFSET, 'I'-CTRL_OFFSET,
+      'O'-CTRL_OFFSET, 'P'-CTRL_OFFSET, 'A'-CTRL_OFFSET, 'S'-CTRL_OFFSET };

 static bool user_is_always_sure = FALSE;

@@ -215,85 +215,85 @@
 static void parse_file( FILE *script, char *label );
 static void indent_to( int n );
 static void print_usage_item( char *op, char *lop, char *help,
-                             int col_op, int col_lop, int col_help,
-                             int last_col );
+    int col_op, int col_lop, int col_help,
+    int last_col );
 static void print_help();
 static void parse_cmdline( int argc, char **argv );
 static void catcher( int signal );
 static FILE *open_script( const char *filename );
 static void do_bell();
 static bool get_best_speed( const char *script_filename,
-                           const char *excersise_label, double *adjusted_cpm );
+    const char *excersise_label, double *adjusted_cpm );
 static void put_best_speed( const char *script_filename,
-                           const char *excersise_label, double adjusted_cpm );
+    const char *excersise_label, double adjusted_cpm );
 void get_bestlog_filename( char *filename );

 // Display the top banner with the given text
 void banner (const char *text)
 {
-   int colnum, brand_length, brand_position, text_length, text_position;
+    int colnum, brand_length, brand_position, text_length, text_position;

-   // Get rid of spaces at the edges of the text
-   while (isspace (*text))
-      text ++;
-   text_length = strlen (text);
-   if (text_length > 0)
-   {
-      while (isspace (text [text_length - 1]))
-      {
-         text_length --;
-        if (! text_length)
+    // Get rid of spaces at the edges of the text
+    while (isspace (*text))
+    text ++;
+    text_length = strlen (text);
+    if (text_length > 0)
+    {
+        while (isspace (text [text_length - 1]))
+        {
+            text_length --;
+            if (! text_length)
            break;
-      }
-   }
+        }
+    }

-   brand_length = utf8len (PACKAGE) + utf8len (VERSION) + 3,
-   brand_position = COLS - brand_length,
-   text_position = ((COLS - brand_length) > text_length) ?
-               (COLS - brand_length - text_length) / 2 : 0;
-
-// TODO:  much of redundant output here...
-
-   move (B_TOP_LINE , 0);
-   attron (COLOR_PAIR (C_BANNER));
-   for (colnum = 0; colnum < COLS; colnum++)
-      ADDCH_REV (ASCII_SPACE);
-
-   move (B_TOP_LINE, text_position);
-   {
-     wchar_t* wideText = convertFromUTF8(text);
-     int numChars = wcslen(wideText);
-
-     int i;
-     for (i = 0; i < numChars; i++)
-       wideaddch_rev(wideText[i]);
-     free(wideText);
-   }
-
-   move (B_TOP_LINE, brand_position);
-   attron (COLOR_PAIR (C_PROG_NAME));
-   ADDCH_REV (' ');
-   ADDSTR_REV (PACKAGE);
-   ADDCH_REV (' ');
-   attron (COLOR_PAIR (C_PROG_VERSION));
-   ADDSTR_REV (VERSION);
-   refresh ();
-   attron (COLOR_PAIR (C_NORMAL));
+    brand_length = utf8len (PACKAGE) + utf8len (VERSION) + 3,
+        brand_position = COLS - brand_length,
+        text_position = ((COLS - brand_length) > text_length) ?
+        (COLS - brand_length - text_length) / 2 : 0;
+
+    // TODO:  much of redundant output here...
+
+    move (B_TOP_LINE , 0);
+    attron (COLOR_PAIR (C_BANNER));
+    for (colnum = 0; colnum < COLS; colnum++)
+    ADDCH_REV (ASCII_SPACE);
+
+    move (B_TOP_LINE, text_position);
+    {
+        wchar_t* wideText = convertFromUTF8(text);
+        int numChars = wcslen(wideText);
+
+        int i;
+        for (i = 0; i < numChars; i++)
+        wideaddch_rev(wideText[i]);
+        free(wideText);
+    }
+
+    move (B_TOP_LINE, brand_position);
+    attron (COLOR_PAIR (C_PROG_NAME));
+    ADDCH_REV (' ');
+    ADDSTR_REV (PACKAGE);
+    ADDCH_REV (' ');
+    attron (COLOR_PAIR (C_PROG_VERSION));
+    ADDSTR_REV (VERSION);
+    refresh ();
+    attron (COLOR_PAIR (C_NORMAL));
 }

 void bind_F12 (const char *label)
 {
-  if (!label)
-     return;
+    if (!label)
+    return;

-  if (fkey_bindings [11])
-     free (fkey_bindings [11]);
-  fkey_bindings [11] = strdup (label);
-  if (! fkey_bindings [11])
-  {
-       perror ("strdup");
-       fatal_error (_("internal error in strdup"), label);
-  }
+    if (fkey_bindings [11])
+    free (fkey_bindings [11]);
+    fkey_bindings [11] = strdup (label);
+    if (! fkey_bindings [11])
+    {
+        perror ("strdup");
+        fatal_error (_("internal error in strdup"), label);
+    }
 }

 /*
@@ -306,66 +306,66 @@
 static int
 getch_fl( int cursor_char )
 {
-  int  y, x;                           /* saved cursor posn */
-  int  return_char;                    /* return value */
-  bool alternate = FALSE;              /* flashes control */
-
-  /* save the cursor position - we're going to need it */
-  getyx( stdscr, y, x );
-
-  /* if no cursor then do our best not to show one */
-  if ( cursor_char == ASCII_NULL )
-    {
-      /* degrade to cursor-less getch */
-      curs_set( 0 ); refresh();
-      move( LINES - 1, COLS - 1 );
-      cbreak();
-      get_widech(&return_char);
-      move( y, x );
-    }
-  else
-    {
-      /* produce a flashing cursor, or not, as requested */
-      if ( ! cl_term_cursor ) {
-        /* go for the flashing block here */
-        wideaddch_rev(cursor_char);
+    int        y, x;                           /* saved cursor posn */
+    int        return_char;                    /* return value */
+    bool       alternate = FALSE;              /* flashes control */
+
+    /* save the cursor position - we're going to need it */
+    getyx( stdscr, y, x );
+
+    /* if no cursor then do our best not to show one */
+    if ( cursor_char == ASCII_NULL )
+    {
+        /* degrade to cursor-less getch */
         curs_set( 0 ); refresh();
         move( LINES - 1, COLS - 1 );
-        if ( ( cl_curs_flash / 2 ) > 0 )
-          {
-            halfdelay( cl_curs_flash / 2 );
-            while ( get_widech(&return_char) == ERR )
-              {
-                move( y, x );
-                if ( alternate )
-                  wideaddch_rev(cursor_char);
-                else
-                  wideaddch(cursor_char);
-                move( LINES - 1, COLS - 1 );
-                alternate = !alternate;
-              }
-          }
-        else
-          {
-            cbreak();
-            get_widech(&return_char);
-          }
+        cbreak();
+        get_widech(&return_char);
         move( y, x );
-        wideaddch(cursor_char);
-        move( y, x );
-      }
-      else
+    }
+    else
+    {
+        /* produce a flashing cursor, or not, as requested */
+        if ( ! cl_term_cursor ) {
+            /* go for the flashing block here */
+            wideaddch_rev(cursor_char);
+            curs_set( 0 ); refresh();
+            move( LINES - 1, COLS - 1 );
+            if ( ( cl_curs_flash / 2 ) > 0 )
+            {
+                halfdelay( cl_curs_flash / 2 );
+                while ( get_widech(&return_char) == ERR )
+                {
+                    move( y, x );
+                    if ( alternate )
+                    wideaddch_rev(cursor_char);
+                    else
+                    wideaddch(cursor_char);
+                    move( LINES - 1, COLS - 1 );
+                    alternate = !alternate;
+                }
+            }
+            else
+            {
+                cbreak();
+                get_widech(&return_char);
+            }
+            move( y, x );
+            wideaddch(cursor_char);
+            move( y, x );
+        }
+        else
         {
-          /* just use the terminal's cursor - this is easy */
-          curs_set( 1 ); refresh();
-          cbreak(); //return_char = getch();
-          get_widech(&return_char);
-          curs_set( 0 ); refresh();
+            /* just use the terminal's cursor - this is easy */
+            curs_set( 1 ); refresh();
+            cbreak(); //return_char = getch();
+            get_widech(&return_char);
+            curs_set( 0 ); refresh();
         }
     }

-  /* return what key was pressed */
-  return ( return_char );
+    /* return what key was pressed */
+    return ( return_char );
 }

 /*
@@ -374,39 +374,39 @@
 */
 static bool wait_user (FILE *script, char *message, char *mode)
 {
-  int  resp;                   /* response character */
-  bool seek_done = FALSE;      /* was seek_label called? */
+    int        resp;                   /* response character */
+    bool       seek_done = FALSE;      /* was seek_label called? */

-  /* move to the message line print a prompt */
-  move( MESSAGE_LINE, 0 ); clrtoeol();
-  move( MESSAGE_LINE, COLS - utf8len( mode ) - 2 );
-  wideaddstr_rev(mode);
-  move( MESSAGE_LINE, 0 );
-  wideaddstr_rev(message);
-
-  do {
-    resp = getch_fl (ASCII_NULL);
-
-    /* in tutorial mode only, escape has the special purpose that we exit to a
-       menu (or quit if there is none) */
-    if (resp == ASCII_ESC && mode == MODE_TUTORIAL)
-    {
-      // Return to the last F12-binded location
-      if( fkey_bindings[ 11 ] && *( fkey_bindings[ 11 ] ) )
-       {
-          seek_label( script, fkey_bindings[ 11 ], NULL );
-          seek_done = TRUE;
-       }
-      else
-       do_exit( script );
-      break;
-    }
-  } while (resp != ASCII_NL && resp != ASCII_SPACE && resp != ASCII_ESC);
+    /* move to the message line print a prompt */
+    move( MESSAGE_LINE, 0 ); clrtoeol();
+    move( MESSAGE_LINE, COLS - utf8len( mode ) - 2 );
+    wideaddstr_rev(mode);
+    move( MESSAGE_LINE, 0 );
+    wideaddstr_rev(message);
+
+    do {
+        resp = getch_fl (ASCII_NULL);
+
+        /* in tutorial mode only, escape has the special purpose that we exit to a
+           menu (or quit if there is none) */
+        if (resp == ASCII_ESC && mode == MODE_TUTORIAL)
+        {
+            // Return to the last F12-binded location
+            if( fkey_bindings[ 11 ] && *( fkey_bindings[ 11 ] ) )
+            {
+                seek_label( script, fkey_bindings[ 11 ], NULL );
+                seek_done = TRUE;
+            }
+            else
+            do_exit( script );
+            break;
+        }
+    } while (resp != ASCII_NL && resp != ASCII_SPACE && resp != ASCII_ESC);

-  /* clear the message line */
-  move( MESSAGE_LINE, 0 ); clrtoeol();
+    /* clear the message line */
+    move( MESSAGE_LINE, 0 ); clrtoeol();

-  return seek_done;
+    return seek_done;
 }


@@ -414,81 +414,81 @@
   display speed and accuracy from a drill or speed test
 */
 static void display_speed( int total_chars, double elapsed_time, int errcount ) {
-  double       test_time;                      /* time in minutes */
-  double       cpm, adjusted_cpm;              /* speeds in CPM */
-  char         message[MAX_WIN_LINE];          /* buffer */
-  int          line = SPEED_LINE;              /* current line no. */
-  bool         had_best_speed = FALSE;         /* already had a p.best? */
-  bool         new_best_speed = FALSE;         /* have we beaten it? */
-  double       best_cpm;                       /* personal best speed in CPM */
-  char         *raw_speed_str, *adj_speed_str, *best_speed_str;
-
-  /* calculate the speeds */
-  test_time = elapsed_time / 60.0;
-  if( elapsed_time > 0 )
-    {
-      /* calculate speed values */
-      cpm = (double)total_chars / test_time;
-      adjusted_cpm = (double)( total_chars - ( errcount * 5 ) ) / test_time;
-
-      /* limit speed values */
-      cpm = MIN( cpm, 9999.99 );
-      adjusted_cpm = MAX( MIN( adjusted_cpm, 9999.99 ), 0 );
+    double     test_time;                      /* time in minutes */
+    double     cpm, adjusted_cpm;              /* speeds in CPM */
+    char               message[MAX_WIN_LINE];          /* buffer */
+    int                line = SPEED_LINE;              /* current line no. */
+    bool               had_best_speed = FALSE;         /* already had a p.best? */
+    bool               new_best_speed = FALSE;         /* have we beaten it? */
+    double     best_cpm;                       /* personal best speed in CPM */
+    char               *raw_speed_str, *adj_speed_str, *best_speed_str;
+
+    /* calculate the speeds */
+    test_time = elapsed_time / 60.0;
+    if( elapsed_time > 0 )
+    {
+        /* calculate speed values */
+        cpm = (double)total_chars / test_time;
+        adjusted_cpm = (double)( total_chars - ( errcount * 5 ) ) / test_time;
+
+        /* limit speed values */
+        cpm = MIN( cpm, 9999.99 );
+        adjusted_cpm = MAX( MIN( adjusted_cpm, 9999.99 ), 0 );

-      /* remove errors in adjusted speed */
-      if( adjusted_cpm < 0.01 )
+        /* remove errors in adjusted speed */
+        if( adjusted_cpm < 0.01 )
        adjusted_cpm = 0;
     }
-  else
+    else
     /* unmeasurable elapsed time - use big numbers */
     cpm = adjusted_cpm = (double)9999.99;

-  /* obtain (and update?) a personal best speed */
-  if( cl_personal_best )
+    /* obtain (and update?) a personal best speed */
+    if( cl_personal_best )
     {
-      had_best_speed =
-       get_best_speed( global_script_filename, __last_label, &best_cpm );
-      new_best_speed = ( !had_best_speed || adjusted_cpm > best_cpm ) &&
-       !is_error_too_high( total_chars, errcount );
-      if( new_best_speed )
+        had_best_speed =
+            get_best_speed( global_script_filename, __last_label, &best_cpm );
+        new_best_speed = ( !had_best_speed || adjusted_cpm > best_cpm ) &&
+            !is_error_too_high( total_chars, errcount );
+        if( new_best_speed )
        put_best_speed( global_script_filename, __last_label, adjusted_cpm );
     }

-  /* adjust display position/height */
-  line -=
-    ( had_best_speed? 1 : 0 ) +
-    ( new_best_speed? 1 : 0 );
+    /* adjust display position/height */
+    line -=
+        ( had_best_speed? 1 : 0 ) +
+        ( new_best_speed? 1 : 0 );

-  /* display everything */
-  if( cl_scoring_cpm )
+    /* display everything */
+    if( cl_scoring_cpm )
     sprintf( message, SPEED_RAW_CPM, cpm );
-  else
+    else
     sprintf( message, SPEED_RAW_WPM, cpm / (double)5.0 );
-  move( line++, COLS - utf8len( message ) - 1 );
-  ADDSTR_REV( message );
-  if( cl_scoring_cpm )
+    move( line++, COLS - utf8len( message ) - 1 );
+    ADDSTR_REV( message );
+    if( cl_scoring_cpm )
     sprintf( message, SPEED_ADJ_CPM, adjusted_cpm );
-  else
+    else
     sprintf( message, SPEED_ADJ_WPM, adjusted_cpm / (double)5.0 );
-  move( line++, COLS - utf8len( message ) - 1 );
-  ADDSTR_REV( message );
-  sprintf( message, SPEED_PCT_ERROR,
-           (double)100.0 * (double)errcount / (double)total_chars );
-  move( line++, COLS - utf8len( message ) - 1 );
-  ADDSTR_REV( message );
-  if( had_best_speed )
+    move( line++, COLS - utf8len( message ) - 1 );
+    ADDSTR_REV( message );
+    sprintf( message, SPEED_PCT_ERROR,
+        (double)100.0 * (double)errcount / (double)total_chars );
+    move( line++, COLS - utf8len( message ) - 1 );
+    ADDSTR_REV( message );
+    if( had_best_speed )
     {
-      if( cl_scoring_cpm )
+        if( cl_scoring_cpm )
        sprintf( message, SPEED_BEST_CPM, best_cpm );
-      else
+        else
        sprintf( message, SPEED_BEST_WPM, best_cpm / (double)5.0 );
-      move( line++, COLS - utf8len( message ) - 1 );
-      ADDSTR_REV( message );
+        move( line++, COLS - utf8len( message ) - 1 );
+        ADDSTR_REV( message );
     }
-  if( new_best_speed )
+    if( new_best_speed )
     {
-      move( line++, COLS - utf8len( SPEED_BEST_NEW_MSG ) - 1 );
-      ADDSTR_REV( SPEED_BEST_NEW_MSG );
+        move( line++, COLS - utf8len( SPEED_BEST_NEW_MSG ) - 1 );
+        ADDSTR_REV( SPEED_BEST_NEW_MSG );
     }
 }

@@ -497,34 +497,34 @@
 */
 static void
 do_keybind( FILE *script, char *line ) {
-  int  fkey;                           /* function key number */
-  char *label;                         /* associated label */
+    int        fkey;                           /* function key number */
+    char       *label;                         /* associated label */

-  /* extract the fkey number and label string, and check
-     the syntax and correctness of the mappings */
-  label = (char*)malloc( strlen(SCR_DATA( line )) + 1 );
-  if ( sscanf( SCR_DATA( line ), "%d:%s", &fkey, label ) != 2 )
+    /* extract the fkey number and label string, and check
+       the syntax and correctness of the mappings */
+    label = (char*)malloc( strlen(SCR_DATA( line )) + 1 );
+    if ( sscanf( SCR_DATA( line ), "%d:%s", &fkey, label ) != 2 )
     fatal_error( _("invalid key binding"), line );
-  if ( fkey < 1 || fkey > NFKEYS )
+    if ( fkey < 1 || fkey > NFKEYS )
     fatal_error( _("invalid function key number"), line );

-  /* free the previous binding malloced data */
-  if ( fkey_bindings[ fkey - 1 ] != NULL )
+    /* free the previous binding malloced data */
+    if ( fkey_bindings[ fkey - 1 ] != NULL )
     {
-      free( fkey_bindings[ fkey - 1 ] );
-      fkey_bindings[ fkey - 1 ] = NULL;
+        free( fkey_bindings[ fkey - 1 ] );
+        fkey_bindings[ fkey - 1 ] = NULL;
     }

-  /* add the association to the array, or unbind the association
-     if the target is the special label "NULL" (ugh - hacky) */
-  if ( strcmp( label, "NULL" ) != 0 && strcmp( label, "null" ) != 0 )
+    /* add the association to the array, or unbind the association
+       if the target is the special label "NULL" (ugh - hacky) */
+    if ( strcmp( label, "NULL" ) != 0 && strcmp( label, "null" ) != 0 )
     fkey_bindings[ fkey - 1 ] = label;
-  else
+    else
     free( label );

-  /* get the next command */
-  get_script_line( script, line );
-  global_prior_command = C_KEYBIND;
+    /* get the next command */
+    get_script_line( script, line );
+    global_prior_command = C_KEYBIND;
 }


@@ -533,35 +533,35 @@
 */
 static void
 do_tutorial( FILE *script, char *line ) {
-  int  linenum;                /* line counter */
-  bool  seek_done = FALSE;      /* was there a seek_label before exit? */
+    int        linenum;                /* line counter */
+    bool  seek_done = FALSE;      /* was there a seek_label before exit? */

-  /* start at the top of the screen, and clear it */
-  linenum = T_TOP_LINE;
-  move( linenum, 0 ); clrtobot();
+    /* start at the top of the screen, and clear it */
+    linenum = T_TOP_LINE;
+    move( linenum, 0 ); clrtobot();

-  /* output this line, and each continuation line read */
-  do
+    /* output this line, and each continuation line read */
+    do
     {
-      if ( linenum >= LINES - 1 )
+        if ( linenum >= LINES - 1 )
        fatal_error( _("data exceeds screen length"), line );
-      move( linenum, 0 );
-      /* ADDSTR( SCR_DATA( line )); */
-      wideaddstr(SCR_DATA( line ));
-      get_script_line( script, line );
-      linenum++;
-    }
-  while ( SCR_COMMAND( line ) == C_CONT && ! feof( script ));
-
-  /* wait for a return, unless the next command is a query,
-     when we can skip it to save the user keystrokes */
-  if ( SCR_COMMAND( line ) != C_QUERY )
+        move( linenum, 0 );
+        /* ADDSTR( SCR_DATA( line )); */
+        wideaddstr(SCR_DATA( line ));
+        get_script_line( script, line );
+        linenum++;
+    }
+    while ( SCR_COMMAND( line ) == C_CONT && ! feof( script ));
+
+    /* wait for a return, unless the next command is a query,
+       when we can skip it to save the user keystrokes */
+    if ( SCR_COMMAND( line ) != C_QUERY )
     seek_done = wait_user (script, WAIT_MESSAGE, MODE_TUTORIAL);
-  global_prior_command = C_TUTORIAL;
+    global_prior_command = C_TUTORIAL;

-  /* if seek_label has been called (in wait_user) then we need to read in the
-     next line of the script in to `line` */
-  if (seek_done)
+    /* if seek_label has been called (in wait_user) then we need to read in the
+       next line of the script in to `line` */
+    if (seek_done)
     get_script_line( script, line );
 }

@@ -572,23 +572,23 @@
 static void
 do_instruction( FILE *script, char *line ) {

-  /* move to the instruction line and output the first bit */
-  move( I_TOP_LINE, 0 ); clrtobot();
-  ADDSTR( SCR_DATA( line ));
-  get_script_line( script, line );
+    /* move to the instruction line and output the first bit */
+    move( I_TOP_LINE, 0 ); clrtobot();
+    ADDSTR( SCR_DATA( line ));
+    get_script_line( script, line );

-  /* if there is a second line then output that too */
-  if ( SCR_COMMAND( line ) == C_CONT && ! feof( script ))
+    /* if there is a second line then output that too */
+    if ( SCR_COMMAND( line ) == C_CONT && ! feof( script ))
     {
-      move( I_TOP_LINE + 1, 0 );
-      ADDSTR( SCR_DATA( line ) );
-      get_script_line( script, line );
+        move( I_TOP_LINE + 1, 0 );
+        ADDSTR( SCR_DATA( line ) );
+        get_script_line( script, line );
     }

-  /* if there is a third line then complain */
-  if ( SCR_COMMAND( line ) == C_CONT && ! feof( script ))
+    /* if there is a third line then complain */
+    if ( SCR_COMMAND( line ) == C_CONT && ! feof( script ))
     fatal_error( _("instructions are limited to two lines"), line );
-  global_prior_command = C_INSTRUCTION;
+    global_prior_command = C_INSTRUCTION;
 }

 /*
@@ -597,20 +597,20 @@
 */
 static int
 is_error_too_high( int chars_typed, int errors ) {
-  /* (double)100.0*(double)errcount / (double)total_chars ) */
-  double err_max, err;
-  char buf[BUFSIZ];
-
-  /* Calculate error rates */
-  err_max = (double)global_error_max;
-  err = (double)100.0*(double)errors / (double)chars_typed;
-
-  /* We need to use the same kind of rounding used by printf. */
-  sprintf(buf, "%.1f", err_max);
-  sscanf(buf, "%lf", &err_max);
-  sprintf(buf, "%.1f", err);
-  sscanf(buf, "%lf", &err);
-  return err > err_max;
+    /* (double)100.0*(double)errcount / (double)total_chars ) */
+    double err_max, err;
+    char buf[BUFSIZ];
+
+    /* Calculate error rates */
+    err_max = (double)global_error_max;
+    err = (double)100.0*(double)errors / (double)chars_typed;
+
+    /* We need to use the same kind of rounding used by printf. */
+    sprintf(buf, "%.1f", err_max);
+    sscanf(buf, "%lf", &err_max);
+    sprintf(buf, "%.1f", err);
+    sscanf(buf, "%lf", &err);
+    return err > err_max;
 }

 /*
@@ -618,283 +618,320 @@
 */
 static void
 do_drill( FILE *script, char *line ) {
-
-  int  errors = 0;              /* error count */
-  int  linenum;                 /* line counter */
-  char *data = ""           /* data string */
-  int  lines_count = 0;         /* measures drill length */
-  int  rc;                      /* curses char typed */
-  wchar_t  *widep, *wideData;
-  double start_time=0, end_time; /* timing variables */
-  char message[MAX_WIN_LINE];   /* message buffer */
-  char drill_type;              /* note of the drill type */
-  int  chars_typed;             /* count of chars typed */
-  int  chars_in_the_line_typed;
-  bool  seek_done = FALSE;       /* was there a seek_label before exit? */
-  int  error_sync;              /* error resync state */
-  struct timeval tv;
-
-  /* note the drill type to see if we need to make the user repeat */
-  drill_type = SCR_COMMAND( line );
-
-  /* get the complete exercise into a single string */
-  data = "" script, line );
-
-  /* get the exercise as a wide string */
-  wideData = convertFromUTF8(data);
-  int numChars = wcslen(wideData);
-
-  /* count the lines in this exercise, and check the result
-     against the screen length */
-  for ( widep = wideData, lines_count = 0; *widep != ASCII_NULL; widep++ )
+    int halfchrs=0;              /* half character count */
+    int allchrs=0;               /*   */
+    int        errors = 0;              /* error count */
+    int        linenum;                 /* line counter */
+    char       *data = ""           /* data string */
+    int        lines_count = 0;         /* measures drill length */
+    int        rc;                      /* curses char typed */
+    wchar_t  *widep, *wideData;
+    double start_time=0, end_time; /* timing variables */
+    char       message[MAX_WIN_LINE];   /* message buffer */
+    char       drill_type;              /* note of the drill type */
+    int        chars_typed;             /* count of chars typed */
+    int        chars_in_the_line_typed;
+    bool  seek_done = FALSE;       /* was there a seek_label before exit? */
+    int        error_sync;              /* error resync state */
+    struct timeval tv;
+
+    /* note the drill type to see if we need to make the user repeat */
+    drill_type = SCR_COMMAND( line );
+
+    /* get the complete exercise into a single string */
+    data = "" script, line );
+
+    /* get the exercise as a wide string */
+    wideData = convertFromUTF8(data);
+    int numChars = wcslen(wideData);
+
+    /* count the lines in this exercise, and check the result
+       against the screen length */
+    for ( widep = wideData, lines_count = 0; *widep != ASCII_NULL; widep++ )
     {
-      if ( *widep == ASCII_NL)
+        if ( *widep == ASCII_NL)
         lines_count++;
     }
-  if ( DP_TOP_LINE + lines_count * 2 > LINES )
+    if ( DP_TOP_LINE + lines_count * 2 > LINES )
     fatal_error( _("data exceeds screen length"), line );

-  /* if the last command was a tutorial, ensure we have
-     the complete screen */
-  if ( global_prior_command == C_TUTORIAL )
+    /* if the last command was a tutorial, ensure we have
+       the complete screen */
+    if ( global_prior_command == C_TUTORIAL )
     {
-      move( T_TOP_LINE, 0 ); clrtobot();
+        move( T_TOP_LINE, 0 ); clrtobot();
     }

-  while (1)
+    while (1)
     {

-      /* display drill pattern */
-      linenum = DP_TOP_LINE;
-      move( linenum, 0 ); clrtobot();
-      for ( widep = wideData; *widep != ASCII_NULL; widep++ )
+        /* display drill pattern */
+        linenum = DP_TOP_LINE;
+        move( linenum, 0 ); clrtobot();
+        for ( widep = wideData; *widep != ASCII_NULL; widep++ )
         {
-          if ( *widep != ASCII_NL )
+            if ( *widep != ASCII_NL )
             wideaddch(*widep);
-          else
-          {
-              /* emit return character */
-              wideaddch(RETURN_CHARACTER);
-
-              /* newline - move down the screen */
-              linenum++; linenum++;    /* alternate lines */
-              move( linenum, 0 );
-          }
+            else
+            {
+                /* emit return character */
+                wideaddch(RETURN_CHARACTER);
+
+                /* newline - move down the screen */
+                linenum++; linenum++;  /* alternate lines */
+                move( linenum, 0 );
+            }
         }
-      move( MESSAGE_LINE, COLS - utf8len( MODE_DRILL ) - 2 );
-      ADDSTR_REV( MODE_DRILL );
+        move( MESSAGE_LINE, COLS - utf8len( MODE_DRILL ) - 2 );
+        ADDSTR_REV( MODE_DRILL );

-      /* run the drill */
-      linenum = DP_TOP_LINE + 1;
-      move( linenum, 0 );
-      for ( widep = wideData; *widep == ASCII_SPACE && *widep != ASCII_NULL; widep++ )
+        /* run the drill */
+        linenum = DP_TOP_LINE + 1;
+        move( linenum, 0 );
+        for ( widep = wideData; *widep == ASCII_SPACE && *widep != ASCII_NULL; widep++ )
         wideaddch(*widep);

-      for ( chars_typed = 0, errors = 0, error_sync = 0,
-              chars_in_the_line_typed = 0;
-            *widep != ASCII_NULL; widep++ )
+        for ( chars_typed = 0, errors = 0, error_sync = 0, halfchrs=0,allchrs=0,
+                  chars_in_the_line_typed = 0;
+              *widep != ASCII_NULL; widep++ )
         {
-          do
+            int x,y;
+            getyx(stdscr,y,x);
+            if(halfchrs+allchrs ==0)
+            {
+                move(linenum-1,0);
+            }
+            else if(*widep!=ASCII_NL)
+            {
+                move(linenum-1,*(widep-1)>0x7e ? halfchrs+allchrs*2-2:halfchrs+allchrs*2-1);
+                wideaddch(*(widep-1));
+            }
+            if(*widep!=ASCII_NL)
             {
-              rc = getch_fl (chars_in_the_line_typed >= COLS ? *(widep + 1) :
-                             (*widep == ASCII_TAB ? ASCII_TAB : ASCII_SPACE));
+                attron(A_REVERSE);
+                wideaddch(*widep);
+                attroff(A_REVERSE);
             }
-          while ( rc == GTYPIST_KEY_BACKSPACE || rc == ASCII_BS || rc == ASCII_DEL );
+            move(y,x);

-          /* start timer on first char entered */
-          if ( chars_typed == 0 )
+            clrtoeol();
+            do
             {
-              gettimeofday(&tv, NULL);
-              start_time = tv.tv_sec + tv.tv_usec / 1000000.0;
+                rc = getch_fl (chars_in_the_line_typed >= COLS ? *(widep + 1) :
+                    (*widep == ASCII_TAB ? ASCII_TAB : ASCII_SPACE));
             }
-          chars_typed++;
-          error_sync--;
+            while ( rc == GTYPIST_KEY_BACKSPACE || rc == ASCII_BS || rc == ASCII_DEL );

-          /* ESC is "give up"; ESC at beginning of exercise is "skip lesson"
-             (this is handled outside the for loop) */
-          if ( rc == ASCII_ESC )
+            if (*widep>=0x20 && *widep<=0x7e)
+            {
+                halfchrs++;
+            }
+            else if(*widep>0x7e)
+            {
+                allchrs++;
+            }
+
+            /* start timer on first char entered */
+            if ( chars_typed == 0 )
+            {
+                gettimeofday(&tv, NULL);
+                start_time = tv.tv_sec + tv.tv_usec / 1000000.0;
+            }
+            chars_typed++;
+            error_sync--;
+
+            /* ESC is "give up"; ESC at beginning of exercise is "skip lesson"
+               (this is handled outside the for loop) */
+            if ( rc == ASCII_ESC )
             break;

-          /* check that the character was correct */
-          if ( rc == *widep ||
-               ( cl_wp_emu && rc == ASCII_SPACE && *widep == ASCII_NL ))
+            /* check that the character was correct */
+            if ( rc == *widep ||
+                ( cl_wp_emu && rc == ASCII_SPACE && *widep == ASCII_NL ))
             {
-              if (cl_wp_emu && rc == ASCII_SPACE && *widep == ASCII_NL)
+                if (cl_wp_emu && rc == ASCII_SPACE && *widep == ASCII_NL)
                 chars_in_the_line_typed = 0;
-              else
+                else
                 {
-                  if (rc != ASCII_NL)
+                    if (rc != ASCII_NL)
                     {
-                      wideaddch(rc);
-                      chars_in_the_line_typed ++;
+                        wideaddch(rc);
+                        chars_in_the_line_typed ++;
                     }
-                  else
+                    else
                     {
-                      wideaddch(RETURN_CHARACTER);
-                      chars_in_the_line_typed = 0;
+                        wideaddch(RETURN_CHARACTER);
+                        chars_in_the_line_typed = 0;
                     }
                 }
             }
-          else
+            else
             {
-              /* try to sync with typist behind */
-              if ( error_sync >= 0 && widep > wideData && rc == *(widep-1) )
-                {
-                  widep--;
-                  continue;
-                }
+                /* try to sync with typist behind */
+                /* if ( error_sync >= 0 && widep > wideData && rc == *(widep-1) ) */
+                /* { */
+                /*     widep--; */
+                /*     continue; */
+                /* } */

-              if (chars_in_the_line_typed < COLS)
+                if (chars_in_the_line_typed < COLS)
                 {
-                  wideaddch_rev( *widep == ASCII_NL ? DRILL_NL_ERR :
-                                 (*widep == ASCII_TAB ?
-                                  ASCII_TAB : (cl_rev_video_errors ?
-                                               rc : DRILL_CH_ERR)));
-                  chars_in_the_line_typed ++;
+                    wideaddch_rev( *widep == ASCII_NL ? DRILL_NL_ERR :
+                        (*widep == ASCII_TAB ?
+                            ASCII_TAB : (cl_rev_video_errors ? (*widep>=0x20 && *widep<=0x7e ?
+                                DRILL_CH_ERR: rc):rc)));
+                    chars_in_the_line_typed ++;
                 }

-              if (*widep == ASCII_NL)
+                if (*widep == ASCII_NL)
                 chars_in_the_line_typed = 0;

-              if ( ! cl_silent )
+                if ( ! cl_silent )
                 {
-                  do_bell();
+                    do_bell();
                 }
-              errors++;
-              error_sync = 1;
+                errors++;
+                error_sync = 1;

-              /* try to sync with typist ahead */
-              if ( rc == *(widep+1) )
+                /* try to sync with typist ahead */
+                if ( rc == *(widep+1) )
                 {
-                  ungetch( rc );
-                  error_sync++;
+                    ungetch( rc );
+                    error_sync++;
                 }
             }

-          /* move screen location if newline */
-          if ( *widep == ASCII_NL )
+            getyx(stdscr,y,x);
+            if(y==linenum+1)
+            {
+                move(y+1,x);
+            }
+
+            /* move screen location if newline */
+            if ( *widep == ASCII_NL )
             {
-              linenum++; linenum++;
-              move( linenum, 0 );
+                linenum++; linenum++;
+                halfchrs=0;allchrs=0;
+                move( linenum, 0 );
             }

-          /* perform any other word processor like adjustments */
-          if ( cl_wp_emu )
+            /* perform any other word processor like adjustments */
+            if ( cl_wp_emu )
             {
-              if ( rc == ASCII_SPACE )
+                if ( rc == ASCII_SPACE )
                 {
-                  while ( *(widep+1) == ASCII_SPACE
-                          && *(widep+1) != ASCII_NULL )
+                    while ( *(widep+1) == ASCII_SPACE
+                        && *(widep+1) != ASCII_NULL )
                     {
-                      widep++;
-                      wideaddch(*widep);
-                      chars_in_the_line_typed ++;
+                        widep++;
+                        wideaddch(*widep);
+                        chars_in_the_line_typed ++;
                     }
                 }
-              else if ( rc == ASCII_NL )
+                else if ( rc == ASCII_NL )
                 {
-                  while ( ( *(widep+1) == ASCII_SPACE
+                    while ( ( *(widep+1) == ASCII_SPACE
                             || *(widep+1) == ASCII_NL )
-                          && *(widep+1) != ASCII_NULL )
+                        && *(widep+1) != ASCII_NULL )
                     {
-                      widep++;
-                      wideaddch(*widep);
-                      chars_in_the_line_typed ++;
-                      if ( *widep == ASCII_NL ) {
-                        linenum++; linenum++;
-                        move( linenum, 0 );
-                        chars_in_the_line_typed = 0;
-                      }
+                        widep++;
+                        wideaddch(*widep);
+                        chars_in_the_line_typed ++;
+                        if ( *widep == ASCII_NL ) {
+                            linenum++; linenum++;
+                            move( linenum, 0 );
+                            chars_in_the_line_typed = 0;
+                        }
                     }
                 }
-              else if ( isalpha(*widep) && *(widep+1) == ASCII_DASH
-                        && *(widep+2) == ASCII_NL )
+                else if ( isalpha(*widep) && *(widep+1) == ASCII_DASH
+                    && *(widep+2) == ASCII_NL )
                 {
-                  widep++;
-                  wideaddch(*widep);
-                  widep++;
-                  wideaddch(*widep);
-                  linenum++; linenum++;
-                  move( linenum, 0 );
-                  chars_in_the_line_typed = 0;
+                    widep++;
+                    wideaddch(*widep);
+                    widep++;
+                    wideaddch(*widep);
+                    linenum++; linenum++;
+                    move( linenum, 0 );
+                    chars_in_the_line_typed = 0;
                 }
             }
         }

-      /* ESC not at the beginning of the lesson: "give up" */
-      if ( rc == ASCII_ESC && chars_typed != 1)
+        /* ESC not at the beginning of the lesson: "give up" */
+        if ( rc == ASCII_ESC && chars_typed != 1)
         continue; /* repeat */

-      /* skip timings and don't check error-pct if exit was through ESC */
-      if ( rc != ASCII_ESC )
+        /* skip timings and don't check error-pct if exit was through ESC */
+        if ( rc != ASCII_ESC )
         {
-          /* display timings */
-          gettimeofday(&tv, NULL);
-          end_time = tv.tv_sec + tv.tv_usec / 1000000.0;
-          if ( ! cl_notimer )
+            /* display timings */
+            gettimeofday(&tv, NULL);
+            end_time = tv.tv_sec + tv.tv_usec / 1000000.0;
+            if ( ! cl_notimer )
             {
-              display_speed( chars_typed, end_time - start_time,
-                             errors );
+                display_speed( chars_typed, end_time - start_time,
+                    errors );
             }

-          /* check whether the error-percentage is too high (unless in d:) */
-          if (drill_type != C_DRILL_PRACTICE_ONLY &&
-              is_error_too_high(chars_typed, errors))
+            /* check whether the error-percentage is too high (unless in d:) */
+            if (drill_type != C_DRILL_PRACTICE_ONLY &&
+                is_error_too_high(chars_typed, errors))
             {
-              sprintf( message, ERROR_TOO_HIGH_MSG, global_error_max );
-              wait_user (script, message, MODE_DRILL);
+                sprintf( message, ERROR_TOO_HIGH_MSG, global_error_max );
+                wait_user (script, message, MODE_DRILL);

-              /* check for F-command */
-              if (global_on_failure_label != NULL)
+                /* check for F-command */
+                if (global_on_failure_label != NULL)
                 {
-                  /* move to the label position in the file */
-                  if (fseek(script, global_on_failure_label->offset, SEEK_SET )
-                      == -1)
+                    /* move to the label position in the file */
+                    if (fseek(script, global_on_failure_label->offset, SEEK_SET )
+                        == -1)
                     fatal_error( _("internal error: fseek"), NULL );
-                  global_line_counter = global_on_failure_label->line_count;
-                  /* tell the user about the misery :) */
-                  sprintf(message,SKIPBACK_VIA_F_MSG,
-                          global_on_failure_label->label);
-                  /* reset value unless persistent */
-                  if (!global_on_failure_label_persistent)
+                    global_line_counter = global_on_failure_label->line_count;
+                    /* tell the user about the misery :) */
+                    sprintf(message,SKIPBACK_VIA_F_MSG,
+                        global_on_failure_label->label);
+                    /* reset value unless persistent */
+                    if (!global_on_failure_label_persistent)
                     global_on_failure_label = NULL;
-                  wait_user (script, message, MODE_DRILL);
-                  seek_done = TRUE;
-                  break;
+                    wait_user (script, message, MODE_DRILL);
+                    seek_done = TRUE;
+                    break;
                 }

-              continue;
+                continue;
             }
         }

-      /* ask the user whether he/she wants to repeat or exit */
-      if ( rc == ASCII_ESC && cl_no_skip ) /* honor --no-skip */
+        /* ask the user whether he/she wants to repeat or exit */
+        if ( rc == ASCII_ESC && cl_no_skip ) /* honor --no-skip */
         rc = do_query_repeat (script, FALSE);
-      else
+        else
         rc = do_query_repeat (script, TRUE);
-      if (rc == 'E') {
-        seek_done = TRUE;
-        break;
-      }
-      if (rc == 'N')
+        if (rc == 'E') {
+            seek_done = TRUE;
+            break;
+        }
+        if (rc == 'N')
         break;

     }

-  /* free the malloced memory */
-  free( data );
-  free( wideData );
+    /* free the malloced memory */
+    free( data );
+    free( wideData );

-  /* reset global_error_max */
-  if (!global_error_max_persistent)
+    /* reset global_error_max */
+    if (!global_error_max_persistent)
     global_error_max = cl_default_error_max;

-  /* buffer_command takes care of advancing `script' (and setting
-     `line'), so we only do if seek_label had been called (in
-     do_query_repeat or due to a failure and an F: command) */
-  if (seek_done)
+    /* buffer_command takes care of advancing `script' (and setting
+       `line'), so we only do if seek_label had been called (in
+       do_query_repeat or due to a failure and an F: command) */
+    if (seek_done)
     get_script_line( script, line );
-  global_prior_command = drill_type;
+    global_prior_command = drill_type;
 }


@@ -903,274 +940,287 @@
 */
 static void
 do_speedtest( FILE *script, char *line ) {
-  int  errors = 0;              /* error count */
-  int  linenum;                 /* line counter */
-  char *data = ""           /* data string */
-  int  lines_count = 0;         /* measures exercise length */
-  int  rc;                      /* curses char typed */
-  wchar_t  *widep, *wideData;
-  double start_time=0, end_time; /* timing variables */
-  char message[MAX_WIN_LINE];   /* message buffer */
-  char drill_type;              /* note of the drill type */
-  int  chars_typed;             /* count of chars typed */
-  bool  seek_done = FALSE;       /* was there a seek_label before exit? */
-  int  error_sync;              /* error resync state */
-  struct timeval tv;
-
-  /* note the drill type to see if we need to make the user repeat */
-  drill_type = SCR_COMMAND( line );
-
-  /* get the complete exercise into a single string */
-  data = "" script, line );
-
-  wideData = convertFromUTF8(data);
-  int numChars = wcslen(wideData);
-
-  /*
-    fprintf(F, "convresult=%d\n", convresult);
-    fprintf(F, "wideData='%ls'\n", wideData);
-    int i;
-    for (i = 0; i <= numChars; i++) {
-    fprintf(F, "wideData[%d]=%d\n", i, wideData[i]);
-    }
-  */
+    int        errors = 0;              /* error count */
+    int        linenum;                 /* line counter */
+    char       *data = ""           /* data string */
+    int        lines_count = 0;         /* measures exercise length */
+    int        rc;                      /* curses char typed */
+    wchar_t  *widep, *wideData;
+    double start_time=0, end_time; /* timing variables */
+    char       message[MAX_WIN_LINE];   /* message buffer */
+    char       drill_type;              /* note of the drill type */
+    int        chars_typed;             /* count of chars typed */
+    bool  seek_done = FALSE;       /* was there a seek_label before exit? */
+    int        error_sync;              /* error resync state */
+    struct timeval tv;
+
+    /* note the drill type to see if we need to make the user repeat */
+    drill_type = SCR_COMMAND( line );

-  /* count the lines in this exercise, and check the result
-     against the screen length */
-  for ( widep = wideData, lines_count = 0; *widep != ASCII_NULL; widep++ )
+    /* get the complete exercise into a single string */
+    data = "" script, line );
+
+    wideData = convertFromUTF8(data);
+    int numChars = wcslen(wideData);
+
+    /*
+      fprintf(F, "convresult=%d\n", convresult);
+      fprintf(F, "wideData='%ls'\n", wideData);
+      int i;
+      for (i = 0; i <= numChars; i++) {
+      fprintf(F, "wideData[%d]=%d\n", i, wideData[i]);
+      }
+    */
+
+    /* count the lines in this exercise, and check the result
+       against the screen length */
+    for ( widep = wideData, lines_count = 0; *widep != ASCII_NULL; widep++ )
     {
-      if ( *widep == ASCII_NL)
+        if ( *widep == ASCII_NL)
         lines_count++;
     }
-  if ( DP_TOP_LINE + lines_count > LINES )
+    if ( DP_TOP_LINE + lines_count > LINES )
     fatal_error( _("data exceeds screen length"), line );

-  /* if the last command was a tutorial, ensure we have
-     the complete screen */
-  if ( global_prior_command == C_TUTORIAL )
+    /* if the last command was a tutorial, ensure we have
+       the complete screen */
+    if ( global_prior_command == C_TUTORIAL )
     {
-      move( T_TOP_LINE, 0 ); clrtobot();
+        move( T_TOP_LINE, 0 ); clrtobot();
     }

-  while (1)
+    while (1)
     {
-      /* display speed test pattern */
-      linenum = DP_TOP_LINE;
-      move( linenum, 0 ); clrtobot();
-      for ( widep = wideData; *widep != ASCII_NULL; widep++ )
+        /* display speed test pattern */
+        linenum = DP_TOP_LINE;
+        move( linenum, 0 ); clrtobot();
+        for ( widep = wideData; *widep != ASCII_NULL; widep++ )
         {
-          if ( *widep != ASCII_NL )
+            if ( *widep != ASCII_NL )
             {
-              wideaddch(*widep);
+                wideaddch(*widep);
             }
-          else
+            else
             {
-              /* emit return character */
-              wideaddch(RETURN_CHARACTER);
+                /* emit return character */
+                wideaddch(RETURN_CHARACTER);

-              /* newline - move down the screen */
-              linenum++;
-              move( linenum, 0 );
+                /* newline - move down the screen */
+                linenum++;
+                move( linenum, 0 );
             }
         }
-      move( MESSAGE_LINE, COLS - utf8len( MODE_SPEEDTEST ) - 2 );
-      ADDSTR_REV( MODE_SPEEDTEST );
+        move( MESSAGE_LINE, COLS - utf8len( MODE_SPEEDTEST ) - 2 );
+        ADDSTR_REV( MODE_SPEEDTEST );

-      /* run the data */
-      linenum = DP_TOP_LINE;
-      move( linenum, 0 );
-      for ( widep = wideData; *widep == ASCII_SPACE && *widep != ASCII_NULL; widep++ )
+        /* run the data */
+        linenum = DP_TOP_LINE;
+        move( linenum, 0 );
+        for ( widep = wideData; *widep == ASCII_SPACE && *widep != ASCII_NULL; widep++ )
         wideaddch(*widep);

-      for ( chars_typed = 0, errors = 0, error_sync = 0;
-            *widep != ASCII_NULL; widep++ )
+        for ( chars_typed = 0, errors = 0, error_sync = 0;
+              *widep != ASCII_NULL; widep++ )
         {
-          rc = getch_fl( (*widep != ASCII_NL) ? *widep : RETURN_CHARACTER );
+            rc = getch_fl( (*widep != ASCII_NL) ? *widep : RETURN_CHARACTER );

-          /* start timer on first char entered */
-          if ( chars_typed == 0 )
+            /* start timer on first char entered */
+            if ( chars_typed == 0 )
             {
-              gettimeofday(&tv, NULL);
-              start_time = tv.tv_sec + tv.tv_usec / 1000000.0;
+                gettimeofday(&tv, NULL);
+                start_time = tv.tv_sec + tv.tv_usec / 1000000.0;
             }
-          chars_typed++;
-          error_sync--;
+            chars_typed++;
+            error_sync--;

-          /* check for delete keys if not at line start or
-             speed test start */
-          if ( rc == GTYPIST_KEY_BACKSPACE || rc == ASCII_BS || rc == ASCII_DEL )
+            int x,y;
+            /* check for delete keys if not at line start or
+               speed test start */
+            if ( rc == GTYPIST_KEY_BACKSPACE || rc == ASCII_BS || rc == ASCII_DEL )
             {
-              /* just ignore deletes where it's impossible or hard */
-              if ( widep > wideData && *(widep-1) != ASCII_NL && *(widep-1) != ASCII_TAB ) {
-                /* back up one character */
-                ADDCH( ASCII_BS ); widep--;
-              }
-              widep--;         /* defeat widep++ coming up */
-              continue;
+                /* just ignore deletes where it's impossible or hard */
+                if ( widep > wideData && *(widep-1) != ASCII_NL && *(widep-1) != ASCII_TAB ) {
+                    /* back up one character */
+                    getyx(stdscr,y,x);
+                    if(*(widep-1)>0x7e)
+                    {
+                        move(y,x-2);
+                    }
+                    else
+                    {
+                        move(y,x-1);
+                    }
+                    widep--;
+                    getyx(stdscr,y,x);
+                    wideaddch(*widep);
+                    move(y,x);
+                    widep--;
+                }
+                continue;
             }

-          /* ESC is "give up"; ESC at beginning of exercise is "skip lesson"
-             (this is handled outside the for loop) */
-          if ( rc == ASCII_ESC )
+            /* ESC is "give up"; ESC at beginning of exercise is "skip lesson"
+               (this is handled outside the for loop) */
+            if ( rc == ASCII_ESC )
             break;

-          /* check that the character was correct */
-          if ( rc == *widep
-               || ( cl_wp_emu && rc == ASCII_SPACE && *widep == ASCII_NL ))
-          { /* character is correct */
-            if (*widep == ASCII_NL)
-            {
-                wideaddch(RETURN_CHARACTER);
+            /* check that the character was correct */
+            if ( rc == *widep
+                || ( cl_wp_emu && rc == ASCII_SPACE && *widep == ASCII_NL ))
+            { /* character is correct */
+                if (*widep == ASCII_NL)
+                {
+                    wideaddch(RETURN_CHARACTER);
+                }
+                else
+                {
+                    wideaddch(rc);
+                }
             }
             else
-            {
-                wideaddch(rc);
-            }
-          }
-          else
             { /* character is incorrect */
               /* try to sync with typist behind */
-              if ( error_sync >= 0 && widep > wideData && rc == *(widep-1) )
+              /*  if ( error_sync >= 0 && widep > wideData && rc == *(widep-1) )
                 {
-                  widep--;
-                  continue;
-                }
+                    widep--;
+                    continue;
+                }  */

-              wideaddch_rev(*widep == ASCII_NL ? RETURN_CHARACTER : *widep);
+                wideaddch_rev(*widep == ASCII_NL ? RETURN_CHARACTER : *widep);

-              if ( ! cl_silent ) {
-                do_bell();
-              }
-              errors++;
-              error_sync = 1;
+                if ( ! cl_silent ) {
+                    do_bell();
+                }
+                errors++;
+                error_sync = 1;

-              /* try to sync with typist ahead */
-              if ( rc == *(widep+1) )
+                /* try to sync with typist ahead */
+                if ( rc == *(widep+1) )
                 {
-                  ungetch( rc );
-                  error_sync++;
+                    ungetch( rc );
+                    error_sync++;
                 }
             }

-          /* move screen location if newline */
-          if ( *widep == ASCII_NL )
+            /* move screen location if newline */
+            if ( *widep == ASCII_NL )
             {
-              linenum++;
-              move( linenum, 0 );
+                linenum++;
+                move( linenum, 0 );
             }

-          /* perform any other word processor like adjustments */
-          if ( cl_wp_emu )
+            /* perform any other word processor like adjustments */
+            if ( cl_wp_emu )
             {
-              if ( rc == ASCII_SPACE )
+                if ( rc == ASCII_SPACE )
                 {
-                  while ( *(widep+1) == ASCII_SPACE
-                          && *(widep+1) != ASCII_NULL )
+                    while ( *(widep+1) == ASCII_SPACE
+                        && *(widep+1) != ASCII_NULL )
                     {
-                      widep++;
-                      wideaddch(*widep);
+                        widep++;
+                        wideaddch(*widep);
                     }
                 }
-              else if ( rc == ASCII_NL )
+                else if ( rc == ASCII_NL )
                 {
-                  while ( ( *(widep+1) == ASCII_SPACE
+                    while ( ( *(widep+1) == ASCII_SPACE
                             || *(widep+1) == ASCII_NL )
-                          && *(widep+1) != ASCII_NULL )
+                        && *(widep+1) != ASCII_NULL )
                     {
-                      widep++;
-                      wideaddch(*widep);
-                      if ( *widep == ASCII_NL )
+                        widep++;
+                        wideaddch(*widep);
+                        if ( *widep == ASCII_NL )
                         {
-                          linenum++;
-                          move( linenum, 0 );
+                            linenum++;
+                            move( linenum, 0 );
                         }
                     }
                 }
-              else if ( isalpha(*widep) && *(widep+1) == ASCII_DASH
-                        && *(widep+2) == ASCII_NL )
+                else if ( isalpha(*widep) && *(widep+1) == ASCII_DASH
+                    && *(widep+2) == ASCII_NL )
                 {
-                  widep++;
-                  wideaddch(*widep);
-                  widep++;
-                  wideaddch(*widep);
-                  linenum++;
-                  move( linenum, 0 );
+                    widep++;
+                    wideaddch(*widep);
+                    widep++;
+                    wideaddch(*widep);
+                    linenum++;
+                    move( linenum, 0 );
                 }
             }
         }


-      /* ESC not at the beginning of the lesson: "give up" */
-      if ( rc == ASCII_ESC && chars_typed != 1)
+        /* ESC not at the beginning of the lesson: "give up" */
+        if ( rc == ASCII_ESC && chars_typed != 1)
         continue; /* repeat */

-      /* skip timings and don't check error-pct if exit was through ESC */
-      if ( rc != ASCII_ESC )
+        /* skip timings and don't check error-pct if exit was through ESC */
+        if ( rc != ASCII_ESC )
         {
-          /* display timings */
-          gettimeofday(&tv, NULL);
-          end_time = tv.tv_sec + tv.tv_usec / 1000000.0;
-          display_speed( chars_typed, end_time - start_time,
-                         errors );
-
-          /* check whether the error-percentage is too high (unless in s:) */
-          if (drill_type != C_SPEEDTEST_PRACTICE_ONLY &&
-              is_error_too_high(chars_typed, errors))
-            {
-              sprintf( message, ERROR_TOO_HIGH_MSG, global_error_max );
-              wait_user (script, message, MODE_SPEEDTEST);
-
-              /* check for F-command */
-              if (global_on_failure_label != NULL)
-                {
-                  /* move to the label position in the file */
-                  if (fseek(script, global_on_failure_label->offset, SEEK_SET )
-                      == -1)
+            /* display timings */
+            gettimeofday(&tv, NULL);
+            end_time = tv.tv_sec + tv.tv_usec / 1000000.0;
+            display_speed( chars_typed, end_time - start_time,
+                errors );
+
+            /* check whether the error-percentage is too high (unless in s:) */
+            if (drill_type != C_SPEEDTEST_PRACTICE_ONLY &&
+                is_error_too_high(chars_typed, errors))
+            {
+                sprintf( message, ERROR_TOO_HIGH_MSG, global_error_max );
+                wait_user (script, message, MODE_SPEEDTEST);
+
+                /* check for F-command */
+                if (global_on_failure_label != NULL)
+                {
+                    /* move to the label position in the file */
+                    if (fseek(script, global_on_failure_label->offset, SEEK_SET )
+                        == -1)
                     fatal_error( _("internal error: fseek"), NULL );
-                  global_line_counter = global_on_failure_label->line_count;
-                  /* tell the user about the misery :) */
-                  sprintf(message,SKIPBACK_VIA_F_MSG,
-                          global_on_failure_label->label);
-                  /* reset value unless persistent */
-                  if (!global_on_failure_label_persistent)
+                    global_line_counter = global_on_failure_label->line_count;
+                    /* tell the user about the misery :) */
+                    sprintf(message,SKIPBACK_VIA_F_MSG,
+                        global_on_failure_label->label);
+                    /* reset value unless persistent */
+                    if (!global_on_failure_label_persistent)
                     global_on_failure_label = NULL;
-                  wait_user (script, message, MODE_SPEEDTEST);
-                  seek_done = TRUE;
-                  break;
+                    wait_user (script, message, MODE_SPEEDTEST);
+                    seek_done = TRUE;
+                    break;
                 }

-              continue;
+                continue;
             }
         }

-      /* ask the user whether he/she wants to repeat or exit */
-      if ( rc == ASCII_ESC && cl_no_skip ) /* honor --no-skip */
+        /* ask the user whether he/she wants to repeat or exit */
+        if ( rc == ASCII_ESC && cl_no_skip ) /* honor --no-skip */
         rc = do_query_repeat (script, FALSE);
-      else
+        else
         rc = do_query_repeat (script, TRUE);
-      if (rc == 'E') {
-        seek_done = TRUE;
-        break;
-      }
-      if (rc == 'N')
+        if (rc == 'E') {
+            seek_done = TRUE;
+            break;
+        }
+        if (rc == 'N')
         break;

     }

-  /* free the malloced memory */
-  free( data );
-  free( wideData );
+    /* free the malloced memory */
+    free( data );
+    free( wideData );

-  /* reset global_error_max */
-  if (!global_error_max_persistent)
+    /* reset global_error_max */
+    if (!global_error_max_persistent)
     global_error_max = cl_default_error_max;

-  /* buffer_command takes care of advancing `script' (and setting
-     `line'), so we only do if seek_label had been called (in
-     do_query_repeat or due to a failure and an F: command) */
-  if (seek_done)
+    /* buffer_command takes care of advancing `script' (and setting
+       `line'), so we only do if seek_label had been called (in
+       do_query_repeat or due to a failure and an F: command) */
+    if (seek_done)
     get_script_line( script, line );
-  global_prior_command = C_SPEEDTEST;
+    global_prior_command = C_SPEEDTEST;
 }


@@ -1179,14 +1229,14 @@
  */
 static void do_clear (FILE *script, char *line)
 {
-  /* clear the complete screen */
-  move( B_TOP_LINE , 0 ); clrtobot();
+    /* clear the complete screen */
+    move( B_TOP_LINE , 0 ); clrtobot();

-  banner (SCR_DATA (line));
+    banner (SCR_DATA (line));

-  /* finally, get the next script command */
-  get_script_line( script, line );
-  global_prior_command = C_CLEAR;
+    /* finally, get the next script command */
+    get_script_line( script, line );
+    global_prior_command = C_CLEAR;
 }


@@ -1196,22 +1246,22 @@
 static void
 do_goto( FILE *script, char *line, bool flag )
 {
-  char *line_iterator;
+    char *line_iterator;

-  /* reposition only if flag set - otherwise a noop */
-  if ( flag )
+    /* reposition only if flag set - otherwise a noop */
+    if ( flag )
     {
-      /* remove trailing whitespace from line */
-      line_iterator = line + strlen(line) - 1;
-      while (line_iterator != line && isspace(*line_iterator))
+        /* remove trailing whitespace from line */
+        line_iterator = line + strlen(line) - 1;
+        while (line_iterator != line && isspace(*line_iterator))
        {
-         *line_iterator = '\0';
-         --line_iterator;
+            *line_iterator = '\0';
+            --line_iterator;
        }

-      seek_label( script, SCR_DATA( line ), line );
+        seek_label( script, SCR_DATA( line ), line );
     }
-  get_script_line( script, line );
+    get_script_line( script, line );
 }


@@ -1223,56 +1273,56 @@
 static char
 do_query_repeat ( FILE *script, bool allow_next )
 {
-  int resp;
+    int resp;

-  /* display the prompt */
-  move( MESSAGE_LINE, 0 ); clrtoeol();
-  move( MESSAGE_LINE, COLS - utf8len( MODE_QUERY ) - 2 );
-  ADDSTR_REV( MODE_QUERY );
-  move( MESSAGE_LINE, 0 );
-  if (allow_next)
+    /* display the prompt */
+    move( MESSAGE_LINE, 0 ); clrtoeol();
+    move( MESSAGE_LINE, COLS - utf8len( MODE_QUERY ) - 2 );
+    ADDSTR_REV( MODE_QUERY );
+    move( MESSAGE_LINE, 0 );
+    if (allow_next)
     ADDSTR_REV( REPEAT_NEXT_EXIT_MSG );
-  else
+    else
     ADDSTR_REV( REPEAT_EXIT_MSG );

-  /* wait for [RrNnEe] (or translation of these) */
-  while (TRUE)
+    /* wait for [RrNnEe] (or translation of these) */
+    while (TRUE)
     {
-      resp = getch_fl( ASCII_NULL );
+        resp = getch_fl( ASCII_NULL );

-      if (towideupper (resp) == 'R' ||
-         towideupper (resp) == RNE [0]) {
-       resp = 'R';
-       break;
-      }
-      if (allow_next && (towideupper (resp) == 'N' ||
-                        towideupper (resp) == RNE [2])) {
-       resp = 'N';
-       break;
-      }
-      if (towideupper (resp) == 'E' || towideupper (resp) == RNE [4]) {
-       if (do_query_simple (CONFIRM_EXIT_LESSON_MSG))
-         {
-           seek_label (script, fkey_bindings [11], NULL);
-           resp = 'E';
-           break;
-         }
-       /* redisplay the prompt */
-       move( MESSAGE_LINE, 0 ); clrtoeol();
-       move( MESSAGE_LINE, COLS - utf8len( MODE_QUERY ) - 2 );
-       ADDSTR_REV( MODE_QUERY );
-       move( MESSAGE_LINE, 0 );
-       if (allow_next)
-         ADDSTR_REV( REPEAT_NEXT_EXIT_MSG );
-       else
-         ADDSTR_REV( REPEAT_EXIT_MSG );
-      }
+        if (towideupper (resp) == 'R' ||
+            towideupper (resp) == RNE [0]) {
+            resp = 'R';
+            break;
+        }
+        if (allow_next && (towideupper (resp) == 'N' ||
+                towideupper (resp) == RNE [2])) {
+            resp = 'N';
+            break;
+        }
+        if (towideupper (resp) == 'E' || towideupper (resp) == RNE [4]) {
+            if (do_query_simple (CONFIRM_EXIT_LESSON_MSG))
+            {
+                seek_label (script, fkey_bindings [11], NULL);
+                resp = 'E';
+                break;
+            }
+            /* redisplay the prompt */
+            move( MESSAGE_LINE, 0 ); clrtoeol();
+            move( MESSAGE_LINE, COLS - utf8len( MODE_QUERY ) - 2 );
+            ADDSTR_REV( MODE_QUERY );
+            move( MESSAGE_LINE, 0 );
+            if (allow_next)
+            ADDSTR_REV( REPEAT_NEXT_EXIT_MSG );
+            else
+            ADDSTR_REV( REPEAT_EXIT_MSG );
+        }
     }

-  /* clear out the message line */
-  move( MESSAGE_LINE, 0 ); clrtoeol();
+    /* clear out the message line */
+    move( MESSAGE_LINE, 0 ); clrtoeol();

-  return (char)resp;
+    return (char)resp;
 }


@@ -1284,38 +1334,38 @@
 static bool
 do_query_simple ( char *text )
 {
-  int resp;
+    int resp;

-  if (user_is_always_sure)
-     return TRUE;
+    if (user_is_always_sure)
+    return TRUE;

-  /* display the prompt */
-  move( MESSAGE_LINE, 0 ); clrtoeol();
-  move( MESSAGE_LINE, COLS - strlen( MODE_QUERY ) - 2 );
-  ADDSTR_REV( MODE_QUERY );
-  move( MESSAGE_LINE, 0 );
-  ADDSTR_REV( text );
+    /* display the prompt */
+    move( MESSAGE_LINE, 0 ); clrtoeol();
+    move( MESSAGE_LINE, COLS - strlen( MODE_QUERY ) - 2 );
+    ADDSTR_REV( MODE_QUERY );
+    move( MESSAGE_LINE, 0 );
+    ADDSTR_REV( text );

-  /* wait for Y/N or translation of Y/N */
-  do
+    /* wait for Y/N or translation of Y/N */
+    do
     {
-      resp = getch_fl( ASCII_NULL );
+        resp = getch_fl( ASCII_NULL );

-      if (towideupper (resp) == 'Y' || towideupper (resp) == YN[0])
+        if (towideupper (resp) == 'Y' || towideupper (resp) == YN[0])
        resp = 0;
-      else if (towideupper (resp) == 'N' || towideupper (resp) == YN[2])
+        else if (towideupper (resp) == 'N' || towideupper (resp) == YN[2])
        resp = -1;
-    /* Some PDCURSES implementations return -1 when no key is pressed
-       for a second or so.  So, unless resp is explicitly set to Y/N,
-       don't exit! */
-      else
+        /* Some PDCURSES implementations return -1 when no key is pressed
+           for a second or so.  So, unless resp is explicitly set to Y/N,
+           don't exit! */
+        else
        resp = 2;
     }  while (resp != 0 && resp != -1);

-  /* clear out the message line */
-  move( MESSAGE_LINE, 0 ); clrtoeol();
+    /* clear out the message line */
+    move( MESSAGE_LINE, 0 ); clrtoeol();

-  return resp == 0 ? TRUE : FALSE;
+    return resp == 0 ? TRUE : FALSE;
 }


@@ -1326,78 +1376,78 @@
 static bool
 do_query( FILE *script, char *line )
 {
-  int  resp;                   /* response character */
-  int  fkey;                   /* function key iterator */
-  bool ret_code;
-
-  /* display the prompt */
-  move( MESSAGE_LINE, 0 ); clrtoeol();
-  move( MESSAGE_LINE, COLS - strlen( MODE_QUERY ) - 2 );
-  ADDSTR_REV( MODE_QUERY );
-  move( MESSAGE_LINE, 0 );
-  ADDSTR_REV( SCR_DATA( line ) );
-
-  /* wait for a Y/N response, translation of Y/N or matching FKEY */
-  while ( TRUE )
-    {
-      resp = getch_fl( ASCII_NULL );
-
-      /* translate pseudo Fkeys into real ones if applicable
-        The pseudo keys are defined in array pfkeys and are also:
-        F1 - 1, F2 - 2, F3 - 3,.... F10 - 0, F11 - A, F12 - S */
-      for ( fkey = 1; fkey <= NFKEYS; fkey++ )
+    int        resp;                   /* response character */
+    int        fkey;                   /* function key iterator */
+    bool ret_code;
+
+    /* display the prompt */
+    move( MESSAGE_LINE, 0 ); clrtoeol();
+    move( MESSAGE_LINE, COLS - strlen( MODE_QUERY ) - 2 );
+    ADDSTR_REV( MODE_QUERY );
+    move( MESSAGE_LINE, 0 );
+    ADDSTR_REV( SCR_DATA( line ) );
+
+    /* wait for a Y/N response, translation of Y/N or matching FKEY */
+    while ( TRUE )
+    {
+        resp = getch_fl( ASCII_NULL );
+
+        /* translate pseudo Fkeys into real ones if applicable
+           The pseudo keys are defined in array pfkeys and are also:
+           F1 - 1, F2 - 2, F3 - 3,.... F10 - 0, F11 - A, F12 - S */
+        for ( fkey = 1; fkey <= NFKEYS; fkey++ )
        {
-         if ( resp == pfkeys[ fkey - 1 ] || (fkey<11 && resp == (fkey+'0'))
-              || (fkey==10 && (resp =='0'))
-              || (fkey==11 && (resp =='a' || resp=='A'))
-              || (fkey==12 && (resp =='s' || resp=='S')))
+            if ( resp == pfkeys[ fkey - 1 ] || (fkey<11 && resp == (fkey+'0'))
+                || (fkey==10 && (resp =='0'))
+                || (fkey==11 && (resp =='a' || resp=='A'))
+                || (fkey==12 && (resp =='s' || resp=='S')))
            {
-             resp = KEY_F( fkey );
-             break;
+                resp = KEY_F( fkey );
+                break;
            }
        }

-      /* search the key bindings for a matching key */
-      for ( fkey = 1; fkey <= NFKEYS; fkey++ )
+        /* search the key bindings for a matching key */
+        for ( fkey = 1; fkey <= NFKEYS; fkey++ )
        {
-         if ( resp == KEY_F( fkey )
-              && fkey_bindings[ fkey - 1 ] != NULL )
+            if ( resp == KEY_F( fkey )
+                && fkey_bindings[ fkey - 1 ] != NULL )
            {
-             seek_label( script, fkey_bindings[ fkey - 1 ],
-                         NULL );
-             break;
+                seek_label( script, fkey_bindings[ fkey - 1 ],
+                    NULL );
+                break;
            }
        }
-      if ( fkey <= NFKEYS ) {
-       ret_code = FALSE;
-       break;
-      }
+        if ( fkey <= NFKEYS ) {
+            ret_code = FALSE;
+            break;
+        }

-      /* no FKEY binding - check for Y or N */
-      if ( towideupper( resp ) == QUERY_Y ||
-          towideupper( resp ) == YN[0] )
+        /* no FKEY binding - check for Y or N */
+        if ( towideupper( resp ) == QUERY_Y ||
+            towideupper( resp ) == YN[0] )
        {
-         ret_code = TRUE;
-         global_resp_flag = TRUE;
-         break;
+            ret_code = TRUE;
+            global_resp_flag = TRUE;
+            break;
        }
-      if ( towideupper( resp ) == QUERY_N ||
-          towideupper( resp ) == YN[2] )
+        if ( towideupper( resp ) == QUERY_N ||
+            towideupper( resp ) == YN[2] )
        {
-         ret_code = TRUE;
-         global_resp_flag = FALSE;
-         break;
+            ret_code = TRUE;
+            global_resp_flag = FALSE;
+            break;
        }
     }

-  /* clear out the message line */
-  move( MESSAGE_LINE, 0 ); clrtoeol();
+    /* clear out the message line */
+    move( MESSAGE_LINE, 0 ); clrtoeol();

-  /* get the next command */
-  get_script_line( script, line );
+    /* get the next command */
+    get_script_line( script, line );

-  /* tell the caller whether we got Y/N or a function key */
-  return ( ret_code );
+    /* tell the caller whether we got Y/N or a function key */
+    return ( ret_code );
 }

 /*
@@ -1407,148 +1457,148 @@
 static void
 do_error_max_set( FILE *script, char *line )
 {
-  char copy_of_line[MAX_SCR_LINE];
-  char *data;
-  bool star = FALSE;
-  char *tail;
-  double temp_value;
-
-  /* we need to make a copy for a potential error-message */
-  strcpy( copy_of_line, line );
-
-  /* hide whitespace (and '*') */
-  data = "" line ) + strlen( SCR_DATA( line ) ) - 1;
-  while (data != SCR_DATA(line) && !star && (isspace( *data ) || *data == '*'))
+    char copy_of_line[MAX_SCR_LINE];
+    char *data;
+    bool star = FALSE;
+    char *tail;
+    double temp_value;
+
+    /* we need to make a copy for a potential error-message */
+    strcpy( copy_of_line, line );
+
+    /* hide whitespace (and '*') */
+    data = "" line ) + strlen( SCR_DATA( line ) ) - 1;
+    while (data != SCR_DATA(line) && !star && (isspace( *data ) || *data == '*'))
     {
-      if (*data == '*')
+        if (*data == '*')
        star = TRUE;
-      *data = ""> -      --data;
+        *data = ""> +        --data;
     }
-  data = "" line );
-  while (isspace( *data ))
+    data = "" line );
+    while (isspace( *data ))
     ++data;

-  /* set the state variables */
-  global_error_max_persistent = star;
-  if (strcmp( data, "default" ) == 0 || strcmp( data, "Default" ) == 0)
+    /* set the state variables */
+    global_error_max_persistent = star;
+    if (strcmp( data, "default" ) == 0 || strcmp( data, "Default" ) == 0)
     global_error_max = cl_default_error_max;
-  else {
-    /* value is not a special keyword */
-    /* check for incorrect (not so readable) syntax */
-    data = "" + strlen( data ) - 1;
-    if (*data != '%') {
-      /* find out what's wrong */
-      if (star && isspace( *data )) {
-       /* find out whether `line' contains '%' */
-       while (data != SCR_DATA( line ) && isspace( *data ))
-         {
-           *data = ""> -           --data;
-         }
-       if (*data == '%')
-         /* xgettext: no-c-format */
-         fatal_error( _("'*' must immediately follow '%'"), copy_of_line );
-       else
-         /* xgettext: no-c-format */
-         fatal_error( _("missing '%'"), copy_of_line );
-      } else
-       /* xgettext: no-c-format */
-       fatal_error( _("missing '%'"), copy_of_line );
-    }
-    if (isspace( *(data - 1) ))
-      /* xgettext: no-c-format */
-      fatal_error( _("'%' must immediately follow value"), copy_of_line );
-    /* remove '%' */
-    *data = ""> -    /* convert value: SCR_DATA(line) may contain whitespace at the
-       beginning, but strtod ignores this */
-    data = "" line );
-    errno = 0;
-    temp_value = (float)strtod( data, &tail );
-    if (errno)
-      fatal_error( _("overflow in do_error_max_set"), copy_of_line );
-    /* TODO: if line="E:-1.0%", then tail will be ".0 "...
-       if (*tail != '\0')
-       fatal_error( _("can't parse value"), tail );*/
-    /*
-      If --error-max is specified (but *not* if the default value is used),
-      an E:-command will only be applied if its level is more
-      difficult (smaller) than the one specified via --error-max/-e
-    */
-    if (cl_error_max_specified) {
-      if (temp_value < cl_default_error_max)
-       global_error_max = temp_value;
-      else
-       global_error_max = cl_default_error_max;
-    } else
-      global_error_max = temp_value;
-  }
+    else {
+        /* value is not a special keyword */
+        /* check for incorrect (not so readable) syntax */
+        data = "" + strlen( data ) - 1;
+        if (*data != '%') {
+            /* find out what's wrong */
+            if (star && isspace( *data )) {
+                /* find out whether `line' contains '%' */
+                while (data != SCR_DATA( line ) && isspace( *data ))
+                {
+                    *data = ""> +                    --data;
+                }
+                if (*data == '%')
+                /* xgettext: no-c-format */
+                fatal_error( _("'*' must immediately follow '%'"), copy_of_line );
+                else
+                /* xgettext: no-c-format */
+                fatal_error( _("missing '%'"), copy_of_line );
+            } else
+            /* xgettext: no-c-format */
+            fatal_error( _("missing '%'"), copy_of_line );
+        }
+        if (isspace( *(data - 1) ))
+        /* xgettext: no-c-format */
+        fatal_error( _("'%' must immediately follow value"), copy_of_line );
+        /* remove '%' */
+        *data = ""> +        /* convert value: SCR_DATA(line) may contain whitespace at the
+           beginning, but strtod ignores this */
+        data = "" line );
+        errno = 0;
+        temp_value = (float)strtod( data, &tail );
+        if (errno)
+        fatal_error( _("overflow in do_error_max_set"), copy_of_line );
+        /* TODO: if line="E:-1.0%", then tail will be ".0 "...
+           if (*tail != '\0')
+           fatal_error( _("can't parse value"), tail );*/
+        /*
+          If --error-max is specified (but *not* if the default value is used),
+          an E:-command will only be applied if its level is more
+          difficult (smaller) than the one specified via --error-max/-e
+        */
+        if (cl_error_max_specified) {
+            if (temp_value < cl_default_error_max)
+            global_error_max = temp_value;
+            else
+            global_error_max = cl_default_error_max;
+        } else
+        global_error_max = temp_value;
+    }

-  /* sanity checks */
-  if (global_error_max < 0.0 || global_error_max > 100.0)
+    /* sanity checks */
+    if (global_error_max < 0.0 || global_error_max > 100.0)
     fatal_error( _("Invalid value for \"E:\" (out of range)"), copy_of_line );

-  /* get the next command */
-  get_script_line( script, line );
+    /* get the next command */
+    get_script_line( script, line );
 }

 /*

-*/
+ */
 static void
 do_on_failure_label_set( FILE *script, char *line )
 {
-  char copy_of_line[MAX_SCR_LINE];
-  char *line_iterator;
-  bool star = FALSE;
-  int i;
-  char message[MAX_SCR_LINE];
-
-  /* we need to make a copy for a potential error-message */
-  strcpy( copy_of_line, line );
-
-  /* remove trailing whitespace (and '*') */
-  line_iterator = line + strlen( line ) - 1;
-  while (line_iterator != line && !star &&
-        (isspace( *line_iterator ) || *line_iterator == '*'))
+    char copy_of_line[MAX_SCR_LINE];
+    char *line_iterator;
+    bool star = FALSE;
+    int i;
+    char       message[MAX_SCR_LINE];
+
+    /* we need to make a copy for a potential error-message */
+    strcpy( copy_of_line, line );
+
+    /* remove trailing whitespace (and '*') */
+    line_iterator = line + strlen( line ) - 1;
+    while (line_iterator != line && !star &&
+        (isspace( *line_iterator ) || *line_iterator == '*'))
     {
-      if (*line_iterator == '*')
+        if (*line_iterator == '*')
        star = TRUE;
-      *line_iterator = '\0';
-      --line_iterator;
+        *line_iterator = '\0';
+        --line_iterator;
     }

-  global_on_failure_label_persistent = star;
+    global_on_failure_label_persistent = star;

-  /* check for special value "NULL" */
-  if (strcmp(SCR_DATA(line), "NULL") == 0)
+    /* check for special value "NULL" */
+    if (strcmp(SCR_DATA(line), "NULL") == 0)
     global_on_failure_label = NULL;
-  else
+    else
     {
-      /* find the right hash list for the label */
-      i = hash_label( SCR_DATA(line) );
+        /* find the right hash list for the label */
+        i = hash_label( SCR_DATA(line) );

-      /* search the linked list for the label */
-      for ( global_on_failure_label = global_label_list[i];
-           global_on_failure_label != NULL;
-           global_on_failure_label = global_on_failure_label->next )
+        /* search the linked list for the label */
+        for ( global_on_failure_label = global_label_list[i];
+              global_on_failure_label != NULL;
+              global_on_failure_label = global_on_failure_label->next )
        {
-         /* see if this is our label */
-         if ( strcmp( global_on_failure_label->label, SCR_DATA(line) ) == 0 )
+            /* see if this is our label */
+            if ( strcmp( global_on_failure_label->label, SCR_DATA(line) ) == 0 )
            break;
        }

-      /* see if the label was not found in the file */
-      if ( global_on_failure_label == NULL )
+        /* see if the label was not found in the file */
+        if ( global_on_failure_label == NULL )
        {
-         sprintf( message, _("label '%s' not found"), SCR_DATA(line) );
-         fatal_error( message, copy_of_line );
+            sprintf( message, _("label '%s' not found"), SCR_DATA(line) );
+            fatal_error( message, copy_of_line );
        }
     }

-  /* get the next command */
-  get_script_line( script, line );
+    /* get the next command */
+    get_script_line( script, line );
 }

 /*
@@ -1557,59 +1607,59 @@
 static void
 parse_file( FILE *script, char *label ) {

-  char line[MAX_SCR_LINE];             /* line buffer */
-  char command;                        /* current command */
+    char       line[MAX_SCR_LINE];             /* line buffer */
+    char       command;                        /* current command */

-  /* if label given then start running there */
-  if ( label != NULL )
+    /* if label given then start running there */
+    if ( label != NULL )
     {
-      /* find the label we want to start at */
-      seek_label( script, label, NULL );
+        /* find the label we want to start at */
+        seek_label( script, label, NULL );
     }
-  else
+    else
     {
-      /* start at the very beginning (a very good place to start) */
-      rewind( script );
-      global_line_counter = 0;
+        /* start at the very beginning (a very good place to start) */
+        rewind( script );
+        global_line_counter = 0;
     }
-  get_script_line( script, line );
+    get_script_line( script, line );

-  /* just handle lines until the end of the file */
-  while( ! feof( script ))
+    /* just handle lines until the end of the file */
+    while( ! feof( script ))
     {
-      command = SCR_COMMAND( line );
-      switch( command )
+        command = SCR_COMMAND( line );
+        switch( command )
        {
-       case C_TUTORIAL:
-         do_tutorial( script, line ); break;
-       case C_INSTRUCTION:
-         do_instruction( script, line ); break;
-       case C_CLEAR:   do_clear( script, line ); break;
-       case C_GOTO:    do_goto( script, line, TRUE ); break;
-       case C_EXIT:    do_exit( script ); break;
-       case C_QUERY:   do_query( script, line ); break;
-       case C_YGOTO:   do_goto( script, line, global_resp_flag );
-         break;
-       case C_NGOTO:   do_goto( script, line, !global_resp_flag );
-         break;
-       case C_DRILL:
-       case C_DRILL_PRACTICE_ONLY:
-         do_drill( script, line ); break;
-       case C_SPEEDTEST:
-       case C_SPEEDTEST_PRACTICE_ONLY:
-         do_speedtest( script, line ); break;
-       case C_KEYBIND: do_keybind( script, line ); break;
-
-       case C_LABEL:
-          __update_last_label (SCR_DATA (line));
-          get_script_line (script, line);
-          break;
-       case C_ERROR_MAX_SET: do_error_max_set( script, line ); break;
-       case C_ON_FAILURE_SET: do_on_failure_label_set( script, line ); break;
-       case C_MENU: do_menu (script, line); break;
-       default:
-         fatal_error( _("unknown command"), line );
-         break;
+            case C_TUTORIAL:
+                do_tutorial( script, line ); break;
+            case C_INSTRUCTION:
+                do_instruction( script, line ); break;
+            case C_CLEAR:      do_clear( script, line ); break;
+            case C_GOTO:       do_goto( script, line, TRUE ); break;
+            case C_EXIT:       do_exit( script ); break;
+            case C_QUERY:      do_query( script, line ); break;
+            case C_YGOTO:      do_goto( script, line, global_resp_flag );
+                break;
+            case C_NGOTO:      do_goto( script, line, !global_resp_flag );
+                break;
+            case C_DRILL:
+            case C_DRILL_PRACTICE_ONLY:
+                do_drill( script, line ); break;
+            case C_SPEEDTEST:
+            case C_SPEEDTEST_PRACTICE_ONLY:
+                do_speedtest( script, line ); break;
+            case C_KEYBIND:    do_keybind( script, line ); break;
+
+            case C_LABEL:
+                __update_last_label (SCR_DATA (line));
+                get_script_line (script, line);
+                break;
+            case C_ERROR_MAX_SET: do_error_max_set( script, line ); break;
+            case C_ON_FAILURE_SET: do_on_failure_label_set( script, line ); break;
+            case C_MENU: do_menu (script, line); break;
+            default:
+                fatal_error( _("unknown command"), line );
+                break;
        }
     }
 }
@@ -1621,8 +1671,8 @@
 static void
 indent_to( int n )
 {
-  int i;
-  for (i=0; i < n; ++i)
+    int i;
+    for (i=0; i < n; ++i)
     fputc(' ', stdout);
 }

@@ -1639,46 +1689,46 @@
 **/
 static void
 print_usage_item( char *op, char *lop, char *help,
-                 int col_op, int col_lop, int col_help, int last_col )
+    int col_op, int col_lop, int col_help, int last_col )
 {
-  int col=0;
-  char help_string[MAX_SCR_LINE];
-  char *token;
-  const char delimiters[] = " ";
-
-  assert (op!=NULL && lop!=NULL && help!=NULL);
-  assert (0<=col_op && col_op<col_lop
-         && col_lop<col_help && col_help<last_col);
-
-  indent_to(col_op);
-  printf ("%s", op);
-  col += col_op + strlen (op);
-
-  indent_to(col_lop - col);
-  printf ("%s", lop);
-  col += MAX(0, col_lop - col) + strlen (lop);
-
-  indent_to(col_help - col);
-  col += MAX(0, col_help - col);
-
-  strcpy ( help_string, help );
-  token = strtok ( help_string, delimiters );
-  while (token != NULL)
-    {
-      if (col + strlen (token) >= last_col) {
-       putc ( '\n', stdout );
-       indent_to ( col_help );
-       fputs ( token, stdout );
-       putc ( ' ', stdout );
-       col = col_help + strlen(token) + 1;
-      } else {
-       fputs ( token, stdout );
-       putc ( ' ', stdout );
-       col += strlen(token) + 1;
-      }
-      token = strtok ( NULL, delimiters );
+    int col=0;
+    char help_string[MAX_SCR_LINE];
+    char *token;
+    const char delimiters[] = " ";
+
+    assert (op!=NULL && lop!=NULL && help!=NULL);
+    assert (0<=col_op && col_op<col_lop
+        && col_lop<col_help && col_help<last_col);
+
+    indent_to(col_op);
+    printf ("%s", op);
+    col += col_op + strlen (op);
+
+    indent_to(col_lop - col);
+    printf ("%s", lop);
+    col += MAX(0, col_lop - col) + strlen (lop);
+
+    indent_to(col_help - col);
+    col += MAX(0, col_help - col);
+
+    strcpy ( help_string, help );
+    token = strtok ( help_string, delimiters );
+    while (token != NULL)
+    {
+        if (col + strlen (token) >= last_col) {
+            putc ( '\n', stdout );
+            indent_to ( col_help );
+            fputs ( token, stdout );
+            putc ( ' ', stdout );
+            col = col_help + strlen(token) + 1;
+        } else {
+            fputs ( token, stdout );
+            putc ( ' ', stdout );
+            col += strlen(token) + 1;
+        }
+        token = strtok ( NULL, delimiters );
     }
-  putc('\n', stdout);
+    putc('\n', stdout);
 }


@@ -1688,96 +1738,96 @@
 static void
 print_help()
 {
-  char *op[]=
-    { "-b",
-      "-e %",
-      "-n",
-      "-t",
-      "-f P",
-      "-c F,B",
-      "-s",
-      "-q",
-      "-l L",
-      "-w",
-      "-k",
-      "-i",
-      "-h",
-      "-v",
-      "-S",
-      "--banner-colors=F,B,P,V",
-      "--scoring=wpm,cpm"};
-  char *lop[]=
-    { "--personal-best",
-      "--max-error=%",
-      "--notimer",
-      "--term-cursor",
-      "--curs-flash=P",
-      "--colours=F,B",
-      "--silent",
-      "--quiet",
-      "--start-label=L",
-      "--word-processor",
-      "--no-skip",
-      "--show-errors",
-      "--help",
-      "--version",
-      "--always-sure",
-      "",
-      ""};
-  char *help[] =
-    {
-      _("track personal best typing speeds"),
-      _("default maximum error percentage (default 3.0); valid values are "
-       "between 0.0 and 100.0"),
-      _("turn off WPM timer in drills"),
-      _("use the terminal's hardware cursor"),
-      _("cursor flash period P*.1 sec (default 10); valid  values are between "
-       "0 and 512; this is ignored if -t is specified"),
-      _("set initial display colours where available"),
-      _("don't beep on errors"),
-      _("same as -s, --silent"),
-      _("start the lesson at label 'L'"),
-      _("try to mimic word processors"),
-      _("forbid the user to skip exercises"),
-      _("highlight errors with reverse video"),
-      _("print this message"),
-      _("output version information and exit"),
-      _("do not ask confirmation questions"),
-      _("set top banner colours (background, foreground, package and version "
-        "respectively)"),
-      _("set scoring mode (words per minute or characters per minute)")};
-
-  int loop;
-
-  printf(_("`gtypist' is a typing tutor with several lessons for different "
-          "keyboards and languages.  New lessons can be written by the user "
-          "easily.\n\n"));
-  printf("%s: %s [ %s... ] [ %s ]\n\n",
-        _("Usage"),argv0,_("options"),_("script-file"));
-  printf("%s:\n",_("Options"));
-  /* print out each line of the help text array */
-  for ( loop = 0; loop < sizeof(help)/sizeof(char *); loop++ )
-    {
-      print_usage_item( op[loop], lop[loop], help[loop], 1, 8, 25, 75 );
-    }
-
-  printf(_("\nIf not supplied, script-file defaults to '%s/%s'.\n")
-        ,DATADIR,DEFAULT_SCRIPT);
-  printf(_("The path $GTYPIST_PATH is searched for script files.\n\n"));
-
-  printf("%s:\n",_("Examples"));
-  printf("  %s:\n    %s\n\n",
-        _("To run the default lesson in english `gtypist.typ'"),argv0);
-  printf("  %s:\n    %s esp.typ\n\n",
-        _("To run the lesson in spanish"),argv0);
-  printf("  %s:\n    GTYPIST_PATH=\"/home/foo\" %s bar.typ\n\n",
-        _("To instruct gtypist to look for lesson `bar.typ' in a non standard "
-          "directory"),argv0);
-  printf("  %s:\n    %s -t -q -l TEST1 /temp/test.typ\n\n",
-        _("To run the lesson in the file `test.typ' of directory `temp', "
-          "starting at label `TEST1', using the terminal's cursor, and run "
-          "silently"),argv0);
-  printf("%s\n",_("Report bugs to address@hidden"));
+    char *op[]=
+        { "-b",
+          "-e %",
+          "-n",
+          "-t",
+          "-f P",
+          "-c F,B",
+          "-s",
+          "-q",
+          "-l L",
+          "-w",
+          "-k",
+          "-i",
+          "-h",
+          "-v",
+          "-S",
+          "--banner-colors=F,B,P,V",
+          "--scoring=wpm,cpm"};
+    char *lop[]=
+        { "--personal-best",
+          "--max-error=%",
+          "--notimer",
+          "--term-cursor",
+          "--curs-flash=P",
+          "--colours=F,B",
+          "--silent",
+          "--quiet",
+          "--start-label=L",
+          "--word-processor",
+          "--no-skip",
+          "--show-errors",
+          "--help",
+          "--version",
+          "--always-sure",
+          "",
+          ""};
+    char *help[] =
+        {
+            _("track personal best typing speeds"),
+            _("default maximum error percentage (default 3.0); valid values are "
+                "between 0.0 and 100.0"),
+            _("turn off WPM timer in drills"),
+            _("use the terminal's hardware cursor"),
+            _("cursor flash period P*.1 sec (default 10); valid  values are between "
+                "0 and 512; this is ignored if -t is specified"),
+            _("set initial display colours where available"),
+            _("don't beep on errors"),
+            _("same as -s, --silent"),
+            _("start the lesson at label 'L'"),
+            _("try to mimic word processors"),
+            _("forbid the user to skip exercises"),
+            _("highlight errors with reverse video"),
+            _("print this message"),
+            _("output version information and exit"),
+            _("do not ask confirmation questions"),
+            _("set top banner colours (background, foreground, package and version "
+                "respectively)"),
+            _("set scoring mode (words per minute or characters per minute)")};
+
+    int loop;
+
+    printf(_("`gtypist' is a typing tutor with several lessons for different "
+            "keyboards and languages.  New lessons can be written by the user "
+            "easily.\n\n"));
+    printf("%s: %s [ %s... ] [ %s ]\n\n",
+        _("Usage"),argv0,_("options"),_("script-file"));
+    printf("%s:\n",_("Options"));
+    /* print out each line of the help text array */
+    for ( loop = 0; loop < sizeof(help)/sizeof(char *); loop++ )
+    {
+        print_usage_item( op[loop], lop[loop], help[loop], 1, 8, 25, 75 );
+    }
+
+    printf(_("\nIf not supplied, script-file defaults to '%s/%s'.\n")
+        ,DATADIR,DEFAULT_SCRIPT);
+    printf(_("The path $GTYPIST_PATH is searched for script files.\n\n"));
+
+    printf("%s:\n",_("Examples"));
+    printf("  %s:\n    %s\n\n",
+        _("To run the default lesson in english `gtypist.typ'"),argv0);
+    printf("  %s:\n    %s esp.typ\n\n",
+        _("To run the lesson in spanish"),argv0);
+    printf("  %s:\n    GTYPIST_PATH=\"/home/foo\" %s bar.typ\n\n",
+        _("To instruct gtypist to look for lesson `bar.typ' in a non standard "
+            "directory"),argv0);
+    printf("  %s:\n    %s -t -q -l TEST1 /temp/test.typ\n\n",
+        _("To run the lesson in the file `test.typ' of directory `temp', "
+            "starting at label `TEST1', using the terminal's cursor, and run "
+            "silently"),argv0);
+    printf("%s\n",_("Report bugs to address@hidden"));
 }


@@ -1786,167 +1836,167 @@
 */
 static void
 parse_cmdline( int argc, char **argv ) {
-  int  c;                              /* option character */
-  int  option_index;                   /* option index */
-  char *str_option; /* to store string vals of cl opts */
-  static struct option long_options[] = {      /* options table */
-    { "personal-best", no_argument, 0, 'b' },
-    { "max-error",      required_argument, 0, 'e' },
-    { "notimer",       no_argument, 0, 'n' },
-    { "term-cursor",   no_argument, 0, 't' },
-    { "curs-flash",    required_argument, 0, 'f' },
-    { "colours",       required_argument, 0, 'c' },
-    { "colors",                required_argument, 0, 'c' },
-    { "banner-colours",        required_argument, 0, '\x01' },
-    { "banner-colors", required_argument, 0, '\x01' },
-    { "silent",                no_argument, 0, 's' },
-    { "quiet",         no_argument, 0, 'q' },
-    { "start-label",   required_argument, 0, 'l' },
-    { "word-processor",        no_argument, 0, 'w' },
-    { "no-skip",        no_argument, 0, 'k' },
-    { "show-errors",    no_argument, 0, 'i' },
-    { "help",          no_argument, 0, 'h' },
-    { "version",       no_argument, 0, 'v' },
-    { "always-sure",   no_argument, 0, 'S' },
-    { "scoring",       required_argument, 0, '\x02'},
-    { 0, 0, 0, 0 }};
-
-  /* process every option */
-  while ( (c=getopt_long( argc, argv, "be:ntf:c:sql:wkihvS",
-                         long_options, &option_index )) != -1 )
+    int        c;                              /* option character */
+    int        option_index;                   /* option index */
+    char *str_option; /* to store string vals of cl opts */
+    static struct option long_options[] = {    /* options table */
+        { "personal-best",     no_argument, 0, 'b' },
+        { "max-error",      required_argument, 0, 'e' },
+        { "notimer",   no_argument, 0, 'n' },
+        { "term-cursor",       no_argument, 0, 't' },
+        { "curs-flash",        required_argument, 0, 'f' },
+        { "colours",   required_argument, 0, 'c' },
+        { "colors",            required_argument, 0, 'c' },
+        { "banner-colours",    required_argument, 0, '\x01' },
+        { "banner-colors",     required_argument, 0, '\x01' },
+        { "silent",            no_argument, 0, 's' },
+        { "quiet",             no_argument, 0, 'q' },
+        { "start-label",       required_argument, 0, 'l' },
+        { "word-processor",    no_argument, 0, 'w' },
+        { "no-skip",        no_argument, 0, 'k' },
+        { "show-errors",    no_argument, 0, 'i' },
+        { "help",              no_argument, 0, 'h' },
+        { "version",   no_argument, 0, 'v' },
+        { "always-sure",       no_argument, 0, 'S' },
+        { "scoring",   required_argument, 0, '\x02'},
+        { 0, 0, 0, 0 }};
+
+    /* process every option */
+    while ( (c=getopt_long( argc, argv, "be:ntf:c:sql:wkihvS",
+                long_options, &option_index )) != -1 )
     {
-      switch (c)
+        switch (c)
        {
-       case 'b':
-         cl_personal_best = TRUE;
-         break;
-       case 'e':
-         cl_error_max_specified = TRUE;
-         if ( sscanf( optarg, "%f", &cl_default_error_max ) != 1
-              || cl_default_error_max < 0.0
-              || cl_default_error_max > 100.0 )
-           {
-             fprintf( stderr, _("%s: invalid error-max value\n"),
-                      argv0 );
-             exit( 1 );
-           }
-         break;
-       case 'n':
-         cl_notimer = TRUE;
-         break;
-       case 't':
-         cl_term_cursor = TRUE;
-         break;
-       case 'f':
-         if ( sscanf( optarg, "%d", &cl_curs_flash ) != 1
-              || cl_curs_flash < 0
-              || cl_curs_flash > 512 )
-           {
-             fprintf( stderr, _("%s: invalid curs-flash value\n"),
-                      argv0 );
-             exit( 1 );
-           }
-         break;
-       case 'c':
-         if ( sscanf( optarg, "%d,%d",
-                      &cl_fgcolour, &cl_bgcolour ) != 2 ||
-              cl_fgcolour < 0 || cl_fgcolour >= NUM_COLOURS ||
-              cl_bgcolour < 0 || cl_bgcolour >= NUM_COLOURS )
-           {
-             fprintf( stderr, _("%s: invalid colours value\n"),argv0 );
-             exit( 1 );
-           }
-         cl_colour = TRUE;
-         break;
-       case '\x01':
-         if (sscanf (optarg, "%d,%d,%d,%d",
+            case 'b':
+                cl_personal_best = TRUE;
+                break;
+            case 'e':
+                cl_error_max_specified = TRUE;
+                if ( sscanf( optarg, "%f", &cl_default_error_max ) != 1
+                    || cl_default_error_max < 0.0
+                    || cl_default_error_max > 100.0 )
+                {
+                    fprintf( stderr, _("%s: invalid error-max value\n"),
+                        argv0 );
+                    exit( 1 );
+                }
+                break;
+            case 'n':
+                cl_notimer = TRUE;
+                break;
+            case 't':
+                cl_term_cursor = TRUE;
+                break;
+            case 'f':
+                if ( sscanf( optarg, "%d", &cl_curs_flash ) != 1
+                    || cl_curs_flash < 0
+                    || cl_curs_flash > 512 )
+                {
+                    fprintf( stderr, _("%s: invalid curs-flash value\n"),
+                        argv0 );
+                    exit( 1 );
+                }
+                break;
+            case 'c':
+                if ( sscanf( optarg, "%d,%d",
+                        &cl_fgcolour, &cl_bgcolour ) != 2 ||
+                    cl_fgcolour < 0 || cl_fgcolour >= NUM_COLOURS ||
+                    cl_bgcolour < 0 || cl_bgcolour >= NUM_COLOURS )
+                {
+                    fprintf( stderr, _("%s: invalid colours value\n"),argv0 );
+                    exit( 1 );
+                }
+                cl_colour = TRUE;
+                break;
+            case '\x01':
+                if (sscanf (optarg, "%d,%d,%d,%d",
                        &cl_banner_bg_colour, &cl_banner_fg_colour,
                        &cl_prog_name_colour, &cl_prog_version_colour) != 4)
-         {
-            fprintf (stderr, _("%s:  argument format is incorrect\n"), optarg);
-            exit (1);
-         }
-
-         if (cl_banner_bg_colour < 0 || cl_banner_bg_colour >= NUM_COLOURS ||
-               cl_banner_fg_colour < 0 || cl_banner_bg_colour >= NUM_COLOURS ||
-               cl_prog_version_colour < 0 ||
-               cl_prog_version_colour >= NUM_COLOURS ||
-               cl_prog_name_colour < 0 || cl_prog_name_colour >= NUM_COLOURS)
-         {
-            fprintf (stderr, _("%s:  incorrect colour values\n"), optarg);
-            exit (1);
-         }
-
-         break;
-    case '\x02': /* Scoring */
-      str_option = (char*)malloc( strlen(optarg) + 1 );
-      if (sscanf (optarg, "%s", str_option) != 1)
-        {
-          fprintf (stderr, _("%s: invalid scoring mode"), optarg);
-          exit (1);
-        }
-      if( strcmp(str_option, "cpm") == 0 )
-        {
-          cl_scoring_cpm = TRUE;
-        }
-      else if( strcmp(str_option, "wpm") == 0 )
-        {
-          cl_scoring_cpm = FALSE;
-        }
-      else
-        {
-          fprintf (stderr, _("%s: invalid scoring mode"), optarg);
-          exit (1);
-        }
-      free( str_option );
-         break;
-       case 's':
-       case 'q':
-         cl_silent = TRUE;
-         break;
-       case 'l':
-         cl_start_label = (char*)malloc( strlen( optarg ) + 1 );
-         if ( cl_start_label == NULL )
-           {
-             fprintf( stderr, _("%s: internal error: malloc\n"),argv0 );
-             exit( 1 );
-           }
-         strcpy( cl_start_label, optarg );
-         break;
-       case 'w':
-         cl_wp_emu = TRUE;
-         break;
-       case 'k':
-         cl_no_skip = TRUE;
-         break;
-       case 'i':
-         cl_rev_video_errors = TRUE;
-         break;
-       case 'h':
-         print_help();
-         exit( 0 );
-         break;
-       case 'v':
-         printf( "%s %s\n\n", PACKAGE,VERSION );
-         printf( "%s\n\n", COPYRIGHT );
-         printf( "%s\n", _("Written by Simon Baldwin"));
-         exit( 0 );
-         break;
-       case 'S':
-         user_is_always_sure = TRUE;
-         break;
-       case '?':
-       default:
-         fprintf( stderr,
-                  _("Try '%s --help' for more information.\n"), argv0 );
-         exit( 1 );
+                {
+                    fprintf (stderr, _("%s:  argument format is incorrect\n"), optarg);
+                    exit (1);
+                }
+
+                if (cl_banner_bg_colour < 0 || cl_banner_bg_colour >= NUM_COLOURS ||
+                    cl_banner_fg_colour < 0 || cl_banner_bg_colour >= NUM_COLOURS ||
+                    cl_prog_version_colour < 0 ||
+                    cl_prog_version_colour >= NUM_COLOURS ||
+                    cl_prog_name_colour < 0 || cl_prog_name_colour >= NUM_COLOURS)
+                {
+                    fprintf (stderr, _("%s:  incorrect colour values\n"), optarg);
+                    exit (1);
+                }
+
+                break;
+            case '\x02': /* Scoring */
+                str_option = (char*)malloc( strlen(optarg) + 1 );
+                if (sscanf (optarg, "%s", str_option) != 1)
+                {
+                    fprintf (stderr, _("%s: invalid scoring mode"), optarg);
+                    exit (1);
+                }
+                if( strcmp(str_option, "cpm") == 0 )
+                {
+                    cl_scoring_cpm = TRUE;
+                }
+                else if( strcmp(str_option, "wpm") == 0 )
+                {
+                    cl_scoring_cpm = FALSE;
+                }
+                else
+                {
+                    fprintf (stderr, _("%s: invalid scoring mode"), optarg);
+                    exit (1);
+                }
+                free( str_option );
+                break;
+            case 's':
+            case 'q':
+                cl_silent = TRUE;
+                break;
+            case 'l':
+                cl_start_label = (char*)malloc( strlen( optarg ) + 1 );
+                if ( cl_start_label == NULL )
+                {
+                    fprintf( stderr, _("%s: internal error: malloc\n"),argv0 );
+                    exit( 1 );
+                }
+                strcpy( cl_start_label, optarg );
+                break;
+            case 'w':
+                cl_wp_emu = TRUE;
+                break;
+            case 'k':
+                cl_no_skip = TRUE;
+                break;
+            case 'i':
+                cl_rev_video_errors = TRUE;
+                break;
+            case 'h':
+                print_help();
+                exit( 0 );
+                break;
+            case 'v':
+                printf( "%s %s\n\n", PACKAGE,VERSION );
+                printf( "%s\n\n", COPYRIGHT );
+                printf( "%s\n", _("Written by Simon Baldwin"));
+                exit( 0 );
+                break;
+            case 'S':
+                user_is_always_sure = TRUE;
+                break;
+            case '?':
+            default:
+                fprintf( stderr,
+                    _("Try '%s --help' for more information.\n"), argv0 );
+                exit( 1 );
        }
     }
-  if ( argc - optind > 1 )
+    if ( argc - optind > 1 )
     {
-      fprintf( stderr,
-              _("Try '%s --help' for more information.\n"), argv0 );
-      exit( 1 );
+        fprintf( stderr,
+            _("Try '%s --help' for more information.\n"), argv0 );
+        exit( 1 );
     }
 }

@@ -1957,34 +2007,34 @@
 static void
 catcher( int signal ) {

-  /* unravel colours and curses, clean up and exit */
-  if ( cl_colour && has_colors() )
+    /* unravel colours and curses, clean up and exit */
+    if ( cl_colour && has_colors() )
     wbkgdset( stdscr, 0 );
-  clear(); refresh(); endwin();
-  printf("\n");
-  exit( 1 );
+    clear(); refresh(); endwin();
+    printf("\n");
+    exit( 1 );
 }

 /*
   open a script file
- */
+*/
 FILE *open_script( const char *filename )
 {
-  FILE *script;
+    FILE *script;

 #ifdef MINGW
-  /* MinGW's ftell doesn't work properly for absolute file positions in
-     text mode, so open in binary mode instead. */
-  script = fopen( filename, "rb" );
+    /* MinGW's ftell doesn't work properly for absolute file positions in
+       text mode, so open in binary mode instead. */
+    script = fopen( filename, "rb" );
 #else
-  script = fopen( filename, "r" );
+    script = fopen( filename, "r" );
 #endif

-  /* record script filename */
-  if( script != NULL )
+    /* record script filename */
+    if( script != NULL )
     global_script_filename = strdup( filename );

-  return script;
+    return script;
 }

 /*
@@ -1992,405 +2042,405 @@
 */
 int main( int argc, char **argv )
 {
-  WINDOW       *scr;                   /* curses window */
-  FILE *script;                        /* script file handle */
-  char *p, filepath[FILENAME_MAX];     /* file paths */
-  char script_file[FILENAME_MAX];      /* more file paths */
+    WINDOW     *scr;                   /* curses window */
+    FILE       *script;                        /* script file handle */
+    char       *p, filepath[FILENAME_MAX];     /* file paths */
+    char       script_file[FILENAME_MAX];      /* more file paths */

-  /* Internationalization */
+    /* Internationalization */

 #if defined(ENABLE_NLS) && defined(LC_ALL)
-  setlocale (LC_ALL, "");
-  bindtextdomain (PACKAGE, LOCALEDIR);
-  /* make gettext always return strings as UTF-8
-     => this makes programming easier because now _all_ strings
-     (from gettext and from script file) are encoded as UTF8!
-   */
-  bind_textdomain_codeset(PACKAGE, "utf-8");
-  textdomain (PACKAGE);
+    setlocale (LC_ALL, "");
+    bindtextdomain (PACKAGE, LOCALEDIR);
+    /* make gettext always return strings as UTF-8
+       => this makes programming easier because now _all_ strings
+       (from gettext and from script file) are encoded as UTF8!
+    */
+    bind_textdomain_codeset(PACKAGE, "utf-8");
+    textdomain (PACKAGE);
 #endif

 #ifdef MINGW
-  locale_encoding = "UTF-8";
+    locale_encoding = "UTF-8";
 #else
-  locale_encoding = nl_langinfo(CODESET);
+    locale_encoding = nl_langinfo(CODESET);
 #endif
-  isUTF8Locale = strcasecmp(locale_encoding, "UTF-8") == 0 ||
-      strcasecmp(locale_encoding, "UTF8") == 0;
-  /* printf("encoding is %s, UTF8=%d\n", locale_encoding, isUTF8Locale); */
-
-  COPYRIGHT=
-    _("Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Simon Baldwin.\n"
-      "Copyright (C) 2003, 2004, 2008, 2011 GNU Typist Development Team.\n"
-      "This program comes with ABSOLUTELY NO WARRANTY; for details\n"
-      "please see the file 'COPYING' supplied with the source code.\n"
-      "This is free software, and you are welcome to redistribute it\n"
-      "under certain conditions; again, see 'COPYING' for details.\n"
-      "This program is released under the GNU General Public License.");
-  /* this string is displayed in the mode-line when in a tutorial */
-  MODE_TUTORIAL=_(" Tutorial ");
-  /* this string is displayed in the mode-line when in a query */
-  MODE_QUERY=_("  Query   ");
-  /* this string is displayed in the mode-line when running a drill */
-  MODE_DRILL=_("  Drill   ");
-  /* this string is displayed in the mode-line when running a speedtest */
-  MODE_SPEEDTEST=_("Speed test");
-  WAIT_MESSAGE=
-         _(" Press RETURN or SPACE to continue, ESC to return to the menu ");
-  /* this message is displayed when the user has failed in a [DS]: drill */
-  ERROR_TOO_HIGH_MSG=
-    _(" Your error-rate is too high. You have to achieve %.1f%%. ");
-  /* this message is displayed when the user has failed in a [DS]: drill,
-     and an F:<LABEL> ("on failure label") is in effect */
-  SKIPBACK_VIA_F_MSG=
-    _(" You failed this test, so you need to go back to %s. ");
-  /* this is used for repeat-queries. you can translate the keys as well
-     (if you translate msgid "R/N/E" accordingly) */
-  REPEAT_NEXT_EXIT_MSG=
+    isUTF8Locale = strcasecmp(locale_encoding, "UTF-8") == 0 ||
+        strcasecmp(locale_encoding, "UTF8") == 0;
+    /* printf("encoding is %s, UTF8=%d\n", locale_encoding, isUTF8Locale); */
+
+    COPYRIGHT=
+        _("Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Simon Baldwin.\n"
+            "Copyright (C) 2003, 2004, 2008, 2011 GNU Typist Development Team.\n"
+            "This program comes with ABSOLUTELY NO WARRANTY; for details\n"
+            "please see the file 'COPYING' supplied with the source code.\n"
+            "This is free software, and you are welcome to redistribute it\n"
+            "under certain conditions; again, see 'COPYING' for details.\n"
+            "This program is released under the GNU General Public License.");
+    /* this string is displayed in the mode-line when in a tutorial */
+    MODE_TUTORIAL=_(" Tutorial ");
+    /* this string is displayed in the mode-line when in a query */
+    MODE_QUERY=_("  Query   ");
+    /* this string is displayed in the mode-line when running a drill */
+    MODE_DRILL=_("  Drill   ");
+    /* this string is displayed in the mode-line when running a speedtest */
+    MODE_SPEEDTEST=_("Speed test");
+    WAIT_MESSAGE=
+        _(" Press RETURN or SPACE to continue, ESC to return to the menu ");
+    /* this message is displayed when the user has failed in a [DS]: drill */
+    ERROR_TOO_HIGH_MSG=
+        _(" Your error-rate is too high. You have to achieve %.1f%%. ");
+    /* this message is displayed when the user has failed in a [DS]: drill,
+       and an F:<LABEL> ("on failure label") is in effect */
+    SKIPBACK_VIA_F_MSG=
+        _(" You failed this test, so you need to go back to %s. ");
+    /* this is used for repeat-queries. you can translate the keys as well
+       (if you translate msgid "R/N/E" accordingly) */
+    REPEAT_NEXT_EXIT_MSG=
        _(" Press R to repeat, N for next exercise or E to exit ");
-  /* this is used for repeat-queries with --no-skip. you can translate
-     the keys as well (if you translate msgid "R/N/E" accordingly) */
-  REPEAT_EXIT_MSG=
+    /* this is used for repeat-queries with --no-skip. you can translate
+       the keys as well (if you translate msgid "R/N/E" accordingly) */
+    REPEAT_EXIT_MSG=
        _(" Press R to repeat or E to exit ");
-  /* This is used make the user confirm (E)xit in REPEAT_NEXT_EXIT_MSG */
-  CONFIRM_EXIT_LESSON_MSG=
-    _(" Are you sure you want to exit this lesson? [Y/N] ");
-  /* This message is displayed if the user tries to skip a lesson
-     (ESC ESC) and --no-skip is specified */
-  NO_SKIP_MSG=
-    _(" Sorry, gtypist is configured to forbid skipping exercises. ");
-  /* this must be adjusted to the right with one space at the end.
-     Leading whitespace is important because it is displayed in reverse
-     video because it must be aligned with the next messages (it's best
-     to run gtypist to see this in practice) */
-  SPEED_RAW_WPM=_(" Raw speed      = %6.2f wpm ");
-  /* This is the CPM version of the above.  The same rules apply. */
-  SPEED_RAW_CPM=_(" Raw speed      = %6.2f cpm ");
-  /* this must be adjusted to the right with one space at the end.
-     Leading whitespace is important because it is displayed in reverse
-     video and because it must be aligned with the previous and next
-     messages (it's best to run gtypist to see this in practice) */
-  SPEED_ADJ_WPM=  _(" Adjusted speed = %6.2f wpm ");
-  /* This is the CPM version of the above.  The same rules apply. */
-  SPEED_ADJ_CPM=  _(" Adjusted speed = %6.2f cpm ");
-  /* this must be adjusted to the right with one space at the end.
-     Leading whitespace is important because it is displayed in reverse
-     video and because it must be aligned with the previous and next
-     messages (it's best to run gtypist to see this in practice) */
-  SPEED_PCT_ERROR=_("            with %.1f%% errors ");
-  /* this must be adjusted to the right with one space at the end.
-     Leading whitespace is important because it is displayed in reverse
-     video and because it must be aligned with the previous messages (it's
-     best to run gtypist to see this in practice) */
-  SPEED_BEST_WPM= _(" Personal best  = %6.2f wpm ");
-  /* This is the CPM version of the above.  The same rules apply. */
-  SPEED_BEST_CPM= _(" Personal best  = %6.2f cpm ");
-  /* this must be adjusted to the right with one space at the end.
-     Leading whitespace is important because it is displayed in reverse
-     video and because it must be aligned with the previous messages
-     (it's best to run gtypist to see this in practice) */
-  SPEED_BEST_NEW_MSG= _("           new personal best ");
-  /* this is used to translate the keys for Y/N-queries. Must be two
-     uppercase letters separated by '/'. Y/N will still be accepted as
-     well. Note that the messages (prompts) themselves cannot be
-     translated because they are read from the script-file. */
-  YN = convertFromUTF8(_("Y/N"));
-  if (wcslen(YN) != 3 || YN[1] != '/' || !iswideupper(YN[0]) || !iswideupper(YN[2]))
-    {
-      fprintf( stderr,
-              "%s: i18n problem: invalid value for msgid \"Y/N\" (3 uppercase UTF-8 chars?): %ls\n",
-              argv0, YN );
-      exit( 1 );
-    }
-  /* this is used to translate the keys for Repeat/Next/Exit
-     queries. Must be three uppercase letters separated by slashes. */
-  RNE = convertFromUTF8(_("R/N/E"));
-  if (wcslen(RNE) != 5 ||
-      !iswideupper(RNE[0]) || RNE[1] != '/' ||
-      !iswideupper(RNE[2]) || RNE[3] != '/' ||
-      !iswideupper(RNE[4]))
-    {
-      fprintf( stderr,
-              "%s: i18n problem: invalid value for msgid \"R/N/E\" (5 uppercase UTF-8 chars?): %ls\n",
-              argv0, RNE );
-      exit( 1 );
-    }
-
-  /* get our name for error messages */
-  argv0 = argv[0] + strlen( argv[0] );
-  while ( argv0 > argv[0] && *argv0 != '/' )
+    /* This is used make the user confirm (E)xit in REPEAT_NEXT_EXIT_MSG */
+    CONFIRM_EXIT_LESSON_MSG=
+        _(" Are you sure you want to exit this lesson? [Y/N] ");
+    /* This message is displayed if the user tries to skip a lesson
+       (ESC ESC) and --no-skip is specified */
+    NO_SKIP_MSG=
+        _(" Sorry, gtypist is configured to forbid skipping exercises. ");
+    /* this must be adjusted to the right with one space at the end.
+       Leading whitespace is important because it is displayed in reverse
+       video because it must be aligned with the next messages (it's best
+       to run gtypist to see this in practice) */
+    SPEED_RAW_WPM=_(" Raw speed      = %6.2f wpm ");
+    /* This is the CPM version of the above.  The same rules apply. */
+    SPEED_RAW_CPM=_(" Raw speed      = %6.2f cpm ");
+    /* this must be adjusted to the right with one space at the end.
+       Leading whitespace is important because it is displayed in reverse
+       video and because it must be aligned with the previous and next
+       messages (it's best to run gtypist to see this in practice) */
+    SPEED_ADJ_WPM=  _(" Adjusted speed = %6.2f wpm ");
+    /* This is the CPM version of the above.  The same rules apply. */
+    SPEED_ADJ_CPM=  _(" Adjusted speed = %6.2f cpm ");
+    /* this must be adjusted to the right with one space at the end.
+       Leading whitespace is important because it is displayed in reverse
+       video and because it must be aligned with the previous and next
+       messages (it's best to run gtypist to see this in practice) */
+    SPEED_PCT_ERROR=_("            with %.1f%% errors ");
+    /* this must be adjusted to the right with one space at the end.
+       Leading whitespace is important because it is displayed in reverse
+       video and because it must be aligned with the previous messages (it's
+       best to run gtypist to see this in practice) */
+    SPEED_BEST_WPM= _(" Personal best  = %6.2f wpm ");
+    /* This is the CPM version of the above.  The same rules apply. */
+    SPEED_BEST_CPM= _(" Personal best  = %6.2f cpm ");
+    /* this must be adjusted to the right with one space at the end.
+       Leading whitespace is important because it is displayed in reverse
+       video and because it must be aligned with the previous messages
+       (it's best to run gtypist to see this in practice) */
+    SPEED_BEST_NEW_MSG= _("           new personal best ");
+    /* this is used to translate the keys for Y/N-queries. Must be two
+       uppercase letters separated by '/'. Y/N will still be accepted as
+       well. Note that the messages (prompts) themselves cannot be
+       translated because they are read from the script-file. */
+    YN = convertFromUTF8(_("Y/N"));
+    if (wcslen(YN) != 3 || YN[1] != '/' || !iswideupper(YN[0]) || !iswideupper(YN[2]))
+    {
+        fprintf( stderr,
+            "%s: i18n problem: invalid value for msgid \"Y/N\" (3 uppercase UTF-8 chars?): %ls\n",
+            argv0, YN );
+        exit( 1 );
+    }
+    /* this is used to translate the keys for Repeat/Next/Exit
+       queries. Must be three uppercase letters separated by slashes. */
+    RNE = convertFromUTF8(_("R/N/E"));
+    if (wcslen(RNE) != 5 ||
+        !iswideupper(RNE[0]) || RNE[1] != '/' ||
+        !iswideupper(RNE[2]) || RNE[3] != '/' ||
+        !iswideupper(RNE[4]))
+    {
+        fprintf( stderr,
+            "%s: i18n problem: invalid value for msgid \"R/N/E\" (5 uppercase UTF-8 chars?): %ls\n",
+            argv0, RNE );
+        exit( 1 );
+    }
+
+    /* get our name for error messages */
+    argv0 = argv[0] + strlen( argv[0] );
+    while ( argv0 > argv[0] && *argv0 != '/' )
     argv0--;
-  if ( *argv0 == '/' ) argv0++;
+    if ( *argv0 == '/' ) argv0++;

-  /* check usage */
-  parse_cmdline( argc, argv );
+    /* check usage */
+    parse_cmdline( argc, argv );

-  /* figure out what script file to use */
-  if ( argc - optind == 1 )
+    /* figure out what script file to use */
+    if ( argc - optind == 1 )
     {
-      /* try and open scipr file from command line */
-      strcpy( script_file, argv[optind] );
-      script = open_script( script_file );
+        /* try and open scipr file from command line */
+        strcpy( script_file, argv[optind] );
+        script = open_script( script_file );

-      /* we failed, so check for script in GTYPIST_PATH */
-      if( !script && getenv( "GTYPIST_PATH" ) )
+        /* we failed, so check for script in GTYPIST_PATH */
+        if( !script && getenv( "GTYPIST_PATH" ) )
         {
-          for( p = strtok( getenv( "GTYPIST_PATH" ), ":" );
-              p != NULL; p = strtok( NULL, ":" ) )
+            for( p = strtok( getenv( "GTYPIST_PATH" ), ":" );
+                 p != NULL; p = strtok( NULL, ":" ) )
            {
-             strcpy( filepath, p );
-             strcat( filepath, "/" );
-             strcat( filepath, script_file );
-             script = open_script( filepath );
-             if( script )
+                strcpy( filepath, p );
+                strcat( filepath, "/" );
+                strcat( filepath, script_file );
+                script = open_script( filepath );
+                if( script )
                break;
            }
        }

-      /* we failed, so try to find script in DATADIR */
-      if( !script )
+        /* we failed, so try to find script in DATADIR */
+        if( !script )
         {
-          strcpy( filepath, DATADIR );
-          strcat( filepath, "/" );
-          strcat( filepath, script_file );
-          script = open_script( filepath );
+            strcpy( filepath, DATADIR );
+            strcat( filepath, "/" );
+            strcat( filepath, script_file );
+            script = open_script( filepath );
        }
     }
-  else
+    else
     {
-      /* open default script */
-      sprintf( script_file, "%s/%s", DATADIR, DEFAULT_SCRIPT );
-      script = open_script( script_file );
+        /* open default script */
+        sprintf( script_file, "%s/%s", DATADIR, DEFAULT_SCRIPT );
+        script = open_script( script_file );
     }

-  /* check to make sure we open a script */
-  if( !script )
+    /* check to make sure we open a script */
+    if( !script )
     {
-      fprintf( stderr, "%s: %s %s\n",
-              argv0, _("can't find or open file"), script_file );
-      exit( 1 );
+        fprintf( stderr, "%s: %s %s\n",
+            argv0, _("can't find or open file"), script_file );
+        exit( 1 );
     }

-  /* reset global_error_max */
-  global_error_max = cl_default_error_max;
+    /* reset global_error_max */
+    global_error_max = cl_default_error_max;

-  /* check for user home directory */
+    /* check for user home directory */
 #ifdef MINGW
-  global_home_env = "APPDATA";
+    global_home_env = "APPDATA";
 #else
-  global_home_env = "HOME";
+    global_home_env = "HOME";
 #endif
-  if( !getenv( global_home_env ) || !strlen( getenv( global_home_env ) ) )
+    if( !getenv( global_home_env ) || !strlen( getenv( global_home_env ) ) )
     {
-      fprintf( stderr, _("%s: %s environment variable not set\n"), \
-         argv0, global_home_env );
-      exit( 1 );
+        fprintf( stderr, _("%s: %s environment variable not set\n"), \
+            argv0, global_home_env );
+        exit( 1 );
     }

-  /* prepare for curses stuff, and set up a signal handler
-     to undo curses if we get interrupted */
-  scr = initscr();
-  signal( SIGINT, catcher );
-  signal( SIGTERM, catcher );
+    /* prepare for curses stuff, and set up a signal handler
+       to undo curses if we get interrupted */
+    scr = initscr();
+    signal( SIGINT, catcher );
+    signal( SIGTERM, catcher );
 #ifndef MINGW
-  signal( SIGHUP, catcher );
-  signal( SIGQUIT, catcher );
+    signal( SIGHUP, catcher );
+    signal( SIGQUIT, catcher );
 #ifndef DJGPP
-  signal( SIGCHLD, catcher );
+    signal( SIGCHLD, catcher );
 #endif
-  signal( SIGPIPE, catcher );
+    signal( SIGPIPE, catcher );
 #endif
-  clear(); refresh(); typeahead( -1 );
-  keypad( scr, TRUE ); noecho(); curs_set( 0 ); raw();
+    clear(); refresh(); typeahead( -1 );
+    keypad( scr, TRUE ); noecho(); curs_set( 0 ); raw();

-  // Quick hack to get rid of the escape delays
+    // Quick hack to get rid of the escape delays
 #ifdef __NCURSES_H
-  ESCDELAY = 1;
+    ESCDELAY = 1;
 #endif

-  /* set up colour pairs if possible */
-  if (has_colors ())
-  {
-     start_color ();
-
-     init_pair (C_NORMAL,
-                colour_array [cl_fgcolour],
-                colour_array [cl_bgcolour]);
-     wbkgdset (stdscr, COLOR_PAIR (C_NORMAL));
-
-     init_pair (C_BANNER,
-                    colour_array [cl_banner_fg_colour],
-                    colour_array [cl_banner_bg_colour]);
-     init_pair (C_PROG_NAME,
-                    colour_array [cl_banner_fg_colour],
-                    colour_array [cl_prog_name_colour]);
-     init_pair (C_PROG_VERSION,
-                    colour_array [cl_banner_fg_colour],
-                    colour_array [cl_prog_version_colour]);
-     init_pair (C_MENU_TITLE,
-                    colour_array [cl_menu_title_colour],
-                    colour_array [cl_bgcolour]);
-  }
-
-  /* put up the top line banner */
-  clear();
-  banner (_("Loading the script..."));
-
-  check_script_file_with_current_encoding(script);
-
-  /* index all the labels in the file */
-  build_label_index( script );
-
-  /* run the input file */
-  parse_file( script, cl_start_label );
-  do_exit( script );
+    /* set up colour pairs if possible */
+    if (has_colors ())
+    {
+        start_color ();
+
+        init_pair (C_NORMAL,
+            colour_array [cl_fgcolour],
+            colour_array [cl_bgcolour]);
+        wbkgdset (stdscr, COLOR_PAIR (C_NORMAL));
+
+        init_pair (C_BANNER,
+            colour_array [cl_banner_fg_colour],
+            colour_array [cl_banner_bg_colour]);
+        init_pair (C_PROG_NAME,
+            colour_array [cl_banner_fg_colour],
+            colour_array [cl_prog_name_colour]);
+        init_pair (C_PROG_VERSION,
+            colour_array [cl_banner_fg_colour],
+            colour_array [cl_prog_version_colour]);
+        init_pair (C_MENU_TITLE,
+            colour_array [cl_menu_title_colour],
+            colour_array [cl_bgcolour]);
+    }
+
+    /* put up the top line banner */
+    clear();
+    banner (_("Loading the script..."));
+
+    check_script_file_with_current_encoding(script);
+
+    /* index all the labels in the file */
+    build_label_index( script );
+
+    /* run the input file */
+    parse_file( script, cl_start_label );
+    do_exit( script );

-  /* for lint... */
-  return( 0 );
+    /* for lint... */
+    return( 0 );
 }

 void do_bell() {
 #ifndef MINGW
-  putchar( ASCII_BELL );
-  fflush( stdout );
+    putchar( ASCII_BELL );
+    fflush( stdout );
 #endif
 }

 bool get_best_speed( const char *script_filename,
-                    const char *excersise_label, double *adjusted_cpm )
+    const char *excersise_label, double *adjusted_cpm )
 {
-  FILE *blfile;                                /* bestlog file */
-  char *filename;                      /* bestlog filename */
-  char *search;                                /* string to match in bestlog */
-  char line[FILENAME_MAX];             /* single line from bestlog */
-  int search_len;                      /* length of search string */
-  bool found = FALSE;                  /* did we find it? */
-  int a;
-  char *fixed_script_filename;         /* fixed-up script filename */
-  char *p;
+    FILE *blfile;                              /* bestlog file */
+    char *filename;                    /* bestlog filename */
+    char *search;                              /* string to match in bestlog */
+    char line[FILENAME_MAX];           /* single line from bestlog */
+    int search_len;                    /* length of search string */
+    bool found = FALSE;                        /* did we find it? */
+    int a;
+    char *fixed_script_filename;               /* fixed-up script filename */
+    char *p;

-  /* calculate filename */
-  filename = (char *)malloc( strlen( getenv( global_home_env ) ) +
-                             strlen( BESTLOG_FILENAME ) + 2 );
-  if( filename == NULL )
+    /* calculate filename */
+    filename = (char *)malloc( strlen( getenv( global_home_env ) ) +
+        strlen( BESTLOG_FILENAME ) + 2 );
+    if( filename == NULL )
     {
-       perror( "malloc" );
-       fatal_error( _( "internal error: malloc" ), NULL );
+        perror( "malloc" );
+        fatal_error( _( "internal error: malloc" ), NULL );
     }
-  sprintf( filename, "%s/%s", getenv( global_home_env ), BESTLOG_FILENAME );
+    sprintf( filename, "%s/%s", getenv( global_home_env ), BESTLOG_FILENAME );

-  /* open best speeds file */
-  blfile = fopen( filename, "r" );
-  if( blfile == NULL )
+    /* open best speeds file */
+    blfile = fopen( filename, "r" );
+    if( blfile == NULL )
     {
-      free( filename );
-      return FALSE;
+        free( filename );
+        return FALSE;
     }

-  /* fix-up script filename */
-  fixed_script_filename = strdup( script_filename );
-  if( fixed_script_filename == NULL )
+    /* fix-up script filename */
+    fixed_script_filename = strdup( script_filename );
+    if( fixed_script_filename == NULL )
     {
-       perror( "malloc" );
-       fatal_error( _( "internal error: malloc" ), NULL );
+        perror( "malloc" );
+        fatal_error( _( "internal error: malloc" ), NULL );
     }
-  p = fixed_script_filename;
-  while( *p != '\0' )
+    p = fixed_script_filename;
+    while( *p != '\0' )
     {
-      if( *p == ' ' )
+        if( *p == ' ' )
        *p = '+';
-      p++;
+        p++;
     }

-  /* construct search string */
-  search_len = strlen( script_filename ) + strlen( excersise_label ) + 3;
-  search = (char *)malloc( search_len + 1 );
-  if( search == NULL )
+    /* construct search string */
+    search_len = strlen( script_filename ) + strlen( excersise_label ) + 3;
+    search = (char *)malloc( search_len + 1 );
+    if( search == NULL )
     {
-       perror( "malloc" );
-       fatal_error( _( "internal error: malloc" ), NULL );
+        perror( "malloc" );
+        fatal_error( _( "internal error: malloc" ), NULL );
     }
-  sprintf( search, " %s:%s ", fixed_script_filename, excersise_label );
+    sprintf( search, " %s:%s ", fixed_script_filename, excersise_label );

-  /* search for lines that match and use data from the last one */
-  while( fgets( line, FILENAME_MAX, blfile ) )
+    /* search for lines that match and use data from the last one */
+    while( fgets( line, FILENAME_MAX, blfile ) )
     {
-      /* check that there are at least 19 chars (yyyy-mm-dd hh:mm:ss) */
-      for( a = 0; a < 19; a++ )
+        /* check that there are at least 19 chars (yyyy-mm-dd hh:mm:ss) */
+        for( a = 0; a < 19; a++ )
        if( line[ a ] == '\0' )
-         continue;
+        continue;

-      /* look for search string and try to obtain a speed */
-      if( !strncmp( search, line + 19, search_len ) &&
-         sscanf( line + 19 + search_len, "%lg", adjusted_cpm ) == 1 )
+        /* look for search string and try to obtain a speed */
+        if( !strncmp( search, line + 19, search_len ) &&
+            sscanf( line + 19 + search_len, "%lg", adjusted_cpm ) == 1 )
        {
-         found = TRUE;
+            found = TRUE;
        }
     }

-  /* cleanup and return */
-  free( search );
-  free( filename );
-  free( fixed_script_filename );
-  fclose( blfile );
-  return found;
+    /* cleanup and return */
+    free( search );
+    free( filename );
+    free( fixed_script_filename );
+    fclose( blfile );
+    return found;
 }

 void put_best_speed( const char *script_filename,
-                    const char *excersise_label, double adjusted_cpm )
+    const char *excersise_label, double adjusted_cpm )
 {
-  FILE *blfile;                                /* bestlog file */
-  char *filename;                      /* bestlog filename */
-  char *fixed_script_filename;         /* fixed-up script filename */
-  char *p;
+    FILE *blfile;                              /* bestlog file */
+    char *filename;                    /* bestlog filename */
+    char *fixed_script_filename;               /* fixed-up script filename */
+    char *p;

-  /* calculate filename */
-  filename = (char *)malloc( strlen( getenv( global_home_env ) ) +
-                             strlen( BESTLOG_FILENAME ) + 2 );
-  if( filename == NULL )
+    /* calculate filename */
+    filename = (char *)malloc( strlen( getenv( global_home_env ) ) +
+        strlen( BESTLOG_FILENAME ) + 2 );
+    if( filename == NULL )
     {
-       perror( "malloc" );
-       fatal_error( _( "internal error: malloc" ), NULL );
+        perror( "malloc" );
+        fatal_error( _( "internal error: malloc" ), NULL );
     }
-  sprintf( filename, "%s/%s", getenv( global_home_env ), BESTLOG_FILENAME );
+    sprintf( filename, "%s/%s", getenv( global_home_env ), BESTLOG_FILENAME );

-  /* open best speeds files */
-  blfile = fopen( filename, "a" );
-  if( blfile == NULL )
+    /* open best speeds files */
+    blfile = fopen( filename, "a" );
+    if( blfile == NULL )
     {
-       perror( "fopen" );
-       fatal_error( _(" internal error: fopen" ), NULL );
+        perror( "fopen" );
+        fatal_error( _(" internal error: fopen" ), NULL );
     }

-  /* fix-up script filename */
-  fixed_script_filename = strdup( script_filename );
-  if( fixed_script_filename == NULL )
+    /* fix-up script filename */
+    fixed_script_filename = strdup( script_filename );
+    if( fixed_script_filename == NULL )
     {
-       perror( "malloc" );
-       fatal_error( _( "internal error: malloc" ), NULL );
+        perror( "malloc" );
+        fatal_error( _( "internal error: malloc" ), NULL );
     }
-  p = fixed_script_filename;
-  while( *p != '\0' )
+    p = fixed_script_filename;
+    while( *p != '\0' )
     {
-      if( *p == ' ' )
+        if( *p == ' ' )
        *p = '+';
-      p++;
+        p++;
     }

-  /* get time */
-  time_t nowts = time( NULL );
-  struct tm *now = localtime( &nowts );
-
-  /* append new score */
-  fprintf( blfile, "%04d-%02d-%02d %02d:%02d:%02d %s:%s %g\n",
-          now->tm_year + 1900, now->tm_mon + 1, now->tm_mday, now->tm_hour,
-          now->tm_min, now->tm_sec, fixed_script_filename, excersise_label,
-          adjusted_cpm );
-
-  /* cleanup */
-  free( filename );
-  free( fixed_script_filename );
-  fclose( blfile );
+    /* get time */
+    time_t nowts = time( NULL );
+    struct tm *now = localtime( &nowts );
+
+    /* append new score */
+    fprintf( blfile, "%04d-%02d-%02d %02d:%02d:%02d %s:%s %g\n",
+        now->tm_year + 1900, now->tm_mon + 1, now->tm_mday, now->tm_hour,
+        now->tm_min, now->tm_sec, fixed_script_filename, excersise_label,
+        adjusted_cpm );
+
+    /* cleanup */
+    free( filename );
+    free( fixed_script_filename );
+    fclose( blfile );
 }

 /*

Diff finished.  Fri Oct 18 14:35:33 2019


--

_______________________________________________
bug-gtypist mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/bug-gtypist

reply via email to

[Prev in Thread] Current Thread [Next in Thread]