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