moved functions to parse GIC parameters from 'libgame' to main source tree
[rocksndiamonds.git] / src / libgame / misc.c
index 37a2760b08a3cc9224fe0df6aba70cefe655ce4b..fedc30487786287ea3e99dc75cb4aab57243e1af 100644 (file)
@@ -259,8 +259,7 @@ void PrintLineWithPrefix(char *prefix, char *line_chars, int line_length)
    the used memory is static, but will be overwritten by later calls,
    so if you want to save the result, copy it to a private string buffer;
    there can be 10 local calls of int2str() without buffering the result --
-   the 11th call will then destroy the result from the first call and so on.
-*/
+   the 11th call will then destroy the result from the first call and so on. */
 
 char *int2str(int number, int size)
 {
@@ -286,9 +285,9 @@ char *int2str(int number, int size)
 }
 
 
-/* something similar to "int2str()" above, but allocates its own memory
-   and has a different interface; we cannot use "itoa()", because this
-   seems to be already defined when cross-compiling to the win32 target */
+// something similar to "int2str()" above, but allocates its own memory
+// and has a different interface; we cannot use "itoa()", because this
+// seems to be already defined when cross-compiling to the win32 target
 
 char *i_to_a(unsigned int i)
 {
@@ -307,8 +306,8 @@ char *i_to_a(unsigned int i)
 }
 
 
-/* calculate base-2 logarithm of argument (rounded down to integer;
-   this function returns the number of the highest bit set in argument) */
+// calculate base-2 logarithm of argument (rounded down to integer;
+// this function returns the number of the highest bit set in argument)
 
 int log_2(unsigned int x)
 {
@@ -535,13 +534,13 @@ static char *get_corrected_real_name(char *real_name)
   // copy the name string, but not more than MAX_USERNAME_LEN characters
   while (*from_ptr && (int)(to_ptr - real_name_new) < MAX_USERNAME_LEN - 1)
   {
-    /* the name field read from "passwd" file may also contain additional
-       user information, separated by commas, which will be removed here */
+    // the name field read from "passwd" file may also contain additional
+    // user information, separated by commas, which will be removed here
     if (*from_ptr == ',')
       break;
 
-    /* the user's real name may contain 'german sharp s' characters,
-       which have no equivalent in upper case letters (used by our fonts) */
+    // the user's real name may contain 'german sharp s' characters,
+    // which have no equivalent in upper case letters (used by our fonts)
     if (*from_ptr == CHAR_BYTE_SHARP_S)
     {
       from_ptr++;
@@ -1553,10 +1552,6 @@ static void translate_keyname(Key *keysym, char **x11name, char **name, int mode
     { KSYM_Meta_R,     "XK_Meta_R",            "right meta" },
     { KSYM_Alt_L,      "XK_Alt_L",             "left alt" },
     { KSYM_Alt_R,      "XK_Alt_R",             "right alt" },
-#if !defined(TARGET_SDL2)
-    { KSYM_Super_L,    "XK_Super_L",           "left super" },  // Win-L
-    { KSYM_Super_R,    "XK_Super_R",           "right super" }, // Win-R
-#endif
     { KSYM_Mode_switch,        "XK_Mode_switch",       "mode switch" }, // Alt-R
     { KSYM_Multi_key,  "XK_Multi_key",         "multi key" },   // Ctrl-R
 
@@ -1570,7 +1565,6 @@ static void translate_keyname(Key *keysym, char **x11name, char **name, int mode
     { KSYM_Page_Up,    "XK_Page_Up",           "page up" },
     { KSYM_Page_Down,  "XK_Page_Down",         "page down" },
 
-#if defined(TARGET_SDL2)
     { KSYM_Select,     "XK_Select",            "select" },
     { KSYM_Menu,       "XK_Menu",              "menu" },        // menu key
     { KSYM_Back,       "XK_Back",              "back" },        // back key
@@ -1578,7 +1572,6 @@ static void translate_keyname(Key *keysym, char **x11name, char **name, int mode
 #if defined(PLATFORM_ANDROID)
     { KSYM_Rewind,     "XK_Rewind",            "rewind" },
     { KSYM_FastForward,        "XK_FastForward",       "fast forward" },
-#endif
 #endif
 
     // ASCII 0x20 to 0x40 keys (except numbers)
@@ -1629,7 +1622,6 @@ static void translate_keyname(Key *keysym, char **x11name, char **name, int mode
     { KSYM_udiaeresis, "XK_udiaeresis",        "u umlaut" },
     { KSYM_ssharp,     "XK_ssharp",            "sharp s" },
 
-#if defined(TARGET_SDL2)
     // special (non-ASCII) keys (UTF-8, for reverse mapping only)
     { KSYM_degree,     "XK_degree",            "\xc2\xb0" },
     { KSYM_Adiaeresis, "XK_Adiaeresis",        "\xc3\x84" },
@@ -1642,9 +1634,7 @@ static void translate_keyname(Key *keysym, char **x11name, char **name, int mode
 
     // other keys (for reverse mapping only)
     { KSYM_space,      "XK_space",             " " },
-#endif
 
-#if defined(TARGET_SDL2)
     // keypad keys are not in numerical order in SDL2
     { KSYM_KP_0,       "XK_KP_0",              "keypad 0" },
     { KSYM_KP_1,       "XK_KP_1",              "keypad 1" },
@@ -1656,7 +1646,6 @@ static void translate_keyname(Key *keysym, char **x11name, char **name, int mode
     { KSYM_KP_7,       "XK_KP_7",              "keypad 7" },
     { KSYM_KP_8,       "XK_KP_8",              "keypad 8" },
     { KSYM_KP_9,       "XK_KP_9",              "keypad 9" },
-#endif
 
     // end-of-array identifier
     { 0,                NULL,                  NULL }
@@ -1675,10 +1664,6 @@ static void translate_keyname(Key *keysym, char **x11name, char **name, int mode
       sprintf(name_buffer, "%c", 'a' + (char)(key - KSYM_a));
     else if (key >= KSYM_0 && key <= KSYM_9)
       sprintf(name_buffer, "%c", '0' + (char)(key - KSYM_0));
-#if !defined(TARGET_SDL2)
-    else if (key >= KSYM_KP_0 && key <= KSYM_KP_9)
-      sprintf(name_buffer, "keypad %c", '0' + (char)(key - KSYM_KP_0));
-#endif
     else if (key >= KSYM_FKEY_FIRST && key <= KSYM_FKEY_LAST)
       sprintf(name_buffer, "F%d", (int)(key - KSYM_FKEY_FIRST + 1));
     else if (key == KSYM_UNDEFINED)
@@ -1714,10 +1699,6 @@ static void translate_keyname(Key *keysym, char **x11name, char **name, int mode
       sprintf(name_buffer, "XK_%c", 'a' + (char)(key - KSYM_a));
     else if (key >= KSYM_0 && key <= KSYM_9)
       sprintf(name_buffer, "XK_%c", '0' + (char)(key - KSYM_0));
-#if !defined(TARGET_SDL2)
-    else if (key >= KSYM_KP_0 && key <= KSYM_KP_9)
-      sprintf(name_buffer, "XK_KP_%c", '0' + (char)(key - KSYM_KP_0));
-#endif
     else if (key >= KSYM_FKEY_FIRST && key <= KSYM_FKEY_LAST)
       sprintf(name_buffer, "XK_F%d", (int)(key - KSYM_FKEY_FIRST + 1));
     else if (key == KSYM_UNDEFINED)
@@ -1795,15 +1776,6 @@ static void translate_keyname(Key *keysym, char **x11name, char **name, int mode
       else if (c >= '0' && c <= '9')
        key = KSYM_0 + (Key)(c - '0');
     }
-#if !defined(TARGET_SDL2)
-    else if (strPrefix(name_ptr, "XK_KP_") && strlen(name_ptr) == 7)
-    {
-      char c = name_ptr[6];
-
-      if (c >= '0' && c <= '9')
-       key = KSYM_KP_0 + (Key)(c - '0');
-    }
-#endif
     else if (strPrefix(name_ptr, "XK_F") && strlen(name_ptr) <= 6)
     {
       char c1 = name_ptr[4];
@@ -2637,8 +2609,19 @@ char *get_mapped_token(char *token)
   // !!! make this dynamically configurable (init.c:InitArtworkConfig) !!!
   static char *map_token_prefix[][2] =
   {
-    { "char_procent",          "char_percent"  },
-    { NULL,                                    }
+    { "char_procent",          "char_percent"                  },
+    { "bd_magic_wall_filling", "bd_magic_wall.filling"         },
+    { "bd_magic_wall_emptying",        "bd_magic_wall.emptying"        },
+    { "bd_butterfly_left",     "bd_butterfly.left"             },
+    { "bd_butterfly_right",    "bd_butterfly.right"            },
+    { "bd_butterfly_up",       "bd_butterfly.up"               },
+    { "bd_butterfly_down",     "bd_butterfly.down"             },
+    { "bd_firefly_left",       "bd_firefly.left"               },
+    { "bd_firefly_right",      "bd_firefly.right"              },
+    { "bd_firefly_up",         "bd_firefly.up"                 },
+    { "bd_firefly_down",       "bd_firefly.down"               },
+
+    { NULL,                                                    }
   };
   int i;
 
@@ -2736,273 +2719,6 @@ static char *get_special_base_token(struct ArtworkListInfo *artwork_info,
   return getStringCopyN(token, strlen(token) - len_suffix);
 }
 
-/* This function checks if a string <s> of the format "string1, string2, ..."
-   exactly contains a string <s_contained>. */
-
-static boolean string_has_parameter(char *s, char *s_contained)
-{
-  char *substring;
-
-  if (s == NULL || s_contained == NULL)
-    return FALSE;
-
-  if (strlen(s_contained) > strlen(s))
-    return FALSE;
-
-  if (strncmp(s, s_contained, strlen(s_contained)) == 0)
-  {
-    char next_char = s[strlen(s_contained)];
-
-    // check if next character is delimiter or whitespace
-    return (next_char == ',' || next_char == '\0' ||
-           next_char == ' ' || next_char == '\t' ? TRUE : FALSE);
-  }
-
-  // check if string contains another parameter string after a comma
-  substring = strchr(s, ',');
-  if (substring == NULL)       // string does not contain a comma
-    return FALSE;
-
-  // advance string pointer to next character after the comma
-  substring++;
-
-  // skip potential whitespaces after the comma
-  while (*substring == ' ' || *substring == '\t')
-    substring++;
-
-  return string_has_parameter(substring, s_contained);
-}
-
-static int get_anim_parameter_value(char *s)
-{
-  char *pattern_1 = "click:anim_";
-  char *pattern_2 = ".part_";
-  char *matching_char = NULL;
-  char *s_ptr = s;
-  int result = ANIM_EVENT_NONE;
-
-  matching_char = strstr(s_ptr, pattern_1);
-  if (matching_char == NULL)
-    return ANIM_EVENT_NONE;
-
-  s_ptr = matching_char + strlen(pattern_1);
-
-  // check for main animation number ("anim_X" or "anim_XX")
-  if (*s_ptr >= '0' && *s_ptr <= '9')
-  {
-    int gic_anim_nr = (*s_ptr++ - '0');
-
-    if (*s_ptr >= '0' && *s_ptr <= '9')
-      gic_anim_nr = 10 * gic_anim_nr + (*s_ptr++ - '0');
-
-    if (gic_anim_nr < 1 || gic_anim_nr > MAX_GLOBAL_ANIMS)
-      return ANIM_EVENT_NONE;
-
-    result |= gic_anim_nr << ANIM_EVENT_ANIM_BIT;
-  }
-  else
-  {
-    // invalid main animation number specified
-
-    return ANIM_EVENT_NONE;
-  }
-
-  // check for animation part number ("part_X" or "part_XX") (optional)
-  if (strPrefix(s_ptr, pattern_2))
-  {
-    s_ptr += strlen(pattern_2);
-
-    if (*s_ptr >= '0' && *s_ptr <= '9')
-    {
-      int gic_part_nr = (*s_ptr++ - '0');
-
-      if (*s_ptr >= '0' && *s_ptr <= '9')
-       gic_part_nr = 10 * gic_part_nr + (*s_ptr++ - '0');
-
-      if (gic_part_nr < 1 || gic_part_nr > MAX_GLOBAL_ANIM_PARTS)
-       return ANIM_EVENT_NONE;
-
-      result |= gic_part_nr << ANIM_EVENT_PART_BIT;
-    }
-    else
-    {
-      // invalid animation part number specified
-
-      return ANIM_EVENT_NONE;
-    }
-  }
-
-  // discard result if next character is neither delimiter nor whitespace
-  if (!(*s_ptr == ',' || *s_ptr == '\0' ||
-       *s_ptr == ' ' || *s_ptr == '\t'))
-    return ANIM_EVENT_NONE;
-
-  return result;
-}
-
-static int get_anim_action_parameter_value(char *token)
-{
-  int result = getImageIDFromToken(token);
-
-  if (result == -1)
-  {
-    char *gfx_token = getStringCat2("gfx.", token);
-
-    result = getImageIDFromToken(gfx_token);
-
-    checked_free(gfx_token);
-  }
-
-  if (result == -1)
-  {
-    Key key = getKeyFromX11KeyName(token);
-
-    if (key != KSYM_UNDEFINED)
-      result = -(int)key;
-  }
-
-  if (result == -1)
-    result = ANIM_EVENT_ACTION_NONE;
-
-  return result;
-}
-
-int get_parameter_value(char *value_raw, char *suffix, int type)
-{
-  char *value = getStringToLower(value_raw);
-  int result = 0;      // probably a save default value
-
-  if (strEqual(suffix, ".direction"))
-  {
-    result = (strEqual(value, "left")  ? MV_LEFT :
-             strEqual(value, "right") ? MV_RIGHT :
-             strEqual(value, "up")    ? MV_UP :
-             strEqual(value, "down")  ? MV_DOWN : MV_NONE);
-  }
-  else if (strEqual(suffix, ".position"))
-  {
-    result = (strEqual(value, "left")   ? POS_LEFT :
-             strEqual(value, "right")  ? POS_RIGHT :
-             strEqual(value, "top")    ? POS_TOP :
-             strEqual(value, "upper")  ? POS_UPPER :
-             strEqual(value, "middle") ? POS_MIDDLE :
-             strEqual(value, "lower")  ? POS_LOWER :
-             strEqual(value, "bottom") ? POS_BOTTOM :
-             strEqual(value, "any")    ? POS_ANY :
-             strEqual(value, "last")   ? POS_LAST : POS_UNDEFINED);
-  }
-  else if (strEqual(suffix, ".align"))
-  {
-    result = (strEqual(value, "left")   ? ALIGN_LEFT :
-             strEqual(value, "right")  ? ALIGN_RIGHT :
-             strEqual(value, "center") ? ALIGN_CENTER :
-             strEqual(value, "middle") ? ALIGN_CENTER : ALIGN_DEFAULT);
-  }
-  else if (strEqual(suffix, ".valign"))
-  {
-    result = (strEqual(value, "top")    ? VALIGN_TOP :
-             strEqual(value, "bottom") ? VALIGN_BOTTOM :
-             strEqual(value, "middle") ? VALIGN_MIDDLE :
-             strEqual(value, "center") ? VALIGN_MIDDLE : VALIGN_DEFAULT);
-  }
-  else if (strEqual(suffix, ".anim_mode"))
-  {
-    result = (string_has_parameter(value, "none")      ? ANIM_NONE :
-             string_has_parameter(value, "loop")       ? ANIM_LOOP :
-             string_has_parameter(value, "linear")     ? ANIM_LINEAR :
-             string_has_parameter(value, "pingpong")   ? ANIM_PINGPONG :
-             string_has_parameter(value, "pingpong2")  ? ANIM_PINGPONG2 :
-             string_has_parameter(value, "random")     ? ANIM_RANDOM :
-             string_has_parameter(value, "ce_value")   ? ANIM_CE_VALUE :
-             string_has_parameter(value, "ce_score")   ? ANIM_CE_SCORE :
-             string_has_parameter(value, "ce_delay")   ? ANIM_CE_DELAY :
-             string_has_parameter(value, "horizontal") ? ANIM_HORIZONTAL :
-             string_has_parameter(value, "vertical")   ? ANIM_VERTICAL :
-             string_has_parameter(value, "centered")   ? ANIM_CENTERED :
-             string_has_parameter(value, "all")        ? ANIM_ALL :
-             ANIM_DEFAULT);
-
-    if (string_has_parameter(value, "once"))
-      result |= ANIM_ONCE;
-
-    if (string_has_parameter(value, "reverse"))
-      result |= ANIM_REVERSE;
-
-    if (string_has_parameter(value, "opaque_player"))
-      result |= ANIM_OPAQUE_PLAYER;
-
-    if (string_has_parameter(value, "static_panel"))
-      result |= ANIM_STATIC_PANEL;
-  }
-  else if (strEqual(suffix, ".init_event") ||
-          strEqual(suffix, ".anim_event"))
-  {
-    result = ANIM_EVENT_DEFAULT;
-
-    if (string_has_parameter(value, "any"))
-      result |= ANIM_EVENT_ANY;
-
-    if (string_has_parameter(value, "click"))
-      result |= ANIM_EVENT_SELF;
-
-    // add optional "click:anim_X" or "click:anim_X.part_X" parameter
-    result |= get_anim_parameter_value(value);
-  }
-  else if (strEqual(suffix, ".init_event_action") ||
-          strEqual(suffix, ".anim_event_action"))
-  {
-    result = get_anim_action_parameter_value(value_raw);
-  }
-  else if (strEqual(suffix, ".class"))
-  {
-    result = (strEqual(value, ARG_UNDEFINED) ? ARG_UNDEFINED_VALUE :
-             get_hash_from_key(value));
-  }
-  else if (strEqual(suffix, ".style"))
-  {
-    result = STYLE_DEFAULT;
-
-    if (string_has_parameter(value, "accurate_borders"))
-      result |= STYLE_ACCURATE_BORDERS;
-
-    if (string_has_parameter(value, "inner_corners"))
-      result |= STYLE_INNER_CORNERS;
-
-    if (string_has_parameter(value, "reverse"))
-      result |= STYLE_REVERSE;
-
-    if (string_has_parameter(value, "passthrough_clicks"))
-      result |= STYLE_PASSTHROUGH;
-
-    if (string_has_parameter(value, "multiple_actions"))
-      result |= STYLE_MULTIPLE_ACTIONS;
-  }
-  else if (strEqual(suffix, ".fade_mode"))
-  {
-    result = (string_has_parameter(value, "none")      ? FADE_MODE_NONE :
-             string_has_parameter(value, "fade")       ? FADE_MODE_FADE :
-             string_has_parameter(value, "crossfade")  ? FADE_MODE_CROSSFADE :
-             string_has_parameter(value, "melt")       ? FADE_MODE_MELT :
-             string_has_parameter(value, "curtain")    ? FADE_MODE_CURTAIN :
-             FADE_MODE_DEFAULT);
-  }
-  else if (strPrefix(suffix, ".font"))         // (may also be ".font_xyz")
-  {
-    result = gfx.get_font_from_token_function(value);
-  }
-  else         // generic parameter of type integer or boolean
-  {
-    result = (strEqual(value, ARG_UNDEFINED) ? ARG_UNDEFINED_VALUE :
-             type == TYPE_INTEGER ? get_integer_from_string(value) :
-             type == TYPE_BOOLEAN ? get_boolean_from_string(value) :
-             ARG_UNDEFINED_VALUE);
-  }
-
-  free(value);
-
-  return result;
-}
-
 static void FreeCustomArtworkList(struct ArtworkListInfo *,
                                  struct ListNodeInfo ***, int *);
 
@@ -3758,9 +3474,9 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info,
   // check if the old and the new artwork file are the same
   if (*listnode && strEqual((*listnode)->source_filename, filename))
   {
-    /* The old and new artwork are the same (have the same filename and path).
-       This usually means that this artwork does not exist in this artwork set
-       and a fallback to the existing artwork is done. */
+    // The old and new artwork are the same (have the same filename and path).
+    // This usually means that this artwork does not exist in this artwork set
+    // and a fallback to the existing artwork is done.
 
     return;
   }