dusting
[vg.git] / vg_console.h
index 8f8517cb7d41662a7afce1f31ca2e9c1d97d4fce..9f2cba4eb647f03e2cdc867e7b2f4e9acefaa863 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */
+/* Copyright (C) 2021-2023 Harry Godden (hgn) - All Rights Reserved */
 
 #ifndef VG_CONSOLE_H
 #define VG_CONSOLE_H
 #include "vg/vg_ui.h"
 #include "vg/vg_log.h"
 
-typedef struct vg_convar vg_convar;
+#define VG_VAR_F32( NAME, ... ) \
+   { u32 flags=0x00; __VA_ARGS__ ;\
+   vg_console_reg_var( #NAME, &NAME, k_var_dtype_f32, flags ); }
+
+#define VG_VAR_I32( NAME, ... ) \
+   { u32 flags=0x00; __VA_ARGS__ ;\
+   vg_console_reg_var( #NAME, &NAME, k_var_dtype_i32, flags ); }
+
+#define VG_VAR_PERSISTENT 0x1
+#define VG_VAR_CHEAT      0x2
+
+typedef struct vg_var vg_var;
 typedef struct vg_cmd vg_cmd;
 
-struct vg_console
-{
-       struct vg_convar
-       {
+struct vg_console{
+       struct vg_var{
                void *data;
-      void (*update)(void);
                const char *name;
                
-               enum vg_convar_dtype
-               {
-                       k_convar_dtype_i32,
-                       k_convar_dtype_u32,
-                       k_convar_dtype_f32
+               enum vg_var_dtype{
+                       k_var_dtype_i32,
+                       k_var_dtype_u32,
+                       k_var_dtype_f32
                } 
                data_type;
-               
-               union
-               {
-                       struct
-                       {
-                               int min, max, clamp;
-                       } 
-         opt_i32;
-
-         struct
-         {
-            float min, max;
-            int clamp;
-         }
-         opt_f32;
-               };
 
-               int persistent; /* Should this var be stored to cfg/auto.conf? */
+      u32 flags;
        } 
-       convars[ 32 ];
+       vars[ 128 ];
        
-       struct vg_cmd
-       {
-               int (*function)( int argc, char const *argv[] );
+       struct vg_cmd{
+               int  (*function)( int argc, char const *argv[] );
+      void (*poll_suggest)( int argc, char const *argv[] );
                const char *name;
        }
        functions[ 32 ];
 
-   struct 
-   {
+   struct {
       const char *str;
       int len;
 
@@ -69,7 +59,7 @@ struct vg_console
        suggestion_pastepos,
        suggestion_maxlen;
 
-   u32 convar_count, function_count;
+   u32 var_count, function_count;
        
        char input[96],
         input_copy[96];
@@ -82,8 +72,6 @@ struct vg_console
 }
 vg_console;
 
-VG_STATIC void  vg_convar_push( struct vg_convar cv );
-VG_STATIC void  vg_function_push( struct vg_cmd cmd );
 
 VG_STATIC void _vg_console_draw( void );
 void           _vg_console_println( const char *str );
@@ -116,24 +104,40 @@ VG_STATIC int _vg_console_enabled(void)
        return vg_console.enabled; 
 }
 
-VG_STATIC void vg_convar_push( vg_convar cv )
+VG_STATIC 
+void vg_console_reg_var( const char *alias, void *ptr, enum vg_var_dtype type, 
+                         u32 flags )
 {
-   if( vg_console.convar_count > vg_list_size(vg_console.convars) )
-      vg_fatal_exit_loop( "Too many convars registered" );
+   if( vg_console.var_count > vg_list_size(vg_console.vars) )
+      vg_fatal_exit_loop( "Too many vars registered" );
+
+   vg_var *var = &vg_console.vars[ vg_console.var_count ++ ];
+   var->name = alias;
+   var->data = ptr;
+   var->data_type = type;
+   var->flags = flags;
 
-   vg_info( "Console variable '%s' registered\n", cv.name );
-   vg_console.convars[ vg_console.convar_count ++ ] = cv;
+   vg_info( "Console variable '%s' registered\n", alias );
 }
 
-VG_STATIC void vg_function_push( struct vg_cmd cmd )
+VG_STATIC 
+void vg_console_reg_cmd( const char *alias,
+                         int (*function)(int argc, const char *argv[]),
+                         void (*poll_suggest)(int argc, const char *argv[]) )
 {
    if( vg_console.function_count > vg_list_size(vg_console.functions) )
       vg_fatal_exit_loop( "Too many functions registered" );
 
-   vg_console.functions[ vg_console.function_count ++ ] = cmd;
+   vg_cmd *cmd = &vg_console.functions[ vg_console.function_count ++ ];
+
+   cmd->function = function;
+   cmd->poll_suggest = poll_suggest;
+   cmd->name = alias;
+
+   vg_info( "Console function '%s' registered\n", alias );
 }
 
-VG_STATIC void _vg_console_draw( void )
+VG_STATIC void _vg_console_draw(void)
 {
        if( !vg_console.enabled )
                return;
@@ -160,8 +164,7 @@ VG_STATIC void _vg_console_draw( void )
                vg_uictx.cursor[3] = fh;
                ui_align_bottom();
 
-               for( int i=0; i<console_lines; i ++ )
-               {
+               for( int i=0; i<console_lines; i ++ ){
                        ptr --;
 
                        if( ptr < 0 )
@@ -196,10 +199,9 @@ VG_STATIC void _vg_console_draw( void )
        ui_end_down();
 
 
-
    /* suggestions */
-   if( vg_console.suggestion_count )
-   {
+   if( vg_console.suggestion_count ){
+      vg_uictx.cursor[0] += UI_GLYPH_SPACING_X * vg_console.suggestion_pastepos;
       vg_uictx.cursor[1] += 2;
       vg_uictx.cursor[3] = vg_console.suggestion_count * fh;
       vg_uictx.cursor[2] = UI_GLYPH_SPACING_X * vg_console.suggestion_maxlen;
@@ -209,8 +211,7 @@ VG_STATIC void _vg_console_draw( void )
          ui_fill_rect( vg_uictx.cursor, 0x77040404 );
 
          vg_uictx.cursor[3] = fh;
-         for( int i=0; i<vg_console.suggestion_count; i ++ )
-         {
+         for( int i=0; i<vg_console.suggestion_count; i ++ ){
             if( i == vg_console.suggestion_select )
                ui_fill_rect( vg_uictx.cursor, 0x66a0e508 );
 
@@ -226,15 +227,13 @@ VG_STATIC void _vg_console_draw( void )
 
 VG_STATIC int _vg_console_list( int argc, char const *argv[] )
 {
-       for( int i=0; i<vg_console.function_count; i ++ )
-       {
+       for( int i=0; i<vg_console.function_count; i ++ ){
                struct vg_cmd *cmd = &vg_console.functions[ i ];
                vg_info( "* %s\n", cmd->name );
        }
        
-       for( int i=0; i<vg_console.convar_count; i ++ )
-       {
-               struct vg_convar *cv = &vg_console.convars[ i ];
+       for( int i=0; i<vg_console.var_count; i ++ ){
+               struct vg_var *cv = &vg_console.vars[ i ];
                vg_info( "%s\n", cv->name );
        }
        
@@ -247,62 +246,63 @@ int _test_break( int argc, const char *argv[] )
    return 0;
 }
 
-VG_STATIC void _vg_console_init(void)
+int _vg_console_exec( int argc, const char *argv[] )
 {
-       vg_function_push( (struct vg_cmd)
-   {
-               .name = "list",
-               .function = _vg_console_list
-       });
+   if( argc < 1 ) return 0;
 
-   vg_function_push( (struct vg_cmd)
-   {
-      .name = "crash",
-      .function = _test_break
-   });
-}
+   char path[256];
+   strcpy( path, "cfg/" );
+   strncat( path, argv[0], 250 );
 
-VG_STATIC void vg_console_load_autos(void)
-{
-       /* Read and exec persistent commands */
-       FILE *fp = fopen( "cfg/auto.conf", "r" );
-       if( fp )
-       {
+       FILE *fp = fopen( path, "r" );
+       if( fp ){
                char line[256];
 
-               while( fgets( line, sizeof( line ), fp ) )
-               {
+               while( fgets( line, sizeof( line ), fp ) ){
                        line[ strcspn( line, "\r\n#" ) ] = 0x00;
 
-                       if( line[0] != 0x00 )
-                       {
+                       if( line[0] != 0x00 ){
                                vg_execute_console_input( line );
                        }
                }
 
                fclose( fp );
        }
+   else{
+      vg_error( "Could not open '%s'\n", path );
+   }
+
+   return 0;
+}
+
+VG_STATIC void _vg_console_init(void)
+{
+   vg_console_reg_cmd( "list", _vg_console_list, NULL );
+   vg_console_reg_cmd( "crash", _test_break, NULL );
+   vg_console_reg_cmd( "exec", _vg_console_exec, NULL );
+}
+
+VG_STATIC void vg_console_load_autos(void)
+{
+   _vg_console_exec( 1, (const char *[]){ "auto.conf" } );
 }
 
 VG_STATIC void _vg_console_write_persistent(void)
 {
        FILE *fp = fopen( "cfg/auto.conf", "w" );
        
-       for( int i=0; i<vg_console.convar_count; i ++ )
-       {
-               struct vg_convar *cv = &vg_console.convars[i];
+       for( int i=0; i<vg_console.var_count; i ++ ){
+               struct vg_var *cv = &vg_console.vars[i];
 
-               if( cv->persistent )
-               {
-                       switch( cv->data_type )
-                       {
-                               case k_convar_dtype_i32:
+               if( cv->flags & VG_VAR_PERSISTENT ){
+                       switch( cv->data_type ){
+                               case k_var_dtype_i32:
                                        fprintf( fp, "%s %d\n", cv->name, *(i32 *)(cv->data) );
                                break;
-                               case k_convar_dtype_u32:
+                               case k_var_dtype_u32:
                                        fprintf( fp, "%s %u\n", cv->name, *(u32 *)(cv->data) );
                                break;
-                               case k_convar_dtype_f32:
+                               case k_var_dtype_f32:
                                        fprintf( fp, "%s %.5f\n", cv->name, *(float *)(cv->data ) );
                                break;
                        }
@@ -317,115 +317,113 @@ VG_STATIC void _vg_console_free(void)
        _vg_console_write_persistent();
 }
 
-VG_STATIC void vg_execute_console_input( const char *cmd )
+/*
+ * splits src into tokens and fills out args as pointers to those tokens
+ * returns number of tokens
+ * dst must be as long as src
+ */
+VG_STATIC int vg_console_tokenize( const char *src, char *dst, 
+                                   const char *args[8] )
 {
-       char temp[512];
-       char const *args[9];
-       int arg_count = 0;
+       int arg_count = 0,
+       in_token = 0;
        
-       int in_token = 0;
-       
-       /* Split string into tokens */
-       for( int i = 0; i < vg_list_size( temp ); i ++ )
-       {
-               if( cmd[i] )
-               {
-                       if( cmd[i] == ' ' || cmd[i] == '\t' )
-                       {
-                               temp[i] = '\0';
+       for( int i=0;; i ++ ){
+               if( src[i] ){
+                       if( src[i] == ' ' || src[i] == '\t' ){
+            if( in_token )
+               dst[i] = '\0';
+
                                in_token = 0;
                                
-                               if( arg_count == vg_list_size( args ) )
+                               if( arg_count == 8 )
                                        break;
                        }
-                       else
-                       {
-                               temp[i] = cmd[i];
+                       else{
+                               dst[i] = src[i];
                                
-                               if( !in_token )
-                               {
-                                       args[ arg_count ++ ] = temp + i;
+                               if( !in_token ){
+                                       args[ arg_count ++ ] = &dst[i];
                                        in_token = 1;
                                }
                        }
                }
-               else
-               {
-                       temp[i] = '\0';
+               else{
+                       dst[i] = '\0';
                        break;
                }
        }
+
+   return arg_count;
+}
+
+VG_STATIC vg_var *vg_console_match_var( const char *kw )
+{
+       for( int i=0; i<vg_console.var_count; i ++ ){
+               struct vg_var *cv = &vg_console.vars[ i ];
+               if( !strcmp( cv->name, kw ) ){
+         return cv;
+      }
+   }
+
+   return NULL;
+}
+
+VG_STATIC vg_cmd *vg_console_match_cmd( const char *kw )
+{
+       for( int i=0; i<vg_console.function_count; i ++ ){
+               struct vg_cmd *cmd = &vg_console.functions[ i ];
+               if( !strcmp( cmd->name, kw ) ){
+         return cmd;
+      }
+   }
+
+   return NULL;
+}
+
+VG_STATIC void vg_execute_console_input( const char *cmd )
+{
+       char temp[512];
+       char const *args[8];
+       int arg_count = vg_console_tokenize( cmd, temp, args );
        
        if( arg_count == 0 )
                return;
-       
-       int data_int;
-   float data_float;
-       
-       for( int i=0; i<vg_console.convar_count; i ++ )
-       {
-               struct vg_convar *cv = &vg_console.convars[ i ];
-               if( !strcmp( cv->name, args[0] ) )
-               {
-                       /* Cvar Matched, try get value */
-                       if( arg_count >= 2 )
-                       {
-                               switch( cv->data_type )
-                               {
-                                       case k_convar_dtype_u32:
-                                       case k_convar_dtype_i32: 
-                                               
-                                               data_int = atoi( args[1] ); 
-                  
-                                               *((int *)cv->data) = cv->opt_i32.clamp? 
-                   VG_MIN( VG_MAX(data_int, cv->opt_i32.min), cv->opt_i32.max ): 
-                   data_int;
-                                       
-                                       break;
-                                       case k_convar_dtype_f32: 
-                  data_float = atof( args[1] );
-                  *((float *)cv->data) = cv->opt_f32.clamp?
-                     vg_minf( vg_maxf( data_float, cv->opt_f32.min), 
-                              cv->opt_f32.max ):
-                     data_float;
-               break;
-                               }
 
-            if( cv->update )
-               cv->update();
-                       }
-                       else
-                       {
-                               switch( cv->data_type )
-                               {
-                                       case k_convar_dtype_i32: 
-                  vg_info( "= %d\n", *((int *)cv->data) ); 
-               break;
-                                       case k_convar_dtype_u32: 
-                  vg_info( "= %u\n", *((u32 *)cv->data) );
-               break;
-                                       case k_convar_dtype_f32: 
-                  vg_info( "= %.4f\n", *((float *)cv->data) );
-               break;
-                               }
-                       }
-               
-                       return;
-               }
-       }
-       
-   /*
-    * Find and excecute command
-    */
-       for( int i=0; i<vg_console.function_count; i ++ )
-       {
-               struct vg_cmd *cmd = &vg_console.functions[ i ];
-               if( !strcmp( cmd->name, args[0] ) )
-               {
-                       cmd->function( arg_count-1, args+1 );
-                       return;
-               }
+   vg_var *cv = vg_console_match_var( args[0] );
+   vg_cmd *fn = vg_console_match_cmd( args[0] );
+
+   assert( !(cv && fn) );
+
+   if( cv ){
+      /* Cvar Matched, try get value */
+      if( arg_count >= 2 ){
+         if( (cv->data_type == k_var_dtype_u32) ||
+             (cv->data_type == k_var_dtype_i32) )
+         {
+            int *ptr = cv->data;
+            *ptr = atoi( args[1] ); 
+         }
+         else if( cv->data_type == k_var_dtype_f32 ){
+            float *ptr = cv->data;
+            *ptr = atof( args[1] );
+         }
+      }
+      else{
+         if( cv->data_type == k_var_dtype_i32 )
+            vg_info( "= %d\n", *((int *)cv->data) ); 
+         else if( cv->data_type == k_var_dtype_u32 )
+            vg_info( "= %u\n", *((u32 *)cv->data) );
+         else if( cv->data_type == k_var_dtype_f32 )
+            vg_info( "= %.4f\n", *((float *)cv->data) );
+      }
+   
+      return;
        }
+   else if( fn ){
+      fn->function( arg_count-1, args+1 );
+      return;
+   }
        
        vg_error( "No command/var named '%s'. Use 'list' to view all\n", args[0] );
 }
@@ -446,20 +444,17 @@ u32 str_lev_distance( const char *s1, const char *s2 )
       costs[k] = k;
 
    u32 i = 0;
-   for( u32 i=0; i<m; i++ )
-   {
+   for( u32 i=0; i<m; i++ ){
       costs[0] = i+1;
 
       u32 corner = i;
 
-      for( u32 j=0; j<n; j++ )
-      {
+      for( u32 j=0; j<n; j++ ){
          u32 upper = costs[j+1];
 
          if( s1[i] == s2[j] )
             costs[ j+1 ] = corner;
-         else
-         {
+         else{
             u32 t = (upper < corner)? upper: corner;
             costs[j+1] = ((costs[j] < t)? costs[j]: t) + 1;
          }
@@ -479,14 +474,11 @@ u32 str_lcs( const char *s1, const char *s2 )
    int suff[32][32],
        result = 0;
 
-   for( int i=0; i<=m; i++ )
-   {
-      for( int j=0; j<=n; j++ )
-      {
+   for( int i=0; i<=m; i++ ){
+      for( int j=0; j<=n; j++ ){
          if( i == 0 || j == 0 )
             suff[i][j] = 0;
-         else if( s1[i-1] == s2[j-1] )
-         {
+         else if( s1[i-1] == s2[j-1] ){
             suff[i][j] = suff[i-1][j-1] + 1;
             result = VG_MAX( result, suff[i][j] );
          }
@@ -499,12 +491,18 @@ u32 str_lcs( const char *s1, const char *s2 )
 }
 
 /* str must not fuckoff ever! */
-VG_STATIC void console_suggest_score_text( const char *input, const char *str )
+VG_STATIC void console_suggest_score_text( const char *str, const char *input,
+                                           int minscore )
 {
+   /* filter duplicates */
+   for( int i=0; i<vg_console.suggestion_count; i++ )
+      if( !strcmp( vg_console.suggestions[i].str, str ) )
+         return;
+
    /* calc score */
    u32 score = str_lcs( str, input );
 
-   if( score < 1 )
+   if( score < minscore )
       return;
 
    int best_pos = vg_console.suggestion_count;
@@ -513,8 +511,7 @@ VG_STATIC void console_suggest_score_text( const char *input, const char *str )
          best_pos = j;
    
    /* insert if good score */
-   if( best_pos < vg_list_size( vg_console.suggestions ) )
-   {
+   if( best_pos < vg_list_size( vg_console.suggestions ) ){
       int start = VG_MIN( vg_console.suggestion_count, 
                           vg_list_size( vg_console.suggestions )-1 );
       for( int j=start; j>best_pos; j -- )
@@ -536,44 +533,58 @@ VG_STATIC void console_update_suggestions(void)
    vg_console.suggestion_select = -1;
    vg_console.suggestion_maxlen = 0;
 
-   /* find current term */
-   int start_index = 0;
+   /* 
+    * - must be typing something
+    * - must be at the end
+    * - prev char must not be a whitespace
+    * - cursors should match
+    */
 
-   for( int i=0; 1; i++ )
-   {
-      if( !vg_console.input[i] )
-         break;
+   if( vg_console.cursor_pos == 0 )
+      return;
 
-      if( isspace( vg_console.input[i] ) )
-      {
-         start_index = i;
+   if( vg_console.cursor_pos != vg_console.cursor_user )
+      return;
 
-         /* TODO:  not just functions
-          */
+   if( vg_console.input[ vg_console.cursor_pos ] != '\0' )
+      return;
 
-         return;
-      }
-   }
+   if(  (vg_console.input[ vg_console.cursor_pos -1 ] == ' ') ||
+        (vg_console.input[ vg_console.cursor_pos -1 ] == '\t') )
+      return;
 
-   vg_console.suggestion_pastepos = start_index;
-   const char *input_ref = &vg_console.input[ start_index ];
+   char temp[128];
+   const char *args[8];
 
-   /* Score all  our commands and cvars */
-   for( int i=0; i<vg_console.convar_count; i++ )
-   {
-      vg_convar *cvar = &vg_console.convars[i];
-      console_suggest_score_text( input_ref, cvar->name );
+   int token_count = vg_console_tokenize( vg_console.input, temp, args );
+
+   vg_console.suggestion_pastepos = args[token_count-1]-temp;
+
+   /* Score all our commands and cvars */
+   if( token_count == 1 ){
+      for( int i=0; i<vg_console.var_count; i++ ){
+         vg_var *cvar = &vg_console.vars[i];
+         console_suggest_score_text( cvar->name, args[0], 1 );
+      }
+
+      for( int i=0; i<vg_console.function_count; i++ ){
+         vg_cmd *cmd = &vg_console.functions[i];
+         console_suggest_score_text( cmd->name, args[0], 1 );
+      }
    }
+   else{
+      vg_cmd *cmd = vg_console_match_cmd( args[0] );
+      vg_var *var = vg_console_match_var( args[0] );
 
-   for( int i=0; i<vg_console.function_count; i++ )
-   {
-      vg_cmd *cmd = &vg_console.functions[i];
-      console_suggest_score_text( input_ref, cmd->name );
+      assert( !( cmd && var ) );
+
+      if( cmd )
+         if( cmd->poll_suggest )
+            cmd->poll_suggest( token_count-1, &args[1] );
    }
 
    /* some post processing */
-   for( int i=0; i<vg_console.suggestion_count; i++ )
-   {
+   for( int i=0; i<vg_console.suggestion_count; i++ ){
       vg_console.suggestion_maxlen = VG_MAX( vg_console.suggestion_maxlen,
                                              vg_console.suggestions[i].len );
 
@@ -632,8 +643,7 @@ VG_STATIC int console_delete_char( int direction )
        console_make_selection( &start, &end );
        
        /* There is no selection */
-       if( !(end-start) )
-       {
+       if( !(end-start) ){
                if( direction == 1 ) end = VG_MIN( end+1, strlen( vg_console.input ) );
                else if( direction == -1 ) start = VG_MAX( start-1, 0 );
        }
@@ -647,8 +657,6 @@ VG_STATIC int console_delete_char( int direction )
        memmove( &vg_console.input[ start ], 
             &vg_console.input[ end ], 
             remaining_length );
-
-   console_update_suggestions();
        return start;
 }
 
@@ -658,8 +666,7 @@ VG_STATIC void console_to_clipboard(void)
        console_make_selection( &start, &end );
        char buffer[512];
        
-       if( end-start )
-       {
+       if( end-start ){
                memcpy( buffer, &vg_console.input[ start ], end-start );
                buffer[ end-start ] = 0x00;
       SDL_SetClipboardText( buffer );
@@ -776,12 +783,16 @@ VG_STATIC void _console_backspace(void)
 {
    vg_console.cursor_user = console_delete_char( -1 );
    vg_console.cursor_pos = vg_console.cursor_user;
+
+   console_update_suggestions();
 }
 
 VG_STATIC void _console_delete(void)
 {
    vg_console.cursor_user = console_delete_char( 1 );
    vg_console.cursor_pos = vg_console.cursor_user;
+
+   console_update_suggestions();
 }
 
 VG_STATIC void _console_home_select(void)
@@ -853,15 +864,15 @@ VG_STATIC void _console_enter(void)
  */
 VG_STATIC void _console_fetch_suggestion(void)
 {
-   if( vg_console.suggestion_select == -1 )
-   {
-      strcpy( vg_console.input, vg_console.input_copy );
+   char *target = &vg_console.input[ vg_console.suggestion_pastepos ];
+
+   if( vg_console.suggestion_select == -1 ){
+      strcpy( target, vg_console.input_copy );
       console_move_cursor( &vg_console.cursor_user, 
                            &vg_console.cursor_pos, 10000, 1 );
    }
-   else
-   {
-      strncpy( vg_console.input,
+   else{
+      strncpy( target,
             vg_console.suggestions[ vg_console.suggestion_select ].str,
             vg_list_size( vg_console.input )-1 );
 
@@ -873,14 +884,15 @@ VG_STATIC void _console_fetch_suggestion(void)
 
 VG_STATIC void _console_suggest_store_normal(void)
 {
-   if( vg_console.suggestion_select == -1 )
-      strcpy( vg_console.input_copy, vg_console.input );
+   if( vg_console.suggestion_select == -1 ){
+      char *target = &vg_console.input[ vg_console.suggestion_pastepos ];
+      strcpy( vg_console.input_copy, target );
+   }
 }
 
 VG_STATIC void _console_suggest_next(void)
 {
-   if( vg_console.suggestion_count )
-   {
+   if( vg_console.suggestion_count ){
       _console_suggest_store_normal();
 
       vg_console.suggestion_select ++;
@@ -894,8 +906,7 @@ VG_STATIC void _console_suggest_next(void)
 
 VG_STATIC void _console_suggest_prev(void)
 {
-   if( vg_console.suggestion_count )
-   {
+   if( vg_console.suggestion_count ){
       _console_suggest_store_normal();
 
       vg_console.suggestion_select --;
@@ -913,8 +924,7 @@ VG_STATIC void _console_suggest_prev(void)
 VG_STATIC void console_proc_key( SDL_Keysym ev )
 {
    /* Open / close console */
-   if( ev.sym == SDLK_BACKQUOTE )
-   {
+   if( ev.sym == SDLK_BACKQUOTE ){
       vg_console.enabled = !vg_console.enabled;
 
       if( vg_console.enabled )
@@ -966,22 +976,17 @@ VG_STATIC void console_proc_key( SDL_Keysym ev )
    if( ev.mod & KMOD_ALT )
       mod |= KMOD_ALT;
 
-   for( int i=0; i<vg_list_size( mappings ); i++ )
-   {
+   for( int i=0; i<vg_list_size( mappings ); i++ ){
       struct console_mapping *mapping = &mappings[i];
 
-      if( mapping->key == ev.sym )
-      {
-         if( mapping->mod == 0 )
-         {
-            if( mod == 0 )
-            {
+      if( mapping->key == ev.sym ){
+         if( mapping->mod == 0 ){
+            if( mod == 0 ){
                mapping->handler();
                return;
             }
          }
-         else if( (mod & mapping->mod) == mapping->mod )
-         {
+         else if( (mod & mapping->mod) == mapping->mod ){
             mapping->handler();
             return;
          }
@@ -996,8 +1001,7 @@ VG_STATIC void console_proc_utf8( const char *text )
 {
    const char *ptr = text;
 
-   while( *ptr )
-   {
+   while( *ptr ){
       if( *ptr != '`' ) 
          console_put_char( *ptr );
       ptr ++;