summaryrefslogtreecommitdiffstats
path: root/contrib/groff/src/roff/troff/div.cc
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/groff/src/roff/troff/div.cc')
-rw-r--r--contrib/groff/src/roff/troff/div.cc39
1 files changed, 29 insertions, 10 deletions
diff --git a/contrib/groff/src/roff/troff/div.cc b/contrib/groff/src/roff/troff/div.cc
index 281c1af..c885ca8 100644
--- a/contrib/groff/src/roff/troff/div.cc
+++ b/contrib/groff/src/roff/troff/div.cc
@@ -49,7 +49,8 @@ static vunits truncated_space;
static vunits needed_space;
diversion::diversion(symbol s)
-: prev(0), nm(s), vertical_position(V0), high_water_mark(V0), marked_place(V0)
+: prev(0), nm(s), vertical_position(V0), high_water_mark(V0),
+ no_space_mode(0), marked_place(V0)
{
}
@@ -249,6 +250,7 @@ void macro_diversion::transparent_output(node *n)
void macro_diversion::output(node *nd, int retain_size,
vunits vs, vunits post_vs, hunits width)
{
+ no_space_mode = 0;
vertical_size v(vs, post_vs);
while (nd != 0) {
nd->set_vertical_size(&v);
@@ -316,7 +318,7 @@ top_level_diversion::top_level_diversion()
page_length(units_per_inch*11),
prev_page_offset(units_per_inch), page_offset(units_per_inch),
page_trap_list(0), have_next_page_number(0),
- ejecting_page(0), before_first_page(1), no_space_mode(0)
+ ejecting_page(0), before_first_page(1)
{
}
@@ -722,15 +724,13 @@ void begin_page()
void no_space()
{
- if (curdiv == topdiv)
- topdiv->no_space_mode = 1;
+ curdiv->no_space_mode = 1;
skip_line();
}
void restore_spacing()
{
- if (curdiv == topdiv)
- topdiv->no_space_mode = 0;
+ curdiv->no_space_mode = 0;
skip_line();
}
@@ -755,8 +755,8 @@ void space_request()
n = curenv->get_vertical_spacing();
while (!tok.newline() && !tok.eof())
tok.next();
- if (!unpostpone_traps())
- curdiv->space(n);
+ if (!unpostpone_traps() && !curdiv->no_space_mode)
+ curdiv->space(n);
else
// The line might have had line spacing that was truncated.
truncated_space += n;
@@ -767,9 +767,10 @@ void space_request()
void blank_line()
{
curenv->do_break();
- if (!trap_sprung_flag)
+ if (!trap_sprung_flag && !curdiv->no_space_mode) {
curdiv->space(curenv->get_vertical_spacing());
- else
+ curenv->add_html_tag(".sp", 1);
+ } else
truncated_space += curenv->get_vertical_spacing();
}
@@ -1114,6 +1115,23 @@ void nl_reg::set_value(units n)
topdiv->before_first_page = 2;
}
+class no_space_mode_reg : public reg {
+public:
+ int get_value(units *);
+ const char *get_string();
+};
+
+int no_space_mode_reg::get_value(units *val)
+{
+ *val = curdiv->no_space_mode;
+ return 1;
+}
+
+const char *no_space_mode_reg::get_string()
+{
+ return curdiv->no_space_mode ? "1" : "0";
+}
+
void init_div_requests()
{
init_request("wh", when_request);
@@ -1143,6 +1161,7 @@ void init_div_requests()
number_reg_dictionary.define(".z", new diversion_name_reg);
number_reg_dictionary.define(".o", new page_offset_reg);
number_reg_dictionary.define(".p", new page_length_reg);
+ number_reg_dictionary.define(".ns", new no_space_mode_reg);
number_reg_dictionary.define(".d", new vertical_position_reg);
number_reg_dictionary.define(".h", new high_water_mark_reg);
number_reg_dictionary.define(".t", new distance_to_next_trap_reg);
OpenPOWER on IntegriCloud