1#!/bin/sh -u
2
3# Register protocol definitions for GDB, the GNU debugger.
4# Copyright 2001, 2002 Free Software Foundation, Inc.
5#
6# This file is part of GDB.
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
20# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
22move_if_change ()
23{
24    file=$1
25    if test -r ${file} && cmp -s "${file}" new-"${file}"
26    then
27	echo "${file} unchanged." 1>&2
28    else
29	mv new-"${file}" "${file}"
30	echo "${file} updated." 1>&2
31    fi
32}
33
34# Format of the input files
35read="type entry"
36
37do_read ()
38{
39    type=""
40    entry=""
41    while read line
42    do
43	if test "${line}" = ""
44	then
45	    continue
46	elif test "${line}" = "#" -a "${comment}" = ""
47	then
48	    continue
49	elif expr "${line}" : "#" > /dev/null
50	then
51	    comment="${comment}
52${line}"
53	else
54
55	    # The semantics of IFS varies between different SH's.  Some
56	    # treat ``::' as three fields while some treat it as just too.
57	    # Work around this by eliminating ``::'' ....
58	    line="`echo "${line}" | sed -e 's/::/: :/g' -e 's/::/: :/g'`"
59
60	    OFS="${IFS}" ; IFS="[:]"
61	    eval read ${read} <<EOF
62${line}
63EOF
64	    IFS="${OFS}"
65
66	    # .... and then going back through each field and strip out those
67	    # that ended up with just that space character.
68	    for r in ${read}
69	    do
70		if eval test \"\${${r}}\" = \"\ \"
71		then
72		    eval ${r}=""
73		fi
74	    done
75
76	    break
77	fi
78    done
79    if [ -n "${type}" ]
80    then
81	true
82    else
83	false
84    fi
85}
86
87if test ! -r $1; then
88  echo "$0: Could not open $1." 1>&2
89  exit 1
90fi
91
92copyright ()
93{
94cat <<EOF
95/* *INDENT-OFF* */ /* THIS FILE IS GENERATED */
96
97/* A register protocol for GDB, the GNU debugger.
98   Copyright 2001, 2002 Free Software Foundation, Inc.
99
100   This file is part of GDB.
101
102   This program is free software; you can redistribute it and/or modify
103   it under the terms of the GNU General Public License as published by
104   the Free Software Foundation; either version 2 of the License, or
105   (at your option) any later version.
106
107   This program is distributed in the hope that it will be useful,
108   but WITHOUT ANY WARRANTY; without even the implied warranty of
109   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
110   GNU General Public License for more details.
111
112   You should have received a copy of the GNU General Public License
113   along with this program; if not, write to the Free Software
114   Foundation, Inc., 59 Temple Place - Suite 330,
115   Boston, MA 02111-1307, USA.  */
116
117/* This file was created with the aid of \`\`regdat.sh'' and \`\`$1''.  */
118
119EOF
120}
121
122
123exec > new-$2
124copyright $1
125echo '#include "regdef.h"'
126echo '#include "regcache.h"'
127echo
128offset=0
129i=0
130name=x
131expedite=x
132exec < $1
133while do_read
134do
135  if test "${type}" = "name"; then
136    name="${entry}"
137    echo "struct reg regs_${name}[] = {"
138    continue
139  elif test "${type}" = "expedite"; then
140    expedite="${entry}"
141    continue
142  elif test "${name}" = x; then
143    echo "$0: $1 does not specify \`\`name''." 1>&2
144    exit 1
145  else
146    echo "  { \"${entry}\", ${offset}, ${type} },"
147    offset=`expr ${offset} + ${type}`
148    i=`expr $i + 1`
149  fi
150done
151
152echo "};"
153echo
154echo "const char *expedite_regs_${name}[] = { \"`echo ${expedite} | sed 's/,/", "/g'`\", 0 };"
155echo
156
157cat <<EOF
158void
159init_registers ()
160{
161    set_register_cache (regs_${name},
162			sizeof (regs_${name}) / sizeof (regs_${name}[0]));
163    gdbserver_expedite_regs = expedite_regs_${name};
164}
165EOF
166
167# close things off
168exec 1>&2
169move_if_change $2
170