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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [gdb/] [cli/] [cli-setshow.c] - Blame information for rev 294

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 24 jeremybenn
/* Handle set and show GDB commands.
2
 
3
   Copyright (c) 2000, 2001, 2002, 2003, 2007, 2008
4
   Free Software Foundation, Inc.
5
 
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 3 of the License, or
9
   (at your option) any later version.
10
 
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
 
16
   You should have received a copy of the GNU General Public License
17
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18
 
19
#include "defs.h"
20
#include "readline/tilde.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
void
93
deprecated_show_value_hack (struct ui_file *ignore_file,
94
                            int ignore_from_tty,
95
                            struct cmd_list_element *c,
96
                            const char *value)
97
{
98
  /* If there's no command or value, don't try to print it out.  */
99
  if (c == NULL || value == NULL)
100
    return;
101
  /* Print doc minus "show" at start.  */
102
  print_doc_line (gdb_stdout, c->doc + 5);
103
  switch (c->var_type)
104
    {
105
    case var_string:
106
    case var_string_noescape:
107
    case var_optional_filename:
108
    case var_filename:
109
    case var_enum:
110
      printf_filtered ((" is \"%s\".\n"), value);
111
      break;
112
    default:
113
      printf_filtered ((" is %s.\n"), value);
114
      break;
115
    }
116
}
117
 
118
/* Do a "set" or "show" command.  ARG is NULL if no argument, or the text
119
   of the argument, and FROM_TTY is nonzero if this command is being entered
120
   directly by the user (i.e. these are just like any other
121
   command).  C is the command list element for the command.  */
122
 
123
void
124
do_setshow_command (char *arg, int from_tty, struct cmd_list_element *c)
125
{
126
  if (c->type == set_cmd)
127
    {
128
      switch (c->var_type)
129
        {
130
        case var_string:
131
          {
132
            char *new;
133
            char *p;
134
            char *q;
135
            int ch;
136
 
137
            if (arg == NULL)
138
              arg = "";
139
            new = (char *) xmalloc (strlen (arg) + 2);
140
            p = arg;
141
            q = new;
142
            while ((ch = *p++) != '\000')
143
              {
144
                if (ch == '\\')
145
                  {
146
                    /* \ at end of argument is used after spaces
147
                       so they won't be lost.  */
148
                    /* This is obsolete now that we no longer strip
149
                       trailing whitespace and actually, the backslash
150
                       didn't get here in my test, readline or
151
                       something did something funky with a backslash
152
                       right before a newline.  */
153
                    if (*p == 0)
154
                      break;
155
                    ch = parse_escape (&p);
156
                    if (ch == 0)
157
                      break;    /* C loses */
158
                    else if (ch > 0)
159
                      *q++ = ch;
160
                  }
161
                else
162
                  *q++ = ch;
163
              }
164
#if 0
165
            if (*(p - 1) != '\\')
166
              *q++ = ' ';
167
#endif
168
            *q++ = '\0';
169
            new = (char *) xrealloc (new, q - new);
170
            if (*(char **) c->var != NULL)
171
              xfree (*(char **) c->var);
172
            *(char **) c->var = new;
173
          }
174
          break;
175
        case var_string_noescape:
176
          if (arg == NULL)
177
            arg = "";
178
          if (*(char **) c->var != NULL)
179
            xfree (*(char **) c->var);
180
          *(char **) c->var = savestring (arg, strlen (arg));
181
          break;
182
        case var_optional_filename:
183
          if (arg == NULL)
184
            arg = "";
185
          if (*(char **) c->var != NULL)
186
            xfree (*(char **) c->var);
187
          *(char **) c->var = savestring (arg, strlen (arg));
188
          break;
189
        case var_filename:
190
          if (arg == NULL)
191
            error_no_arg (_("filename to set it to."));
192
          if (*(char **) c->var != NULL)
193
            xfree (*(char **) c->var);
194
          {
195
            /* Clear trailing whitespace of filename.  */
196
            char *ptr = arg + strlen (arg) - 1;
197
            while (ptr >= arg && (*ptr == ' ' || *ptr == '\t'))
198
              ptr--;
199
            *(ptr + 1) = '\0';
200
          }
201
          *(char **) c->var = tilde_expand (arg);
202
          break;
203
        case var_boolean:
204
          *(int *) c->var = parse_binary_operation (arg);
205
          break;
206
        case var_auto_boolean:
207
          *(enum auto_boolean *) c->var = parse_auto_binary_operation (arg);
208
          break;
209
        case var_uinteger:
210
          if (arg == NULL)
211
            error_no_arg (_("integer to set it to."));
212
          *(unsigned int *) c->var = parse_and_eval_long (arg);
213
          if (*(unsigned int *) c->var == 0)
214
            *(unsigned int *) c->var = UINT_MAX;
215
          break;
216
        case var_integer:
217
          {
218
            unsigned int val;
219
            if (arg == NULL)
220
              error_no_arg (_("integer to set it to."));
221
            val = parse_and_eval_long (arg);
222
            if (val == 0)
223
              *(int *) c->var = INT_MAX;
224
            else if (val >= INT_MAX)
225
              error (_("integer %u out of range"), val);
226
            else
227
              *(int *) c->var = val;
228
            break;
229
          }
230
        case var_zinteger:
231
          if (arg == NULL)
232
            error_no_arg (_("integer to set it to."));
233
          *(int *) c->var = parse_and_eval_long (arg);
234
          break;
235
        case var_enum:
236
          {
237
            int i;
238
            int len;
239
            int nmatches;
240
            const char *match = NULL;
241
            char *p;
242
 
243
            /* if no argument was supplied, print an informative error message */
244
            if (arg == NULL)
245
              {
246
                char *msg;
247
                int msg_len = 0;
248
                for (i = 0; c->enums[i]; i++)
249
                  msg_len += strlen (c->enums[i]) + 2;
250
 
251
                msg = xmalloc (msg_len);
252
                *msg = '\0';
253
                make_cleanup (xfree, msg);
254
 
255
                for (i = 0; c->enums[i]; i++)
256
                  {
257
                    if (i != 0)
258
                      strcat (msg, ", ");
259
                    strcat (msg, c->enums[i]);
260
                  }
261
                error (_("Requires an argument. Valid arguments are %s."), msg);
262
              }
263
 
264
            p = strchr (arg, ' ');
265
 
266
            if (p)
267
              len = p - arg;
268
            else
269
              len = strlen (arg);
270
 
271
            nmatches = 0;
272
            for (i = 0; c->enums[i]; i++)
273
              if (strncmp (arg, c->enums[i], len) == 0)
274
                {
275
                  if (c->enums[i][len] == '\0')
276
                    {
277
                      match = c->enums[i];
278
                      nmatches = 1;
279
                      break; /* exact match. */
280
                    }
281
                  else
282
                    {
283
                      match = c->enums[i];
284
                      nmatches++;
285
                    }
286
                }
287
 
288
            if (nmatches <= 0)
289
              error (_("Undefined item: \"%s\"."), arg);
290
 
291
            if (nmatches > 1)
292
              error (_("Ambiguous item \"%s\"."), arg);
293
 
294
            *(const char **) c->var = match;
295
          }
296
          break;
297
        default:
298
          error (_("gdb internal error: bad var_type in do_setshow_command"));
299
        }
300
    }
301
  else if (c->type == show_cmd)
302
    {
303
      struct cleanup *old_chain;
304
      struct ui_stream *stb;
305
 
306
      stb = ui_out_stream_new (uiout);
307
      old_chain = make_cleanup_ui_out_stream_delete (stb);
308
 
309
      /* Possibly call the pre hook.  */
310
      if (c->pre_show_hook)
311
        (c->pre_show_hook) (c);
312
 
313
      switch (c->var_type)
314
        {
315
        case var_string:
316
          if (*(char **) c->var)
317
            fputstr_filtered (*(char **) c->var, '"', stb->stream);
318
          break;
319
        case var_string_noescape:
320
        case var_optional_filename:
321
        case var_filename:
322
        case var_enum:
323
          if (*(char **) c->var)
324
            fputs_filtered (*(char **) c->var, stb->stream);
325
          break;
326
        case var_boolean:
327
          fputs_filtered (*(int *) c->var ? "on" : "off", stb->stream);
328
          break;
329
        case var_auto_boolean:
330
          switch (*(enum auto_boolean*) c->var)
331
            {
332
            case AUTO_BOOLEAN_TRUE:
333
              fputs_filtered ("on", stb->stream);
334
              break;
335
            case AUTO_BOOLEAN_FALSE:
336
              fputs_filtered ("off", stb->stream);
337
              break;
338
            case AUTO_BOOLEAN_AUTO:
339
              fputs_filtered ("auto", stb->stream);
340
              break;
341
            default:
342
              internal_error (__FILE__, __LINE__,
343
                              _("do_setshow_command: invalid var_auto_boolean"));
344
              break;
345
            }
346
          break;
347
        case var_uinteger:
348
          if (*(unsigned int *) c->var == UINT_MAX)
349
            {
350
              fputs_filtered ("unlimited", stb->stream);
351
              break;
352
            }
353
          /* else fall through */
354
        case var_zinteger:
355
          fprintf_filtered (stb->stream, "%u", *(unsigned int *) c->var);
356
          break;
357
        case var_integer:
358
          if (*(int *) c->var == INT_MAX)
359
            {
360
              fputs_filtered ("unlimited", stb->stream);
361
            }
362
          else
363
            fprintf_filtered (stb->stream, "%d", *(int *) c->var);
364
          break;
365
 
366
        default:
367
          error (_("gdb internal error: bad var_type in do_setshow_command"));
368
        }
369
 
370
 
371
      /* FIXME: cagney/2005-02-10: Need to split this in half: code to
372
         convert the value into a string (esentially the above); and
373
         code to print the value out.  For the latter there should be
374
         MI and CLI specific versions.  */
375
 
376
      if (ui_out_is_mi_like_p (uiout))
377
        ui_out_field_stream (uiout, "value", stb);
378
      else
379
        {
380
          long length;
381
          char *value = ui_file_xstrdup (stb->stream, &length);
382
          make_cleanup (xfree, value);
383
          if (c->show_value_func != NULL)
384
            c->show_value_func (gdb_stdout, from_tty, c, value);
385
          else
386
            deprecated_show_value_hack (gdb_stdout, from_tty, c, value);
387
        }
388
      do_cleanups (old_chain);
389
    }
390
  else
391
    error (_("gdb internal error: bad cmd_type in do_setshow_command"));
392
  c->func (c, NULL, from_tty);
393
  if (c->type == set_cmd && deprecated_set_hook)
394
    deprecated_set_hook (c);
395
}
396
 
397
/* Show all the settings in a list of show commands.  */
398
 
399
void
400
cmd_show_list (struct cmd_list_element *list, int from_tty, char *prefix)
401
{
402
  struct cleanup *showlist_chain;
403
 
404
  showlist_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "showlist");
405
  for (; list != NULL; list = list->next)
406
    {
407
      /* If we find a prefix, run its list, prefixing our output by its
408
         prefix (with "show " skipped).  */
409
      if (list->prefixlist && !list->abbrev_flag)
410
        {
411
          struct cleanup *optionlist_chain
412
            = make_cleanup_ui_out_tuple_begin_end (uiout, "optionlist");
413
          char *new_prefix = strstr (list->prefixname, "show ") + 5;
414
          if (ui_out_is_mi_like_p (uiout))
415
            ui_out_field_string (uiout, "prefix", new_prefix);
416
          cmd_show_list (*list->prefixlist, from_tty, new_prefix);
417
          /* Close the tuple.  */
418
          do_cleanups (optionlist_chain);
419
        }
420
      else
421
        {
422
          struct cleanup *option_chain
423
            = make_cleanup_ui_out_tuple_begin_end (uiout, "option");
424
          ui_out_text (uiout, prefix);
425
          ui_out_field_string (uiout, "name", list->name);
426
          ui_out_text (uiout, ":  ");
427
          if (list->type == show_cmd)
428
            do_setshow_command ((char *) NULL, from_tty, list);
429
          else
430
            cmd_func (list, NULL, from_tty);
431
          /* Close the tuple.  */
432
          do_cleanups (option_chain);
433
        }
434
    }
435
  /* Close the tuple.  */
436
  do_cleanups (showlist_chain);
437
}
438
 

powered by: WebSVN 2.1.0

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