src/SDL_hints.c
changeset 5189 6f6a9340fb93
child 5200 01bced9a4cc1
equal deleted inserted replaced
5188:59e0688d766f 5189:6f6a9340fb93
       
     1 /*
       
     2     SDL - Simple DirectMedia Layer
       
     3     Copyright (C) 1997-2010 Sam Lantinga
       
     4 
       
     5     This library is free software; you can redistribute it and/or
       
     6     modify it under the terms of the GNU Lesser General Public
       
     7     License as published by the Free Software Foundation; either
       
     8     version 2.1 of the License, or (at your option) any later version.
       
     9 
       
    10     This library is distributed in the hope that it will be useful,
       
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       
    13     Lesser General Public License for more details.
       
    14 
       
    15     You should have received a copy of the GNU Lesser General Public
       
    16     License along with this library; if not, write to the Free Software
       
    17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
       
    18 
       
    19     Sam Lantinga
       
    20     slouken@libsdl.org
       
    21 */
       
    22 #include "SDL_config.h"
       
    23 
       
    24 #include "SDL_hints.h"
       
    25 
       
    26 
       
    27 /* Assuming there aren't many hints set and they aren't being queried in
       
    28    critical performance paths, we'll just use a linked list here.
       
    29  */
       
    30 typedef struct SDL_Hint {
       
    31     char *name;
       
    32     char *value;
       
    33     SDL_HintPriority priority;
       
    34     struct SDL_Hint *next;
       
    35 } SDL_Hint;
       
    36 
       
    37 static SDL_Hint *SDL_hints;
       
    38 
       
    39 
       
    40 SDL_bool
       
    41 SDL_SetHint(const char *name, const char *value, SDL_HintPriority priority)
       
    42 {
       
    43     const char *env;
       
    44     SDL_Hint *prev, *hint;
       
    45 
       
    46     if (!name || !value) {
       
    47         return SDL_FALSE;
       
    48     }
       
    49 
       
    50     env = SDL_getenv(name);
       
    51     if (env && priority < SDL_HINT_OVERRIDE) {
       
    52         return SDL_FALSE;
       
    53     }
       
    54 
       
    55     prev = NULL;
       
    56     for (hint = SDL_hints; hint; prev = hint, hint = hint->next) {
       
    57         if (SDL_strcmp(name, hint->name) == 0) {
       
    58             if (priority < hint->priority) {
       
    59                 return SDL_FALSE;
       
    60             }
       
    61             if (SDL_strcmp(hint->value, value) != 0) {
       
    62                 SDL_free(hint->value);
       
    63                 hint->value = SDL_strdup(value);
       
    64             }
       
    65             hint->priority = priority;
       
    66             return SDL_TRUE;
       
    67         }
       
    68     }
       
    69 
       
    70     /* Couldn't find the hint, add a new one */
       
    71     hint = (SDL_Hint *)SDL_malloc(sizeof(*hint));
       
    72     if (!hint) {
       
    73         return SDL_FALSE;
       
    74     }
       
    75     hint->name = SDL_strdup(name);
       
    76     hint->value = SDL_strdup(value);
       
    77     hint->priority = priority;
       
    78     hint->next = SDL_hints;
       
    79     SDL_hints = hint;
       
    80     return SDL_TRUE;
       
    81 }
       
    82 
       
    83 const char *
       
    84 SDL_GetHint(const char *name)
       
    85 {
       
    86     const char *env;
       
    87     SDL_Hint *hint;
       
    88 
       
    89     env = SDL_getenv(name);
       
    90     for (hint = SDL_hints; hint; hint = hint->next) {
       
    91         if (SDL_strcmp(name, hint->name) == 0) {
       
    92             if (!env || hint->priority == SDL_HINT_OVERRIDE) {
       
    93                 return hint->value;
       
    94             }
       
    95             break;
       
    96         }
       
    97     }
       
    98     return env;
       
    99 }
       
   100 
       
   101 void SDL_ClearHints()
       
   102 {
       
   103     SDL_Hint *hint;
       
   104 
       
   105     while (SDL_hints) {
       
   106         hint = SDL_hints;
       
   107         SDL_hints = hint->next;
       
   108 
       
   109         SDL_free(hint->name);
       
   110         SDL_free(hint->value);
       
   111         SDL_free(hint);
       
   112     }
       
   113 }
       
   114 
       
   115 /* vi: set ts=4 sw=4 expandtab: */