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