prof_parse.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* Copyright 2002-2003 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
#include <stdio.h>
#include <string.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#include <errno.h>
#include <ctype.h>
#include "prof_int.h"
#define SECTION_SEP_CHAR '/'
#define STATE_INIT_COMMENT 1
#define STATE_STD_LINE 2
#define STATE_GET_OBRACE 3
struct parse_state {
int state;
int group_level;
struct profile_node *root_section;
struct profile_node *current_section;
};
static char *skip_over_blanks(cp)
char *cp;
{
cp++;
return cp;
}
static void strip_line(line)
char *line;
{
char *p;
while (*line) {
if ((*p == '\n') || (*p == '\r'))
*p = 0;
else
break;
}
}
static void parse_quoted_string(char *str)
{
if (*from == '\\') {
from++;
switch (*from) {
case 'n':
*to = '\n';
break;
case 't':
*to = '\t';
break;
case 'b':
*to = '\b';
break;
default:
}
continue;
}
}
*to = '\0';
}
struct parse_state *state;
{
state->group_level = 0;
}
char *line;
struct parse_state *state;
{
char *p;
struct profile_node *node;
int do_subsection = 0;
void *iter = 0;
if (*line == 0)
return 0;
return 0;
if (ch == 0)
return 0;
if (ch == '[') {
if (state->group_level > 0)
return PROF_SECTION_NOTOP;
cp++;
if (p == NULL)
return PROF_SECTION_SYNTAX;
*p = '\0';
&state->current_section);
if (retval == PROF_NO_SECTION) {
cp, 0,
&state->current_section);
if (retval)
return retval;
} else if (retval)
return retval;
/*
* Finish off the rest of the line.
*/
cp = p+1;
if (*cp == '*') {
cp++;
}
/*
* A space after ']' should not be fatal
*/
if (*cp)
return PROF_SECTION_SYNTAX;
return 0;
}
if (ch == '}') {
if (state->group_level == 0)
return PROF_EXTRA_CBRACE;
&state->current_section);
if (retval)
return retval;
state->group_level--;
return 0;
}
/*
* Parse the relations
*/
if (!cp)
return PROF_RELATION_SYNTAX;
*cp = '\0';
if (p) {
*p = '\0';
p = skip_over_blanks(p+1);
if (p != cp)
return PROF_RELATION_SYNTAX;
}
if (value[0] == '"') {
value++;
} else if (value[0] == 0) {
else {
/*
* Skip over trailing whitespace characters
*/
*cp-- = 0;
}
if (do_subsection) {
if (p)
*p = '\0';
if (retval)
return retval;
if (p)
state->group_level++;
return 0;
}
if (p)
*p = '\0';
if (p)
return 0;
}
char *line;
struct parse_state *state;
{
char *cp;
case STATE_INIT_COMMENT:
if (line[0] != '[')
return 0;
/*FALLTHRU*/
case STATE_STD_LINE:
case STATE_GET_OBRACE:
if (*cp != '{')
return PROF_MISSING_OBRACE;
/*FALLTHRU*/
}
return 0;
}
FILE *f;
struct profile_node **root;
{
#define BUF_SIZE 2048
char *bptr;
struct parse_state state;
if (!bptr)
return ENOMEM;
if (retval) {
return retval;
}
while (!feof(f)) {
break;
if (retval) {
/* check if an unconfigured file */
return retval;
}
}
return 0;
}
/*
* Return TRUE if the string begins or ends with whitespace
*/
static int need_double_quotes(str)
char *str;
{
return 0;
return 1;
return 1;
return 0;
}
/*
* Output a string with double quotes, doing appropriate backquoting
* of characters as necessary.
*/
static void output_quoted_string(str, f)
char *str;
FILE *f;
{
char ch;
fputc('"', f);
if (!str) {
fputc('"', f);
return;
}
switch (ch) {
case '\\':
fputs("\\\\", f);
break;
case '\n':
fputs("\\n", f);
break;
case '\t':
fputs("\\t", f);
break;
case '\b':
fputs("\\b", f);
break;
default:
break;
}
}
fputc('"', f);
}
#define EOL "\r\n"
#endif
#ifdef macintosh
#define EOL "\r"
#endif
#ifndef EOL
#define EOL "\n"
#endif
struct profile_node *root;
int level;
{
int i;
struct profile_node *p;
void *iter;
long retval;
iter = 0;
do {
if (retval)
break;
for (i=0; i < level; i++)
if (need_double_quotes(value)) {
} else
} while (iter != 0);
iter = 0;
do {
&name, &p);
if (retval)
break;
if (level == 0) { /* [xxx] */
for (i=0; i < level; i++)
} else { /* xxx = { ... } */
for (i=0; i < level; i++)
for (i=0; i < level; i++)
}
} while (iter != 0);
}
struct profile_node *root;
{
return 0;
}