+ break;
+ }
+ case 'g': /* Replace pattern space with hold space */
+ free(pattern_space);
+ pattern_space = xstrdup(bbg.hold_space ? bbg.hold_space : "");
+ break;
+ case 'G': /* Append newline and hold space to pattern space */
+ {
+ int pattern_space_size = 2;
+ int hold_space_size = 0;
+
+ if (pattern_space)
+ pattern_space_size += strlen(pattern_space);
+ if (bbg.hold_space)
+ hold_space_size = strlen(bbg.hold_space);
+ pattern_space = xrealloc(pattern_space,
+ pattern_space_size + hold_space_size);
+ if (pattern_space_size == 2)
+ pattern_space[0] = 0;
+ strcat(pattern_space, "\n");
+ if (bbg.hold_space)
+ strcat(pattern_space, bbg.hold_space);
+ no_newline = 0;
+
+ break;
+ }
+ case 'h': /* Replace hold space with pattern space */
+ free(bbg.hold_space);
+ bbg.hold_space = xstrdup(pattern_space);
+ break;
+ case 'H': /* Append newline and pattern space to hold space */
+ {
+ int hold_space_size = 2;
+ int pattern_space_size = 0;
+
+ if (bbg.hold_space)
+ hold_space_size += strlen(bbg.hold_space);
+ if (pattern_space)
+ pattern_space_size = strlen(pattern_space);
+ bbg.hold_space = xrealloc(bbg.hold_space,
+ hold_space_size + pattern_space_size);
+
+ if (hold_space_size == 2)
+ *bbg.hold_space = 0;
+ strcat(bbg.hold_space, "\n");
+ if (pattern_space)
+ strcat(bbg.hold_space, pattern_space);
+
+ break;
+ }
+ case 'x': /* Exchange hold and pattern space */
+ {
+ char *tmp = pattern_space;
+ pattern_space = bbg.hold_space ? : xzalloc(1);
+ no_newline = 0;
+ bbg.hold_space = tmp;
+ break;
+ }