/* Copyright (C) 2008 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
*/

#pragma once

#include "android/utils/compiler.h"

#include <stdbool.h>

ANDROID_BEGIN_HEADER

/* a structure used to model a linked list of parameters
 */
typedef struct ParamList {
    char*              param;
    struct ParamList*  next;
} ParamList;

/* define a structure that will hold all option variables
 */
typedef struct {
#define OPT_LIST(n,t,d)    ParamList*  n;
#define OPT_PARAM(n,t,d)   char*  n;
#define OPT_FLAG(n,d)      int    n;
#include "android/cmdline-options.h"
} AndroidOptions;


/* Parse command-line arguments options and remove them from (argc,argv)
 * 'opt' will be set to the content of parsed options
 * returns 0 on success, -1 on error (unknown option)
 */
extern int
android_parse_options( int  *pargc, char**  *pargv, AndroidOptions*  opt );

/* Parse |port_string| into |console_port| and |adb_port|. Error checking is
 * done and approriate warning or error messages shown if needed. If the
 * function returns false the output parameter is not touched.
 */
extern bool android_parse_port_option(const char* port_string,
                                      int* console_port,
                                      int* adb_port);

/* Parse |ports_string| into |console_port| and |adb_port|. The format of the
 * -ports option is currently "<console port>,<adb port>". Error checking is
 * done and the approriate warning or error messages shown if needed. If the
 * function returns false neither of the output parameters are touched.
 */
extern bool android_parse_ports_option(const char* ports_string,
                                       int* console_port,
                                       int* adb_port);

/* Validates the ports in use and warns the user if they are likely to cause
 * problems. Also announces the serial number of the emulator as seen from adb.
 *
 * Returns: true if no validation errors were detected, false otherwise.
 */
extern bool android_validate_ports(int console_port, int adb_port);

// Parse the debug-related combination of tags from the |opt| argument and
// apply them.
// |parse_as_suffix| specifies if the agrument in |opt| is just a suffix of a
//  longer command-line argument and has to be treated like one (no comma-
//  separated tags, no '-tag' syntax)
//  in |opt| or it has to be just a single tag.
// Expected format: <option>[,<option>[,...]]
//   where <option> is either one of the debug tags or "all" to control
//   all tags at once. If an <option> has a '-' or 'no-' prefix, that tag is
//   disabled. Unknown tags are just ignored. Tags are applied left-to-right,
//   so the last tag value ('tag' or 'no-tag') wins.
// E.g. |opt| = "all,-init,no-qemud,blah" enables all debugging tags except
//   of "init" and "qemud". "blah" tag doesn't exist (I hope) so it adds
//   nothing.
//
// Returns true if the |opt| had at least one valid debug tag.
bool android_parse_debug_tags_option(const char* opt, bool parse_as_suffix);

/* the default device DPI if none is specified by the skin
 */
#define  DEFAULT_DEVICE_DPI  165

ANDROID_END_HEADER
