1e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn/* 2e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn * Copyright (C) 2017 The Android Open Source Project 3e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn * 4e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 5e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn * you may not use this file except in compliance with the License. 6e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn * You may obtain a copy of the License at 7e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn * 8e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 9e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn * 10e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn * Unless required by applicable law or agreed to in writing, software 11e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 12e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn * See the License for the specific language governing permissions and 14e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn * limitations under the License. 15e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn */ 16e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn 17e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#ifndef _LOG_GETOPT_H_ 18e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#define _LOG_GETOPT_H_ 19e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn 20e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#ifndef __ANDROID_USE_LIBLOG_LOGCAT_INTERFACE 21e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#ifndef __ANDROID_API__ 22e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGCAT_INTERFACE 1 23e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#elif __ANDROID_API__ > 24 /* > Nougat */ 24e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGCAT_INTERFACE 1 25e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#else 26e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGCAT_INTERFACE 0 27e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#endif 28e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#endif 29e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn 30e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#if __ANDROID_USE_LIBLOG_LOGCAT_INTERFACE 31e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn 32e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#include <getopt.h> 33e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#include <sys/cdefs.h> 34e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn 35e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzynstruct getopt_context { 36e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn int opterr; 37e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn int optind; 38e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn int optopt; 39e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn int optreset; 40e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn const char* optarg; 41e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn FILE* optstderr; /* NULL defaults to stderr */ 42e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn /* private */ 43e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn const char* place; 44e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn int nonopt_start; 45e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn int nonopt_end; 46e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn int dash_prefix; 47e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn /* expansion space */ 48e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn int __extra__; 49e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn void* __stuff__; 50e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn}; 51e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn 52e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#define EMSG "" 53e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#define NO_PREFIX (-1) 54e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn 55e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#define INIT_GETOPT_CONTEXT(context) \ 56e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn context = { 1, 1, '?', 0, NULL, NULL, EMSG, -1, -1, NO_PREFIX, 0, NULL } 57e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn 58e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn__BEGIN_DECLS 59e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzynint getopt_long_r(int nargc, char* const* nargv, const char* options, 60e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn const struct option* long_options, int* idx, 61e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn struct getopt_context* context); 62e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn 63e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn__END_DECLS 64e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn 65e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#endif /* __ANDROID_USE_LIBLOG_LOGCAT_INTERFACE */ 66e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn 67e9ade17418c2e8390d72ee694ab5c097ec765266Mark Salyzyn#endif /* !_LOG_GETOPT_H_ */ 68