- 论坛徽章:
- 0
|
这两天看代码的时候碰到了一个结构体,注释多的惊人(当然,这是个好习惯,^_^)。但我要写分析笔记,为了格式好看,于是想如何能够方便地把这些注释去掉。
就以这个结构体为例吧:
- /* The structure which defines the type of a value. It should never
- be possible for a program lval value to survive over a call to the
- inferior (i.e. to be put into the history list or an internal
- variable). */
- struct value
- {
- /* Type of value; either not an lval, or one of the various
- different possible kinds of lval. */
- enum lval_type lval;
- /* Is it modifiable? Only relevant if lval != not_lval. */
- int modifiable;
- /* Location of value (if lval). */
- union
- {
- /* If lval == lval_memory, this is the address in the inferior.
- If lval == lval_register, this is the byte offset into the
- registers structure. */
- CORE_ADDR address;
- /* Pointer to internal variable. */
- struct internalvar *internalvar;
- /* Number of register. Only used with lval_reg_frame_relative. */
- int regnum;
- } location;
- /* Describes offset of a value within lval of a structure in bytes.
- If lval == lval_memory, this is an offset to the address.
- If lval == lval_register, this is a further offset from
- location.address within the registers structure.
- Note also the member embedded_offset below. */
- int offset;
- /* Only used for bitfields; number of bits contained in them. */
- int bitsize;
- /* Only used for bitfields; position of start of field.
- For BITS_BIG_ENDIAN=0 targets, it is the position of the LSB.
- For BITS_BIG_ENDIAN=1 targets, it is the position of the MSB. */
- int bitpos;
- /* Frame value is relative to. In practice, this ID is only used if
- the value is stored in several registers in other than the
- current frame, and these registers have not all been saved at the
- same place in memory. This will be described in the lval enum
- above as "lval_reg_frame_relative". */
- struct frame_id frame_id;
- /* Type of the value. */
- struct type *type;
- /* If a value represents a C++ object, then the `type' field gives
- the object's compile-time type. If the object actually belongs
- to some class derived from `type', perhaps with other base
- classes and additional members, then `type' is just a subobject
- of the real thing, and the full object is probably larger than
- `type' would suggest.
- If `type' is a dynamic class (i.e. one with a vtable), then GDB
- can actually determine the object's run-time type by looking at
- the run-time type information in the vtable. When this
- information is available, we may elect to read in the entire
- object, for several reasons:
- - When printing the value, the user would probably rather see the
- full object, not just the limited portion apparent from the
- compile-time type.
- - If `type' has virtual base classes, then even printing `type'
- alone may require reaching outside the `type' portion of the
- object to wherever the virtual base class has been stored.
- When we store the entire object, `enclosing_type' is the run-time
- type -- the complete object -- and `embedded_offset' is the
- offset of `type' within that larger type, in bytes. The
- VALUE_CONTENTS macro takes `embedded_offset' into account, so
- most GDB code continues to see the `type' portion of the value,
- just as the inferior would.
- If `type' is a pointer to an object, then `enclosing_type' is a
- pointer to the object's run-time type, and `pointed_to_offset' is
- the offset in bytes from the full object to the pointed-to object
- -- that is, the value `embedded_offset' would have if we
- followed the pointer and fetched the complete object. (I don't
- really see the point. Why not just determine the run-time type
- when you indirect, and avoid the special case? The contents
- don't matter until you indirect anyway.)
- If we're not doing anything fancy, `enclosing_type' is equal to
- `type', and `embedded_offset' is zero, so everything works
- normally. */
- struct type *enclosing_type;
- int embedded_offset;
- int pointed_to_offset;
- /* Values are stored in a chain, so that they can be deleted
- easily over calls to the inferior. Values assigned to internal
- variables or put into the value history are taken off this
- list. */
- struct value *next;
- /* Register number if the value is from a register. */
- short regno;
- /* If zero, contents of this value are in the contents field. If
- nonzero, contents are in inferior memory at address in the
- location.address field plus the offset field (and the lval
- field should be lval_memory).
- WARNING: This field is used by the code which handles
- watchpoints (see breakpoint.c) to decide whether a particular
- value can be watched by hardware watchpoints. If the lazy flag
- is set for some member of a value chain, it is assumed that
- this member of the chain doesn't need to be watched as part of
- watching the value itself. This is how GDB avoids watching the
- entire struct or array when the user wants to watch a single
- struct member or array element. If you ever change the way
- lazy flag is set and reset, be sure to consider this use as
- well! */
- char lazy;
- /* If nonzero, this is the value of a variable which does not
- actually exist in the program. */
- char optimized_out;
- /* The BFD section associated with this value. */
- asection *bfd_section;
- /* Actual contents of the value. For use of this value; setting
- it uses the stuff above. Not valid if lazy is nonzero.
- Target byte-order. We force it to be aligned properly for any
- possible value. Note that a value therefore extends beyond
- what is declared here. */
- union
- {
- long contents[1];
- DOUBLEST force_doublest_align;
- LONGEST force_longest_align;
- CORE_ADDR force_core_addr_align;
- void *force_pointer_align;
- } aligner;
- /* Do not add any new members here -- contents above will trash them. */
- };
复制代码
希望编辑之后的效果就是:
- struct value
- {
- enum lval_type lval;
- int modifiable;
- union
- {
- CORE_ADDR address;
- struct internalvar *internalvar;
- int regnum;
- } location;
- int offset;
- int bitsize;
- int bitpos;
- struct frame_id frame_id;
- struct type *type;
- struct type *enclosing_type;
- int embedded_offset;
- int pointed_to_offset;
- struct value *next;
- short regno;
- char lazy;
- char optimized_out;
- asection *bfd_section;
- union
- {
- long contents[1];
- DOUBLEST force_doublest_align;
- LONGEST force_longest_align;
- CORE_ADDR force_core_addr_align;
- void *force_pointer_align;
- } aligner;
- };
复制代码
请问各位都知道哪些方法可以完成这个任务?欢迎举报!
如果各位想到了方法,麻烦准确地描述一下操作步骤,我好学习,
在文本编辑器中使用普通方式进行删除统一归为一种方法(不管你是用vim的“x”还是其它编辑器的“Del”,),但如果能在文本编辑器中使用诸如独特的正则表达式等“快捷”操作来完成任务的,则可算是一种独立的方法。
希望能够借此学习一下各种文本编辑器和脚本语言的特性,所以希望大家不吝赐教!
我先写了一个awk脚本来完成这个任务:
awkfile:
- BEGIN { del = 0 }
- /\/\*/ { del = 1 }
- /\*\// { del = 0; next }
- del == 0 && /^.+$/{ print }
复制代码
实验结果如下,假设上述结构体的代码放在value文件中:
- [~]$
- [~]$ cat awkfile
- BEGIN { del = 0 }
- /\/\*/ { del = 1 }
- /\*\// { del = 0; next }
- del == 0 && /^.+$/{ print }
- [~]$
- [~]$
- [~]$ awk -f awkfile value
- struct value
- {
- enum lval_type lval;
- int modifiable;
- union
- {
- CORE_ADDR address;
- struct internalvar *internalvar;
- int regnum;
- } location;
- int offset;
- int bitsize;
- int bitpos;
- struct frame_id frame_id;
- struct type *type;
- struct type *enclosing_type;
- int embedded_offset;
- int pointed_to_offset;
- struct value *next;
- short regno;
- char lazy;
- char optimized_out;
- asection *bfd_section;
- union
- {
- long contents[1];
- DOUBLEST force_doublest_align;
- LONGEST force_longest_align;
- CORE_ADDR force_core_addr_align;
- void *force_pointer_align;
- } aligner;
- };
- [~]$
- [~]$
复制代码
[ 本帖最后由 雨丝风片 于 2006-10-24 11:29 编辑 ] |
|