#!/bin/sh
# Build files $parser.h and $parserc.h for inclusion in 
# command line parsers.
# $Id: makekw,v 1.2 2004/06/13 23:57:19 grog Exp $

if [ $# -gt 0 ]; then
  parser=$1
else
  parser=myparser
fi

# The name of the file containing our keywords
if [ $# -gt 1 ]; then
  keywords=$1
else
  keywords=keywords
fi

# Part 1: header
cat > $parser.h <<EOF
/*
 * This file was generated automatically by $0 on `date`.
 * Any modifications made to it will be lost.
 */

/* parser stuff */
enum keyword 
{
EOF

# part 2: kw_ enums

for i in `grep -v '^#' $keywords`; do \
  echo " " kw_$i, >> $parser.h; \
done

# Part 3: more body
cat >> $parser.h <<EOF
  kw_invalid_keyword = -1
  };

struct _keywords
  {
  char *name;
  enum keyword keyword;
  };

struct keywordset 
{
  int size;
  struct _keywords *k;
  };

#define FUNKEY(x) { kw_##x, &x##_command }		    /* create pair "kw_foo", foo_command */
#define keypair(x) { #x, kw_##x }			    /* create pair "foo", kw_foo */
#define flagkeypair(x) { "-"#x, x##_command }		    /* create pair "-foo", kw_foo */

#define KEYWORDSET(x) {sizeof (x) / sizeof (struct _keywords), x}

extern struct _keywords keywords [];
extern struct _keywords flag_keywords [];

extern struct keywordset keyword_set;
extern struct keywordset flag_set;

void parseline(int c, char *args[]);			    /* parse a line with c parameters at args */
int tokenize (char *, char * [], int);
enum keyword get_keyword (char *name, struct keywordset *keywordset);

EOF

# part 4: declarations

for i in `grep -v '^#' $keywords`; do \
  echo void ${i}_command '(int argc, char *argv [], char *arg0 []);' >> $parser.h; \
done

# second file: $parserc.h

set `grep -v '^#' $keywords`
cat > ${parser}c.h <<EOF
/*
 * This file was generated automatically by $0 on `date`.
 * Any modifications made to it will be lost.
 */

struct _keywords keywords [] = { keypair ($1),
EOF

shift
while [ $# -gt 0 ]; do
  if [ $# -gt 1 ]; then
    echo "				" keypair \($1\), >> ${parser}c.h
  else
    echo "				" keypair \($1\) >> ${parser}c.h
  fi
shift
done
echo "				 };" >> ${parser}c.h

# third file: ${parser}keys.h
set `grep -v '^#' $keywords`
cat > ${parser}keys.h <<EOF
/*
 * This file was generated automatically by $0 on `date`.
 * Any modifications made to it will be lost.
 */

struct funkey
{
  enum keyword kw;
  void (*fun) (int argc, char *argv [], char *arg0 []);
  }
funkeys [] = { FUNKEY ($1),
EOF
shift

while [ $# -gt 0 ]; do
  if [ $# -gt 1 ]; then
    echo "	      " FUNKEY \($1\), >> ${parser}keys.h
  else
    echo "	      " FUNKEY \($1\) }\; >> ${parser}keys.h
  fi
shift
done

# fourth file: ${parser}commands.c.sample
cat > ${parser}commands.c.sample <<EOF
/*
 * This file was generated automatically by $0 on `date`.
 * Any modifications made to it will be lost.
 * This file contains dummy declarations for all keyword functions
 * for the parser.
 */
EOF

set `grep -v '^#' $keywords`
while [ $# -gt 0 ]; do
cat >> ${parser}commands.c.sample <<EOF

/* Dummy function for $1 keyword */
void $1_command (int argc, char *argv [], char *arg0 [])
{
  }
EOF
shift
done

