18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/cmdline-option.h"
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/debug.h"
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/misc.h"
4318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner#include "android/utils/system.h"
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdlib.h>
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stddef.h>
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h>
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  _VERBOSE_TAG(x,y)   { #x, VERBOSE_##x, y },
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { const char*  name; int  flag; const char*  text; }
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectdebug_tags[] = {
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    VERBOSE_TAG_LIST
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0, 0, 0 }
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void  parse_debug_tags( const char*  tags );
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid  parse_env_debug_tags( void );
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
19318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turnerenum {
20318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner    OPTION_IS_FLAG = 0,
21318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner    OPTION_IS_PARAM,
22318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner    OPTION_IS_LIST,
23318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner};
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct {
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char*  name;
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int          var_offset;
28318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner    int          var_type;
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int          var_is_config;
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} OptionInfo;
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  OPTION(_name,_type,_config)  \
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { #_name, offsetof(AndroidOptions,_name), _type, _config },
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const OptionInfo  option_keys[] = {
37318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner#define  OPT_FLAG(_name,_descr)             OPTION(_name,OPTION_IS_FLAG,0)
38318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner#define  OPT_PARAM(_name,_template,_descr)  OPTION(_name,OPTION_IS_PARAM,0)
39318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner#define  OPT_LIST(_name,_template,_descr)   OPTION(_name,OPTION_IS_LIST,0)
40318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner#define  CFG_FLAG(_name,_descr)             OPTION(_name,OPTION_IS_FLAG,1)
41318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner#define  CFG_PARAM(_name,_template,_descr)  OPTION(_name,OPTION_IS_PARAM,1)
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/cmdline-options.h"
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { NULL, 0, 0, 0 }
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectandroid_parse_options( int  *pargc, char**  *pargv, AndroidOptions*  opt )
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int     nargs = *pargc-1;
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char**  aread = *pargv+1;
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char**  awrite = aread;
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    memset( opt, 0, sizeof *opt );
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    while (nargs > 0) {
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        char*  arg;
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        char   arg2_tab[64], *arg2 = arg2_tab;
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int    nn;
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* process @<name> as a special exception meaning
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         * '-avd <name>'
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         */
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (aread[0][0] == '@') {
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            opt->avd = aread[0]+1;
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            nargs--;
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            aread++;
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            continue;
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* anything that isn't an option past this points
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         * exits the loop
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         */
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (aread[0][0] != '-') {
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        arg = aread[0]+1;
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* an option cannot contain an underscore */
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (strchr(arg, '_') != NULL) {
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        nargs--;
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        aread++;
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* for backwards compatibility with previous versions */
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!strcmp(arg, "verbose")) {
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            arg = "debug-init";
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* special handing for -debug <tags> */
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!strcmp(arg, "debug")) {
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (nargs == 0) {
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                derror( "-debug must be followed by tags (see -help-verbose)\n");
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                exit(1);
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            nargs--;
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            parse_debug_tags(*aread++);
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            continue;
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* NOTE: variable tables map option names to values
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         * (e.g. field offsets into the AndroidOptions structure).
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         *
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         * however, the names stored in the table used underscores
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         * instead of dashes. this means that the command-line option
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         * '-foo-bar' will be associated to the name 'foo_bar' in
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         * this table, and will point to the field 'foo_bar' or
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         * AndroidOptions.
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         *
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         * as such, before comparing the current option to the
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         * content of the table, we're going to translate dashes
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         * into underscores.
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         */
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        arg2 = arg2_tab;
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        buffer_translate_char( arg2_tab, sizeof(arg2_tab),
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                               arg, '-', '_');
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* special handling for -debug-<tag> and -debug-no-<tag> */
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!memcmp(arg2, "debug_", 6)) {
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int            remove = 0;
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            unsigned long  mask   = 0;
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            arg2 += 6;
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (!memcmp(arg2, "no_", 3)) {
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                arg2  += 3;
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                remove = 1;
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (!strcmp(arg2, "all")) {
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                mask = ~0;
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (nn = 0; debug_tags[nn].name; nn++) {
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (!strcmp(arg2, debug_tags[nn].name)) {
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    mask = (1UL << debug_tags[nn].flag);
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    break;
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (remove)
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                android_verbose &= ~mask;
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                android_verbose |= mask;
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            continue;
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* look into our table of options
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         *
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         */
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            const OptionInfo*  oo = option_keys;
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for ( ; oo->name; oo++ ) {
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if ( !strcmp( oo->name, arg2 ) ) {
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    void*  field = (char*)opt + oo->var_offset;
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
155318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                    if (oo->var_type != OPTION_IS_FLAG) {
156318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                        /* parameter/list option */
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        if (nargs == 0) {
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            derror( "-%s must be followed by parameter (see -help-%s)",
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                    arg, arg );
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            exit(1);
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        }
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        nargs--;
163318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner
164318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                        if (oo->var_type == OPTION_IS_PARAM)
165318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                        {
166318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                            ((char**)field)[0] = *aread++;
167318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                        }
168c005246ed03de874fdc432073ba8e5e8ebfed922David 'Digit' Turner                        else if (oo->var_type == OPTION_IS_LIST)
169318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                        {
170318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                            ParamList**  head = (ParamList**)field;
171318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                            ParamList*   pl;
172318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                            ANEW0(pl);
173318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                            /* note: store list items in reverse order here
174318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                             *       the list is reversed later in this function.
175318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                             */
176318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                            pl->param = *aread++;
177318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                            pl->next  = *head;
178318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                            *head     = pl;
179318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                        }
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    } else {
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        /* flag option */
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        ((int*)field)[0] = 1;
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    break;
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (oo->name == NULL) {  /* unknown option ? */
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                nargs++;
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                aread--;
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* copy remaining parameters, if any, to command line */
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    *pargc = nargs + 1;
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    while (nargs > 0) {
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        awrite[0] = aread[0];
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        awrite ++;
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        aread  ++;
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        nargs  --;
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    awrite[0] = NULL;
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
208318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner    /* reverse any parameter list before exit.
209318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner     */
210318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner    {
211318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner        const OptionInfo*  oo = option_keys;
212318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner
213318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner        for ( ; oo->name; oo++ ) {
214318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner            if ( oo->var_type == OPTION_IS_LIST ) {
215318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                ParamList**  head = (ParamList**)((char*)opt + oo->var_offset);
216318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                ParamList*   prev = NULL;
217318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                ParamList*   cur  = *head;
218318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner
219318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                while (cur != NULL) {
220318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                    ParamList*  next = cur->next;
221318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                    cur->next = prev;
222318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                    prev      = cur;
223318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                    cur       = next;
224318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                }
225318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner                *head = prev;
226318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner            }
227318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner        }
228318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner    }
229318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* special handling of -debug option and tags */
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  ENV_DEBUG   "ANDROID_DEBUG"
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectparse_debug_tags( const char*  tags )
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char*        x;
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char*        y;
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char*        x0;
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (tags == NULL)
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    x = x0 = strdup(tags);
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    while (*x) {
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        y = strchr(x, ',');
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (y == NULL)
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            y = x + strlen(x);
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        else
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            *y++ = 0;
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (y > x+1) {
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int  nn, remove = 0;
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            unsigned mask = 0;
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (x[0] == '-') {
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                remove = 1;
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                x += 1;
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (!strcmp( "all", x ))
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                mask = ~0;
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else {
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                char  temp[32];
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                buffer_translate_char(temp, sizeof temp, x, '-', '_');
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                for (nn = 0; debug_tags[nn].name != NULL; nn++) {
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if ( !strcmp( debug_tags[nn].name, temp ) ) {
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        mask |= (1 << debug_tags[nn].flag);
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        break;
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (mask == 0)
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                dprint( "ignoring unknown " ENV_DEBUG " item '%s'", x );
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else {
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (remove)
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    android_verbose &= ~mask;
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                else
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    android_verbose |= mask;
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        x = y;
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    free(x0);
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectparse_env_debug_tags( void )
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char*  env = getenv( ENV_DEBUG );
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    parse_debug_tags( env );
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
301