Home | History | Annotate | Line # | Download | only in ddb
db_write_cmd.c revision 1.9.2.2.2.1
      1  1.9.2.2.2.1   thorpej /*	$NetBSD: db_write_cmd.c,v 1.9.2.2.2.1 1999/06/21 01:16:26 thorpej Exp $	*/
      2          1.4       cgd 
      3          1.1       cgd /*
      4          1.1       cgd  * Mach Operating System
      5          1.1       cgd  * Copyright (c) 1991,1990 Carnegie Mellon University
      6          1.1       cgd  * All Rights Reserved.
      7          1.1       cgd  *
      8          1.1       cgd  * Permission to use, copy, modify and distribute this software and its
      9          1.1       cgd  * documentation is hereby granted, provided that both the copyright
     10          1.1       cgd  * notice and this permission notice appear in all copies of the
     11          1.1       cgd  * software, derivative works or modified versions, and any portions
     12          1.1       cgd  * thereof, and that both notices appear in supporting documentation.
     13          1.1       cgd  *
     14      1.9.2.2        pk  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
     15          1.1       cgd  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
     16          1.1       cgd  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
     17          1.1       cgd  *
     18          1.1       cgd  * Carnegie Mellon requests users of this software to return to
     19          1.1       cgd  *
     20          1.1       cgd  *  Software Distribution Coordinator  or  Software.Distribution (at) CS.CMU.EDU
     21          1.1       cgd  *  School of Computer Science
     22          1.1       cgd  *  Carnegie Mellon University
     23          1.1       cgd  *  Pittsburgh PA 15213-3890
     24          1.1       cgd  *
     25          1.1       cgd  * any improvements or extensions that they make and grant Carnegie the
     26          1.1       cgd  * rights to redistribute these changes.
     27          1.1       cgd  *
     28          1.1       cgd  *	Author: David B. Golub,  Carnegie Mellon University
     29          1.1       cgd  *	Date:	7/90
     30          1.1       cgd  */
     31          1.1       cgd 
     32          1.3   mycroft #include <sys/param.h>
     33          1.3   mycroft #include <sys/proc.h>
     34          1.3   mycroft 
     35          1.1       cgd #include <machine/db_machdep.h>
     36          1.1       cgd 
     37          1.1       cgd #include <ddb/db_lex.h>
     38          1.1       cgd #include <ddb/db_access.h>
     39          1.1       cgd #include <ddb/db_command.h>
     40          1.1       cgd #include <ddb/db_sym.h>
     41          1.6  christos #include <ddb/db_extern.h>
     42          1.6  christos #include <ddb/db_output.h>
     43          1.1       cgd 
     44          1.1       cgd /*
     45          1.1       cgd  * Write to file.
     46          1.1       cgd  */
     47          1.1       cgd /*ARGSUSED*/
     48          1.1       cgd void
     49          1.1       cgd db_write_cmd(address, have_addr, count, modif)
     50          1.1       cgd 	db_expr_t	address;
     51          1.1       cgd 	boolean_t	have_addr;
     52          1.1       cgd 	db_expr_t	count;
     53          1.1       cgd 	char *		modif;
     54          1.1       cgd {
     55          1.1       cgd 	register
     56          1.1       cgd 	db_addr_t	addr;
     57          1.1       cgd 	register
     58          1.1       cgd 	db_expr_t	old_value;
     59          1.1       cgd 	db_expr_t	new_value;
     60          1.1       cgd 	register int	size;
     61          1.1       cgd 	boolean_t	wrote_one = FALSE;
     62          1.1       cgd 
     63          1.1       cgd 	addr = (db_addr_t) address;
     64          1.1       cgd 
     65          1.1       cgd 	switch (modif[0]) {
     66          1.1       cgd 	    case 'b':
     67          1.1       cgd 		size = 1;
     68          1.1       cgd 		break;
     69          1.1       cgd 	    case 'h':
     70          1.1       cgd 		size = 2;
     71          1.1       cgd 		break;
     72          1.1       cgd 	    case 'l':
     73          1.1       cgd 	    case '\0':
     74          1.1       cgd 		size = 4;
     75          1.1       cgd 		break;
     76          1.1       cgd 	    default:
     77          1.6  christos 		size = -1;
     78          1.1       cgd 		db_error("Unknown size\n");
     79          1.5   mycroft 		/*NOTREACHED*/
     80          1.1       cgd 	}
     81          1.1       cgd 
     82          1.1       cgd 	while (db_expression(&new_value)) {
     83          1.1       cgd 	    old_value = db_get_value(addr, size, FALSE);
     84          1.1       cgd 	    db_printsym(addr, DB_STGY_ANY);
     85          1.9   thorpej 	    db_printf("\t\t%#*ln = %#*ln\n", (int)(sizeof (old_value) * 2) + 2,
     86          1.9   thorpej 		old_value, (int)(sizeof (new_value) * 2) + 2, new_value);
     87          1.1       cgd 	    db_put_value(addr, size, new_value);
     88          1.1       cgd 	    addr += size;
     89          1.1       cgd 
     90          1.1       cgd 	    wrote_one = TRUE;
     91          1.1       cgd 	}
     92          1.1       cgd 
     93          1.5   mycroft 	if (!wrote_one) {
     94          1.1       cgd 	    db_error("Nothing written.\n");
     95          1.5   mycroft 	    /*NOTREACHED*/
     96          1.5   mycroft 	}
     97          1.1       cgd 
     98          1.1       cgd 	db_next = addr;
     99          1.1       cgd 	db_prev = addr - size;
    100          1.1       cgd 
    101          1.1       cgd 	db_skip_to_eol();
    102          1.1       cgd }
    103          1.1       cgd 
    104