198944Sobrien/* Longjump free calls to gdb internal routines.
298944Sobrien   Copyright 1999, 2000 Free Software Foundation, Inc.
398944Sobrien
498944Sobrien   This program is free software; you can redistribute it and/or modify
598944Sobrien   it under the terms of the GNU General Public License as published by
698944Sobrien   the Free Software Foundation; either version 2 of the License, or
798944Sobrien   (at your option) any later version.
898944Sobrien
998944Sobrien   This program is distributed in the hope that it will be useful,
1098944Sobrien   but WITHOUT ANY WARRANTY; without even the implied warranty of
1198944Sobrien   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1298944Sobrien   GNU General Public License for more details.
1398944Sobrien
1498944Sobrien   You should have received a copy of the GNU General Public License
1598944Sobrien   along with this program; if not, write to the Free Software
1698944Sobrien   Foundation, Inc., 59 Temple Place - Suite 330,
1798944Sobrien   Boston, MA 02111-1307, USA.  */
1898944Sobrien
1998944Sobrien#include "defs.h"
2098944Sobrien#include "value.h"
2198944Sobrien#include "wrapper.h"
2298944Sobrien
2398944Sobrien/* Use this struct to pass arguments to wrapper routines. We assume
2498944Sobrien   (arbitrarily) that no gdb function takes more than ten arguments. */
2598944Sobrienstruct gdb_wrapper_arguments
2698944Sobrien  {
2798944Sobrien
2898944Sobrien    /* Pointer to some result from the gdb function call, if any */
2998944Sobrien    union wrapper_results
3098944Sobrien      {
3198944Sobrien	int   integer;
3298944Sobrien	void *pointer;
3398944Sobrien      } result;
3498944Sobrien
3598944Sobrien
3698944Sobrien    /* The list of arguments. */
3798944Sobrien    union wrapper_args
3898944Sobrien      {
3998944Sobrien	int   integer;
4098944Sobrien	void *pointer;
4198944Sobrien      } args[10];
4298944Sobrien  };
4398944Sobrien
4498944Sobrienstruct captured_value_struct_elt_args
4598944Sobrien{
4698944Sobrien  struct value **argp;
4798944Sobrien  struct value **args;
4898944Sobrien  char *name;
4998944Sobrien  int *static_memfuncp;
5098944Sobrien  char *err;
5198944Sobrien  struct value **result_ptr;
5298944Sobrien};
5398944Sobrien
5498944Sobrienstatic int wrap_parse_exp_1 (char *);
5598944Sobrien
5698944Sobrienstatic int wrap_evaluate_expression (char *);
5798944Sobrien
5898944Sobrienstatic int wrap_value_fetch_lazy (char *);
5998944Sobrien
6098944Sobrienstatic int wrap_value_equal (char *);
6198944Sobrien
6298944Sobrienstatic int wrap_value_assign (char *);
6398944Sobrien
6498944Sobrienstatic int wrap_value_subscript (char *);
6598944Sobrien
6698944Sobrienstatic int wrap_value_ind (char *opaque_arg);
6798944Sobrien
6898944Sobrienstatic int do_captured_value_struct_elt (struct ui_out *uiout, void *data);
6998944Sobrien
7098944Sobrienstatic int wrap_parse_and_eval_type (char *);
7198944Sobrien
7298944Sobrienint
7398944Sobriengdb_parse_exp_1 (char **stringptr, struct block *block, int comma,
7498944Sobrien		 struct expression **expression)
7598944Sobrien{
7698944Sobrien  struct gdb_wrapper_arguments args;
7798944Sobrien  args.args[0].pointer = stringptr;
7898944Sobrien  args.args[1].pointer = block;
7998944Sobrien  args.args[2].integer = comma;
8098944Sobrien
8198944Sobrien  if (!catch_errors ((catch_errors_ftype *) wrap_parse_exp_1, &args,
8298944Sobrien		     "", RETURN_MASK_ERROR))
8398944Sobrien    {
8498944Sobrien      /* An error occurred */
8598944Sobrien      return 0;
8698944Sobrien    }
8798944Sobrien
8898944Sobrien  *expression = (struct expression *) args.result.pointer;
8998944Sobrien  return 1;
9098944Sobrien
9198944Sobrien}
9298944Sobrien
9398944Sobrienstatic int
9498944Sobrienwrap_parse_exp_1 (char *argptr)
9598944Sobrien{
9698944Sobrien  struct gdb_wrapper_arguments *args
9798944Sobrien    = (struct gdb_wrapper_arguments *) argptr;
9898944Sobrien  args->result.pointer = parse_exp_1((char **) args->args[0].pointer,
9998944Sobrien				     (struct block *) args->args[1].pointer,
10098944Sobrien				     args->args[2].integer);
10198944Sobrien  return 1;
10298944Sobrien}
10398944Sobrien
10498944Sobrienint
10598944Sobriengdb_evaluate_expression (struct expression *exp, struct value **value)
10698944Sobrien{
10798944Sobrien  struct gdb_wrapper_arguments args;
10898944Sobrien  args.args[0].pointer = exp;
10998944Sobrien
11098944Sobrien  if (!catch_errors ((catch_errors_ftype *) wrap_evaluate_expression, &args,
11198944Sobrien		     "", RETURN_MASK_ERROR))
11298944Sobrien    {
11398944Sobrien      /* An error occurred */
11498944Sobrien      return 0;
11598944Sobrien    }
11698944Sobrien
11798944Sobrien  *value = (struct value *) args.result.pointer;
11898944Sobrien  return 1;
11998944Sobrien}
12098944Sobrien
12198944Sobrienstatic int
12298944Sobrienwrap_evaluate_expression (char *a)
12398944Sobrien{
12498944Sobrien  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a;
12598944Sobrien
12698944Sobrien  (args)->result.pointer =
12798944Sobrien    (char *) evaluate_expression ((struct expression *) args->args[0].pointer);
12898944Sobrien  return 1;
12998944Sobrien}
13098944Sobrien
13198944Sobrienint
13298944Sobriengdb_value_fetch_lazy (struct value *value)
13398944Sobrien{
13498944Sobrien  struct gdb_wrapper_arguments args;
13598944Sobrien
13698944Sobrien  args.args[0].pointer = value;
13798944Sobrien  return catch_errors ((catch_errors_ftype *) wrap_value_fetch_lazy, &args,
13898944Sobrien		       "", RETURN_MASK_ERROR);
13998944Sobrien}
14098944Sobrien
14198944Sobrienstatic int
14298944Sobrienwrap_value_fetch_lazy (char *a)
14398944Sobrien{
14498944Sobrien  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a;
14598944Sobrien
14698944Sobrien  value_fetch_lazy ((struct value *) (args)->args[0].pointer);
14798944Sobrien  return 1;
14898944Sobrien}
14998944Sobrien
15098944Sobrienint
15198944Sobriengdb_value_equal (struct value *val1, struct value *val2, int *result)
15298944Sobrien{
15398944Sobrien  struct gdb_wrapper_arguments args;
15498944Sobrien
15598944Sobrien  args.args[0].pointer = val1;
15698944Sobrien  args.args[1].pointer = val2;
15798944Sobrien
15898944Sobrien  if (!catch_errors ((catch_errors_ftype *) wrap_value_equal, &args,
15998944Sobrien		     "", RETURN_MASK_ERROR))
16098944Sobrien    {
16198944Sobrien      /* An error occurred */
16298944Sobrien      return 0;
16398944Sobrien    }
16498944Sobrien
16598944Sobrien  *result = args.result.integer;
16698944Sobrien  return 1;
16798944Sobrien}
16898944Sobrien
16998944Sobrienstatic int
17098944Sobrienwrap_value_equal (char *a)
17198944Sobrien{
17298944Sobrien  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a;
17398944Sobrien  struct value *val1;
17498944Sobrien  struct value *val2;
17598944Sobrien
17698944Sobrien  val1 = (struct value *) (args)->args[0].pointer;
17798944Sobrien  val2 = (struct value *) (args)->args[1].pointer;
17898944Sobrien
17998944Sobrien  (args)->result.integer = value_equal (val1, val2);
18098944Sobrien  return 1;
18198944Sobrien}
18298944Sobrien
18398944Sobrienint
18498944Sobriengdb_value_assign (struct value *val1, struct value *val2, struct value **result)
18598944Sobrien{
18698944Sobrien  struct gdb_wrapper_arguments args;
18798944Sobrien
18898944Sobrien  args.args[0].pointer = val1;
18998944Sobrien  args.args[1].pointer = val2;
19098944Sobrien
19198944Sobrien  if (!catch_errors ((catch_errors_ftype *) wrap_value_assign, &args,
19298944Sobrien		     "", RETURN_MASK_ERROR))
19398944Sobrien    {
19498944Sobrien      /* An error occurred */
19598944Sobrien      return 0;
19698944Sobrien    }
19798944Sobrien
19898944Sobrien  *result = (struct value *) args.result.pointer;
19998944Sobrien  return 1;
20098944Sobrien}
20198944Sobrien
20298944Sobrienstatic int
20398944Sobrienwrap_value_assign (char *a)
20498944Sobrien{
20598944Sobrien  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a;
20698944Sobrien  struct value *val1;
20798944Sobrien  struct value *val2;
20898944Sobrien
20998944Sobrien  val1 = (struct value *) (args)->args[0].pointer;
21098944Sobrien  val2 = (struct value *) (args)->args[1].pointer;
21198944Sobrien
21298944Sobrien  (args)->result.pointer = value_assign (val1, val2);
21398944Sobrien  return 1;
21498944Sobrien}
21598944Sobrien
21698944Sobrienint
21798944Sobriengdb_value_subscript (struct value *val1, struct value *val2, struct value **rval)
21898944Sobrien{
21998944Sobrien  struct gdb_wrapper_arguments args;
22098944Sobrien
22198944Sobrien  args.args[0].pointer = val1;
22298944Sobrien  args.args[1].pointer = val2;
22398944Sobrien
22498944Sobrien  if (!catch_errors ((catch_errors_ftype *) wrap_value_subscript, &args,
22598944Sobrien		     "", RETURN_MASK_ERROR))
22698944Sobrien    {
22798944Sobrien      /* An error occurred */
22898944Sobrien      return 0;
22998944Sobrien    }
23098944Sobrien
23198944Sobrien  *rval = (struct value *) args.result.pointer;
23298944Sobrien  return 1;
23398944Sobrien}
23498944Sobrien
23598944Sobrienstatic int
23698944Sobrienwrap_value_subscript (char *a)
23798944Sobrien{
23898944Sobrien  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a;
23998944Sobrien  struct value *val1;
24098944Sobrien  struct value *val2;
24198944Sobrien
24298944Sobrien  val1 = (struct value *) (args)->args[0].pointer;
24398944Sobrien  val2 = (struct value *) (args)->args[1].pointer;
24498944Sobrien
24598944Sobrien  (args)->result.pointer = value_subscript (val1, val2);
24698944Sobrien  return 1;
24798944Sobrien}
24898944Sobrien
24998944Sobrienint
25098944Sobriengdb_value_ind (struct value *val, struct value **rval)
25198944Sobrien{
25298944Sobrien  struct gdb_wrapper_arguments args;
25398944Sobrien
25498944Sobrien  args.args[0].pointer = val;
25598944Sobrien
25698944Sobrien  if (!catch_errors ((catch_errors_ftype *) wrap_value_ind, &args,
25798944Sobrien		     "", RETURN_MASK_ERROR))
25898944Sobrien    {
25998944Sobrien      /* An error occurred */
26098944Sobrien      return 0;
26198944Sobrien    }
26298944Sobrien
26398944Sobrien  *rval = (struct value *) args.result.pointer;
26498944Sobrien  return 1;
26598944Sobrien}
26698944Sobrien
26798944Sobrienstatic int
26898944Sobrienwrap_value_ind (char *opaque_arg)
26998944Sobrien{
27098944Sobrien  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) opaque_arg;
27198944Sobrien  struct value *val;
27298944Sobrien
27398944Sobrien  val = (struct value *) (args)->args[0].pointer;
27498944Sobrien  (args)->result.pointer = value_ind (val);
27598944Sobrien  return 1;
27698944Sobrien}
27798944Sobrien
27898944Sobrienint
27998944Sobriengdb_parse_and_eval_type (char *p, int length, struct type **type)
28098944Sobrien{
28198944Sobrien  struct gdb_wrapper_arguments args;
28298944Sobrien  args.args[0].pointer = p;
28398944Sobrien  args.args[1].integer = length;
28498944Sobrien
28598944Sobrien  if (!catch_errors ((catch_errors_ftype *) wrap_parse_and_eval_type, &args,
28698944Sobrien		     "", RETURN_MASK_ALL))
28798944Sobrien    {
28898944Sobrien      /* An error occurred */
28998944Sobrien      return 0;
29098944Sobrien    }
29198944Sobrien
29298944Sobrien  *type = (struct type *) args.result.pointer;
29398944Sobrien  return 1;
29498944Sobrien}
29598944Sobrien
29698944Sobrienstatic int
29798944Sobrienwrap_parse_and_eval_type (char *a)
29898944Sobrien{
29998944Sobrien  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a;
30098944Sobrien
30198944Sobrien  char *p = (char *) args->args[0].pointer;
30298944Sobrien  int length = args->args[1].integer;
30398944Sobrien
30498944Sobrien  args->result.pointer = (char *) parse_and_eval_type (p, length);
30598944Sobrien
30698944Sobrien  return 1;
30798944Sobrien}
30898944Sobrien
30998944Sobrienenum gdb_rc
31098944Sobriengdb_value_struct_elt (struct ui_out *uiout, struct value **result, struct value **argp,
31198944Sobrien		      struct value **args, char *name, int *static_memfuncp,
31298944Sobrien		      char *err)
31398944Sobrien{
31498944Sobrien  struct captured_value_struct_elt_args cargs;
31598944Sobrien  cargs.argp = argp;
31698944Sobrien  cargs.args = args;
31798944Sobrien  cargs.name = name;
31898944Sobrien  cargs.static_memfuncp = static_memfuncp;
31998944Sobrien  cargs.err = err;
32098944Sobrien  cargs.result_ptr = result;
32198944Sobrien  return catch_exceptions (uiout, do_captured_value_struct_elt, &cargs,
32298944Sobrien			   NULL, RETURN_MASK_ALL);
32398944Sobrien}
32498944Sobrien
32598944Sobrienstatic int
32698944Sobriendo_captured_value_struct_elt (struct ui_out *uiout, void *data)
32798944Sobrien{
32898944Sobrien  struct captured_value_struct_elt_args *cargs = data;
32998944Sobrien  *cargs->result_ptr = value_struct_elt (cargs->argp, cargs->args, cargs->name,
33098944Sobrien			     cargs->static_memfuncp, cargs->err);
33198944Sobrien  return GDB_RC_OK;
33298944Sobrien}
33398944Sobrien
334