OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [gdb/] [cli/] [cli-setshow.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* Handle set and show GDB commands.
2
 
3
   Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
4
 
5
   This program is free software; you can redistribute it and/or modify
6
   it under the terms of the GNU General Public License as published by
7
   the Free Software Foundation; either version 2 of the License, or
8
   (at your option) any later version.
9
 
10
   This program is distributed in the hope that it will be useful,
11
   but WITHOUT ANY WARRANTY; without even the implied warranty of
12
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
   GNU General Public License for more details.
14
 
15
   You should have received a copy of the GNU General Public License
16
   along with this program; if not, write to the Free Software
17
   Foundation, Inc., 59 Temple Place - Suite 330,
18
   Boston, MA 02111-1307, USA.  */
19
 
20
#include "defs.h"
21
#include "value.h"
22
#include <ctype.h>
23
#include "gdb_string.h"
24
 
25
#include "ui-out.h"
26
 
27
#include "cli/cli-decode.h"
28
#include "cli/cli-cmds.h"
29
#include "cli/cli-setshow.h"
30
 
31
/* Prototypes for local functions */
32
 
33
static int parse_binary_operation (char *);
34
 
35
 
36
static enum auto_boolean
37
parse_auto_binary_operation (const char *arg)
38
{
39
  if (arg != NULL && *arg != '\0')
40
    {
41
      int length = strlen (arg);
42
      while (isspace (arg[length - 1]) && length > 0)
43
        length--;
44
      if (strncmp (arg, "on", length) == 0
45
          || strncmp (arg, "1", length) == 0
46
          || strncmp (arg, "yes", length) == 0
47
          || strncmp (arg, "enable", length) == 0)
48
        return AUTO_BOOLEAN_TRUE;
49
      else if (strncmp (arg, "off", length) == 0
50
               || strncmp (arg, "0", length) == 0
51
               || strncmp (arg, "no", length) == 0
52
               || strncmp (arg, "disable", length) == 0)
53
        return AUTO_BOOLEAN_FALSE;
54
      else if (strncmp (arg, "auto", length) == 0
55
               || (strncmp (arg, "-1", length) == 0 && length > 1))
56
        return AUTO_BOOLEAN_AUTO;
57
    }
58
  error ("\"on\", \"off\" or \"auto\" expected.");
59
  return AUTO_BOOLEAN_AUTO; /* pacify GCC */
60
}
61
 
62
static int
63
parse_binary_operation (char *arg)
64
{
65
  int length;
66
 
67
  if (!arg || !*arg)
68
    return 1;
69
 
70
  length = strlen (arg);
71
 
72
  while (arg[length - 1] == ' ' || arg[length - 1] == '\t')
73
    length--;
74
 
75
  if (strncmp (arg, "on", length) == 0
76
      || strncmp (arg, "1", length) == 0
77
      || strncmp (arg, "yes", length) == 0
78
      || strncmp (arg, "enable", length) == 0)
79
    return 1;
80
  else if (strncmp (arg, "off", length) == 0
81
           || strncmp (arg, "0", length) == 0
82
           || strncmp (arg, "no", length) == 0
83
           || strncmp (arg, "disable", length) == 0)
84
    return 0;
85
  else
86
    {
87
      error ("\"on\" or \"off\" expected.");
88
      return 0;
89
    }
90
}
91
 
92
/* Do a "set" or "show" command.  ARG is NULL if no argument, or the text
93
   of the argument, and FROM_TTY is nonzero if this command is being entered
94
   directly by the user (i.e. these are just like any other
95
   command).  C is the command list element for the command.  */
96
 
97
void
98
do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
99
{
100
  if (c->type == set_cmd)
101
    {
102
      switch (c->var_type)
103
        {
104
        case var_string:
105
          {
106
            char *new;
107
            char *p;
108
            char *q;
109
            int ch;
110
 
111
            if (arg == NULL)
112
              arg = "";
113
            new = (char *) xmalloc (strlen (arg) + 2);
114
            p = arg;
115
            q = new;
116
            while ((ch = *p++) != '\000')
117
              {
118
                if (ch == '\\')
119
                  {
120
                    /* \ at end of argument is used after spaces
121
                       so they won't be lost.  */
122
                    /* This is obsolete now that we no longer strip
123
                       trailing whitespace and actually, the backslash
124
                       didn't get here in my test, readline or
125
                       something did something funky with a backslash
126
                       right before a newline.  */
127
                    if (*p == 0)
128
                      break;
129
                    ch = parse_escape (&p);
130
                    if (ch == 0)
131
                      break;    /* C loses */
132
                    else if (ch > 0)
133
                      *q++ = ch;
134
                  }
135
                else
136
                  *q++ = ch;
137
              }
138
#if 0
139
            if (*(p - 1) != '\\')
140
              *q++ = ' ';
141
#endif
142
            *q++ = '\0';
143
            new = (char *) xrealloc (new, q - new);
144
            if (*(char **) c->var != NULL)
145
              xfree (*(char **) c->var);
146
            *(char **) c->var = new;
147
          }
148
          break;
149
        case var_string_noescape:
150
          if (arg == NULL)
151
            arg = "";
152
          if (*(char **) c->var != NULL)
153
            xfree (*(char **) c->var);
154
          *(char **) c->var = savestring (arg, strlen (arg));
155
          break;
156
        case var_filename:
157
          if (arg == NULL)
158
            error_no_arg ("filename to set it to.");
159
          if (*(char **) c->var != NULL)
160
            xfree (*(char **) c->var);
161
          *(char **) c->var = tilde_expand (arg);
162
          break;
163
        case var_boolean:
164
          *(int *) c->var = parse_binary_operation (arg);
165
          break;
166
        case var_auto_boolean:
167
          *(enum auto_boolean *) c->var = parse_auto_binary_operation (arg);
168
          break;
169
        case var_uinteger:
170
          if (arg == NULL)
171
            error_no_arg ("integer to set it to.");
172
          *(unsigned int *) c->var = parse_and_eval_long (arg);
173
          if (*(unsigned int *) c->var == 0)
174
            *(unsigned int *) c->var = UINT_MAX;
175
          break;
176
        case var_integer:
177
          {
178
            unsigned int val;
179
            if (arg == NULL)
180
              error_no_arg ("integer to set it to.");
181
            val = parse_and_eval_long (arg);
182
            if (val == 0)
183
              *(int *) c->var = INT_MAX;
184
            else if (val >= INT_MAX)
185
              error ("integer %u out of range", val);
186
            else
187
              *(int *) c->var = val;
188
            break;
189
          }
190
        case var_zinteger:
191
          if (arg == NULL)
192
            error_no_arg ("integer to set it to.");
193
          *(int *) c->var = parse_and_eval_long (arg);
194
          break;
195
        case var_enum:
196
          {
197
            int i;
198
            int len;
199
            int nmatches;
200
            const char *match = NULL;
201
            char *p;
202
 
203
            /* if no argument was supplied, print an informative error message */
204
            if (arg == NULL)
205
              {
206
                char msg[1024];
207
                strcpy (msg, "Requires an argument. Valid arguments are ");
208
                for (i = 0; c->enums[i]; i++)
209
                  {
210
                    if (i != 0)
211
                      strcat (msg, ", ");
212
                    strcat (msg, c->enums[i]);
213
                  }
214
                strcat (msg, ".");
215
                error (msg);
216
              }
217
 
218
            p = strchr (arg, ' ');
219
 
220
            if (p)
221
              len = p - arg;
222
            else
223
              len = strlen (arg);
224
 
225
            nmatches = 0;
226
            for (i = 0; c->enums[i]; i++)
227
              if (strncmp (arg, c->enums[i], len) == 0)
228
                {
229
                  if (c->enums[i][len] == '\0')
230
                    {
231
                      match = c->enums[i];
232
                      nmatches = 1;
233
                      break; /* exact match. */
234
                    }
235
                  else
236
                    {
237
                      match = c->enums[i];
238
                      nmatches++;
239
                    }
240
                }
241
 
242
            if (nmatches <= 0)
243
              error ("Undefined item: \"%s\".", arg);
244
 
245
            if (nmatches > 1)
246
              error ("Ambiguous item \"%s\".", arg);
247
 
248
            *(const char **) c->var = match;
249
          }
250
          break;
251
        default:
252
          error ("gdb internal error: bad var_type in do_setshow_command");
253
        }
254
    }
255
  else if (c->type == show_cmd)
256
    {
257
      struct cleanup *old_chain;
258
      struct ui_stream *stb;
259
      int quote;
260
 
261
      stb = ui_out_stream_new (uiout);
262
      old_chain = make_cleanup_ui_out_stream_delete (stb);
263
 
264
      /* Possibly call the pre hook.  */
265
      if (c->pre_show_hook)
266
        (c->pre_show_hook) (c);
267
 
268
      /* Print doc minus "show" at start.  */
269
      print_doc_line (gdb_stdout, c->doc + 5);
270
 
271
      ui_out_text (uiout, " is ");
272
      ui_out_wrap_hint (uiout, "    ");
273
      quote = 0;
274
      switch (c->var_type)
275
        {
276
        case var_string:
277
          {
278
            unsigned char *p;
279
 
280
            if (*(unsigned char **) c->var)
281
              fputstr_filtered (*(unsigned char **) c->var, '"', stb->stream);
282
            quote = 1;
283
          }
284
          break;
285
        case var_string_noescape:
286
        case var_filename:
287
        case var_enum:
288
          if (*(char **) c->var)
289
            fputs_filtered (*(char **) c->var, stb->stream);
290
          quote = 1;
291
          break;
292
        case var_boolean:
293
          fputs_filtered (*(int *) c->var ? "on" : "off", stb->stream);
294
          break;
295
        case var_auto_boolean:
296
          switch (*(enum auto_boolean*) c->var)
297
            {
298
            case AUTO_BOOLEAN_TRUE:
299
              fputs_filtered ("on", stb->stream);
300
              break;
301
            case AUTO_BOOLEAN_FALSE:
302
              fputs_filtered ("off", stb->stream);
303
              break;
304
            case AUTO_BOOLEAN_AUTO:
305
              fputs_filtered ("auto", stb->stream);
306
              break;
307
            default:
308
              internal_error (__FILE__, __LINE__,
309
                              "do_setshow_command: invalid var_auto_boolean");
310
              break;
311
            }
312
          break;
313
        case var_uinteger:
314
          if (*(unsigned int *) c->var == UINT_MAX)
315
            {
316
              fputs_filtered ("unlimited", stb->stream);
317
              break;
318
            }
319
          /* else fall through */
320
        case var_zinteger:
321
          fprintf_filtered (stb->stream, "%u", *(unsigned int *) c->var);
322
          break;
323
        case var_integer:
324
          if (*(int *) c->var == INT_MAX)
325
            {
326
              fputs_filtered ("unlimited", stb->stream);
327
            }
328
          else
329
            fprintf_filtered (stb->stream, "%d", *(int *) c->var);
330
          break;
331
 
332
        default:
333
          error ("gdb internal error: bad var_type in do_setshow_command");
334
        }
335
      if (quote)
336
        ui_out_text (uiout, "\"");
337
      ui_out_field_stream (uiout, "value", stb);
338
      if (quote)
339
        ui_out_text (uiout, "\"");
340
      ui_out_text (uiout, ".\n");
341
      do_cleanups (old_chain);
342
    }
343
  else
344
    error ("gdb internal error: bad cmd_type in do_setshow_command");
345
  c->func (c, NULL, from_tty);
346
  if (c->type == set_cmd && set_hook)
347
    set_hook (c);
348
}
349
 
350
/* Show all the settings in a list of show commands.  */
351
 
352
void
353
cmd_show_list (struct cmd_list_element *list, int from_tty, char *prefix)
354
{
355
  ui_out_tuple_begin (uiout, "showlist");
356
  for (; list != NULL; list = list->next)
357
    {
358
      /* If we find a prefix, run its list, prefixing our output by its
359
         prefix (with "show " skipped).  */
360
      if (list->prefixlist && !list->abbrev_flag)
361
        {
362
          ui_out_tuple_begin (uiout, "optionlist");
363
          ui_out_field_string (uiout, "prefix", list->prefixname + 5);
364
          cmd_show_list (*list->prefixlist, from_tty, list->prefixname + 5);
365
          ui_out_tuple_end (uiout);
366
        }
367
      if (list->type == show_cmd)
368
        {
369
          ui_out_tuple_begin (uiout, "option");
370
          ui_out_text (uiout, prefix);
371
          ui_out_field_string (uiout, "name", list->name);
372
          ui_out_text (uiout, ":  ");
373
          do_setshow_command ((char *) NULL, from_tty, list);
374
          ui_out_tuple_end (uiout);
375
        }
376
    }
377
  ui_out_tuple_end (uiout);
378
}
379
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.