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