/* Copyright (c) 2015 Google Inc
 * Davide Libenzi <dlibenzi@google.com>
 * See LICENSE for details.
 */

#pragma once

/**
 * @brief Fetches a given boot commond line parameter.
 *
 * @param base The base pointer from which to start the search. Should be set
 *             to NULL the first time is being called, and, for command line
 *             parameters with multiple instances, should be set to the value
 *             returned by the previous successful call to this API.
 * @param option The name of the option to retrieve. By convention, options
 *               should start with the '-' character.
 * @param param The pointer to the buffer where to store the eventual value of
 *              the parameter (in a "-option=value" format). Can be NULL if the
 *              caller is not interested in the parameter value (because of a
 *              value-less parameter (example "-enable-acpi").
 * @param max_param Maximum length of the @a param buffer, or 0 if @a param is
 *              NULL.
 *
 * @return Returns a pointer different from NULL if the given @a option has been
 *         successfully parsed, or NULL otherwise. The returned pointer should
 *         be treated as opaque value by the caller, and used only for the
 *         following calls to this API, in case of multiple instance parameters
 *         (example "-map=0x12345678,0x1000 -map=0x987654321,0x2000").
 */
const char *get_boot_option(const char *base, const char *option, char *param,
							size_t max_param);

void _panic(const char *file, int line, const char *fmt, ...);
void _warn(const char *file, int line, const char *fmt, ...);
