1fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 2fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* 3fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Copyright (C) Texas Instruments - http://www.ti.com/ 4fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 5fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * This library is free software; you can redistribute it and/or 6fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * modify it under the terms of the GNU Lesser General Public 7fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * License as published by the Free Software Foundation; either 8fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * version 2.1 of the License, or (at your option) any later version. 9fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 10fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 11fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * This library is distributed in the hope that it will be useful, 12fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * but WITHOUT ANY WARRANTY; without even the implied warranty of 13fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Lesser General Public License for more details. 15fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 16fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 17fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * You should have received a copy of the GNU Lesser General Public 18fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * License along with this library; if not, write to the Free Software 19fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin */ 21fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "perf_config.h" 22fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "perf_common.h" 23fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <ctype.h> 24fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 25fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#ifdef ANDROID 26fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* Log for Android system*/ 27fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <utils/Log.h> 28fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#endif 29fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 30fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* pre-declare helper functions */ 31fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic int assign_string(char **psMember, char const *sValue); 32fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic int assign_string_if_matches(char const *line, char const *argument, 33fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin char **psMember); 34fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic int assign_long(unsigned long *piMember, char const *sValue); 35fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic int assign_long_if_matches(char const *line, char const *argument, 36fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin unsigned long *piMember); 37fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void read_line(PERF_Config *sConfig, char const *line, char const *tag); 38fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic char const *get_value_if_matches(char const *line, char const *argument); 39fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 40fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*----------------------------------------------------------------------------- 41fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin CONFIGURATION METHODS FUNCTIONS 42fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin-----------------------------------------------------------------------------*/ 43fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* default configuration */ 44fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid PERF_Config_Init(PERF_Config *sConfig) 45fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 46fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* initialize default configuration */ 47fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 48fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->mask = 0; 49fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 50fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* logging interface */ 51fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->trace_file = NULL; 52fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->delayed_open = 0; 53fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->buffer_size = 65536; 54fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 55fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* debug interface */ 56fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->debug = FALSE; 57fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->detailed_debug = FALSE; 58fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->csv = 1; 59fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->log_file = NULL; 60fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 61fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* replay interface */ 62fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->replay_file = strdup("STDOUT"); 63fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 64fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* real-time interface */ 65fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->realtime = 0; 66fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->rt_granularity = 1; 67fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->rt_summary = 1; 68fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->rt_debug = 0; 69fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->rt_detailed = 0; 70fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->rt_file = strdup("STDERR"); 71fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 72fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 73fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* release configuration memory */ 74fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid PERF_Config_Release(PERF_Config *sConfig) 75fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 76fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* release all allocated members */ 77fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (sConfig->trace_file) 78fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 79fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin free(sConfig->trace_file); 80fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->trace_file = NULL; 81fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 82fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (sConfig->log_file) 83fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 84fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin free(sConfig->log_file); 85fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->log_file = NULL; 86fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 87fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (sConfig->replay_file) 88fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 89fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin free(sConfig->replay_file); 90fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->replay_file = NULL; 91fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 92fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (sConfig->rt_file) 93fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 94fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin free(sConfig->rt_file); 95fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sConfig->rt_file = NULL; 96fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 97fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 98fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 99fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Method read_line 100fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 101fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg1 pointer to configuration 102fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 103fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg2 configuration line (trimmed of trailing white 104fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * spaces) 105fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 106fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg3 tag - restrict matches to this tag or no-tag 107fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 108fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Effects compares configuration lines to assignments to each 109fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * configuration variable. If tags are specified before the 110fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * configuration variable, they are ignored unless they match 111fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * the supplied tag. If it matches, the assignment is performed 112fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * to the variable. Otherwise, an error message is printed. 113fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * */ 114fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 115fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic 116fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid read_line(PERF_Config *cfg, char const *line, char const *tag) 117fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 118fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin char const *ptr; 119fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 120fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* skip leading spaces */ 121fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin while (*line && isspace(*line)) line++; 122fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 123fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* ignore comment lines and empty lines */ 124fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (!*line || *line == '#') return; 125fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 126fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* check to see if there is a tag prefix */ 127fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 128fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* find first white-space or . in the line */ 129fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin for (ptr = line; *ptr && !isspace(*ptr) && *ptr != '.' && *ptr != '='; ptr++); 130fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 131fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (*ptr == '.') 132fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 133fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* ignore lines where the tag does not match */ 134fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (!tag || strncmp(line, tag, ptr - line)) return; 135fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 136fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* otherwise, skip the tag for the match */ 137fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin line = ptr + 1; 138fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 139fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 140fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* check for known member names */ 141fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 142fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (!(assign_long_if_matches(line, "mask", &cfg->mask) || 143fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* logging configuration */ 144fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_string_if_matches(line, "trace_file", &cfg->trace_file) || 145fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_long_if_matches(line, "delayed_open", &cfg->delayed_open) || 146fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_long_if_matches(line, "buffer_size", &cfg->buffer_size) || 147fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* debug configuration */ 148fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_string_if_matches(line, "log_file", &cfg->log_file) || 149fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_long_if_matches(line, "debug", &cfg->debug) || 150fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_long_if_matches(line, "detailed_debug",&cfg->detailed_debug) || 151fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_long_if_matches(line, "csv", &cfg->csv) || 152fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* replay configuration */ 153fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_string_if_matches(line, "replay_file", &cfg->replay_file) || 154fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* real-time configuration */ 155fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_long_if_matches(line, "realtime", &cfg->realtime) || 156fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_long_if_matches(line, "rt_granularity", &cfg->rt_granularity) || 157fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_long_if_matches(line, "rt_debug", &cfg->rt_debug) || 158fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_long_if_matches(line, "rt_detailed", &cfg->rt_detailed) || 159fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_long_if_matches(line, "rt_summary", &cfg->rt_summary) || 160fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assign_string_if_matches(line, "rt_file", &cfg->rt_file) 161fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin )) 162fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 163fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 164fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin fprintf(stderr, 165fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin "warning: incorrect line in configuration file:\n%s\n", line); 166fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 167fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 168fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 169fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* 170fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin Effects: reads each line of the perf.ini file and processes configuration 171fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin assignments in linear order. Maximum line length is enforced, and all 172fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin lines longer than this are ignored. Also, all lines must end in new-line 173fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin If ulID is specified, lines starting with the fourCC ULID. will also be 174fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin read. Lines starting with # will be ignored. 175fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*/ 176fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid PERF_Config_Read(PERF_Config *sConfig, char const *tag) 177fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 178fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin FILE *config_file = NULL; 179fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin char line[PERF_CONFIG_LINELENGTH]; 180fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin int ignore = FALSE; 181fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 182fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (sConfig) 183fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 184fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* open config file */ 185fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin config_file = fopen(PERF_CONFIG_FILE, "rt"); 186fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (config_file) 187fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 188fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* read each line */ 189fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin while (fgets(line, PERF_CONFIG_LINELENGTH, config_file)) 190fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 191fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (/* strlen(line) == PERF_CONFIG_LINELENGTH && */ 192fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *line && line[strlen(line)-1] != '\n') 193fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 194fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* ignore lines that reach the max length */ 195fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ignore = TRUE; 196fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 197fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else if (!ignore) 198fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 199fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* remove new-line and trailing spaces from end of line */ 200fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin while (*line && isspace(line [strlen(line)-1])) 201fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 202fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin line[strlen(line)-1] = 0; 203fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 204fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 205fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* process un-ignored lines */ 206fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin read_line(sConfig, line, tag); 207fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 208fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else 209fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 210fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* no longer ignore lines after they are completely read */ 211fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin ignore = FALSE; 212fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 213fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 214fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 215fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* done */ 216fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin fclose(config_file); 217fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 218fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 219fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 220fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 221fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*----------------------------------------------------------------------------- 222fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin HELPER FUNCTIONS 223fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin-----------------------------------------------------------------------------*/ 224fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 225fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Method get_value_if_matches 226fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 227fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg1 configuration line 228fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 229fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg2 configuration variable name 230fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 231fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Effects if the configuration line is <variable name> = 232fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * <value>, it returns the <value>. Otherwise, it returns NULL 233fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 234fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * */ 235fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic 236fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinchar const *get_value_if_matches(char const *line, 237fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin char const *argument) 238fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 239fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* skip leading spaces */ 240fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin while (*line && isspace(*line)) line++; 241fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 242fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* return NULL if argument name does not match */ 243fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (strncasecmp(line, argument, strlen(argument))) return (NULL); 244fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin line += strlen(argument); 245fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 246fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* there must be an = after argument name */ 247fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 248fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* skip trailing spaces before = */ 249fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin while (*line && isspace(*line)) line++; 250fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 251fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* return NULL if = not found */ 252fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (*line != '=') return (NULL); 253fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin line++; 254fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 255fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* skip leading spaces before value */ 256fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin while (*line && isspace(*line)) line++; 257fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 258fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* if reached the end of line, return NULL; otherwise, return value */ 259fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return(*line ? line : NULL); 260fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 261fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 262fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Method assign_string 263fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 264fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg1 pointer to string configuration member 265fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 266fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg2 configuration value 267fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 268fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Effects Assigns the value to the configuration member. 269fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * */ 270fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 271fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic 272fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinint assign_string(char **psMember, char const *sValue) 273fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 274fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* delete any prior value */ 275fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (*psMember) 276fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 277fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin free(*psMember); 278fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *psMember = NULL; 279fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 280fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 281fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* set new value unless it is NULL */ 282fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (strcasecmp(sValue, "NULL")) 283fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 284fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *psMember = strdup(sValue); 285fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 286fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 287fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return (1); 288fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 289fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 290fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Method assign_long 291fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 292fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg1 pointer to configuration member 293fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 294fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg2 configuration value (string) 295fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 296fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Effects Assigns the integer value of the string to the 297fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * configuration member. If value starts with '$' or '0x', it 298fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * interprets the remaining digits as a hexadecimal number. If 299fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * value starts with -, or with a digit, it is interpreted as a 300fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * decimal (can be signed or unsigned). Otherwise, if it 301fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * matches 'enabled', 'on' or 'true', the member is assigned 1. 302fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * In all other cases, it is assigned 0. 303fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * */ 304fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 305fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic 306fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinint assign_long(unsigned long *piMember, char const *sValue) 307fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 308fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* set new value */ 309fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 310fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* hexadecimal value */ 311fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (!strncasecmp(sValue, "0x", 2)) sscanf(sValue + 2, "%lx", piMember); 312fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else if (*sValue == '$') sscanf(sValue + 1, "%lx", piMember); 313fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 314fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* decimal value */ 315fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else if (*sValue == '-') sscanf(sValue, "%ld", piMember); 316fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else if (isdigit(*sValue)) sscanf(sValue, "%lu", piMember); 317fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 318fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* boolean value */ 319fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else *piMember = (!strcasecmp(sValue, "enabled") || 320fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin !strcasecmp(sValue, "on") || 321fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin !strcasecmp(sValue, "true")); 322fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 323fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return (1); 324fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 325fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 326fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Method assign_string_if_matches 327fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 328fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg1 configuration line 329fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 330fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg2 configuration variable name 331fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 332fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg3 pointer to string configuration member 333fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 334fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Effects if the configuration line is <variable name> = 335fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * <value>, it assigns the value to the configuration 336fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * member. 337fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 338fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Returns 1, if assignment occured. 0 otherwise. 339fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * */ 340fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 341fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic 342fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinint assign_string_if_matches(char const *line, char const *argument, 343fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin char **target) 344fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 345fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin char const *value = get_value_if_matches(line, argument); 346fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return (value ? (assign_string(target, value), 1) : 0); 347fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 348fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 349fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Method assign_long_if_matches 350fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 351fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg1 configuration line 352fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 353fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg2 configuration variable name 354fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 355fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Arg3 pointer to string configuration member 356fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 357fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Effects if the configuration line is <variable name> = 358fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * <value>, it assigns the integer value of the string to the 359fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * configuration member in the following manner: If value 360fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * starts with '$' or '0x', it interprets the remaining digits 361fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * as a hexadecimal number. If value starts with -, or with a 362fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * digit, it is interpreted as a decimal (can be signed or 363fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * unsigned). Otherwise, if it matches 'enabled', 'on' or 364fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 'true', the member is assigned 1. In all other cases, it is 365fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * assigned 0. 366fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * 367fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Returns 1, if assignment occured. 0 otherwise (if config 368fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * line was not an assignment to variable name). 369fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * */ 370fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 371fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic 372fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinint assign_long_if_matches(char const *line, char const *argument, 373fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin unsigned long *target) 374fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 375fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin char const *value = get_value_if_matches(line, argument); 376fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return (value ? (assign_long(target, value), 1) : 0); 377fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 378fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 379fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 380