Hi Brian, Following up on an almost 14 year old bug report...
I can't reproduce these SEGVs with groff git HEAD. I would have thought they're the same bug since the groff output drivers outsource all of their parsing to the driver library, src/libs/libdriver/input.cpp. However, there's some suggestive evidence that's not the case. I cannot reproduce the grops SEGV with groff 1.22.4 from Debian. I _can_ reproduce the grodvi SEGV with groff 1.22.4, but neither SEGV happens with groff git HEAD. The only change to the source code that can conceivably explain that in the meantime is this: commit 5d0990500c2d16ed1025f1f0738cb419800652fe Author: G. Branden Robinson <g.branden.robin...@gmail.com> Date: Thu Jun 27 04:42:51 2019 +1000 libdriver: Fix SEGV (Savannah #56555). Check result of set_char_and_width() for error condition before relying on it. ...but I'm not too sure. groff 1.22.4 with grops might be working for me out of dumb luck. But your commands _are_ trying to set glyphs, so...maybe. Incidentally the libdriver diagnostics are both too verbose and too vague. You get doubled diags for failures parsing a 'c' construct but for most other "ditroff" commands, the most you will get is "missing argument" and a line number, which is especially dopey because the format is loose enough to allow multiple commands per line in many cases. I have a sketch for a fix for these problems. It's ugly enough that I expect some pushback from the groff mailing list over its esthetics. So let's get that out of the way--I'll CC them. In the meantime, John Gardner, who's written his own "ditroff" interpreter in JavaScript, might be able to offer some useful insights on the well-formedness of your sample documents. Regards, Branden
x Typesetter ps x resolution 72000 1 1 x initialize x font 1 TR x font 2 TI x font 3 TB x font 4 TBI V0 p1 s10 f1 cC h70 co h70 cp h70 cy h70 cr h70 ci h70 cg h70 ch h70 ct h70 c h70 c\ h70 c( h70 cc h70 co h70 c h70 c2 h70 c0 h70 c0 h70 c5 h70 c h70 cB h70 cr h70 ci h70 ca h70 cn h70 c h70 cM h70 c. h70 c h70 cC h70 ca h70 cr h70 cl h70 cs h70 co h70 cn h70 cT h70 ch h70 ci h70 cs h70 c h70 cp h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 ci h70 cs h70 c h70 cf h70 cr h70 ce h70 ce h70 c h70 cs h70 co h70 cf h70 ct h70 cw h70 ca h70 cr h70 ce h70 c; h70 c h70 cy h70 co h70 cu h70 c h70 cc h70 ca h70 cn h70 c h70 cr h70 ce h70 cd h70 ci h70 cs h70 ct h70 cr h70 ci h70 cb h70 cu h70 ct h70 ce h70 c h70 ci h70 ct h70 c h70 ca h70 cn h70 cd h70 c/ h70 co h70 cr h70 c h70 cm h70 co h70 cd h70 ci h70 cf h70 cy h70 ci h70 ct h70 c h70 cu h70 cn h70 cd h70 ce h70 cr h70 c h70 ct h70 ch h70 ce h70 c h70 ct h70 ce h70 cr h70 cm h70 cs h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 c\ h70 c* h70 c( h70 cG h70 cN h70 c h70 cG h70 ce h70 cn h70 ce h70 cr h70 ca h70 cl h70 c h70 cP h70 cu h70 cb h70 cl h70 ci h70 cc h70 c h70 cL h70 ci h70 cc h70 ce h70 cn h70 cs h70 ce h70 c h70 ca h70 cs h70 c h70 cp h70 cu h70 cb h70 cl h70 ci h70 cs h70 ch h70 ce h70 cd h70 c h70 cb h70 cy h70 ct h70 ch h70 ce h70 c h70 cF h70 cr h70 ce h70 ce h70 c h70 cS h70 co h70 cf h70 ct h70 cw h70 ca h70 cr h70 ce h70 c h70 cF h70 co h70 cu h70 cn h70 cd h70 ca h70 ct h70 ci h70 co h70 cn h70 c; h70 c h70 cv h70 ce h70 cr h70 cs h70 ci h70 co h70 cn h70 c h70 c2 h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 cL h70 ci h70 cc h70 ce h70 cn h70 cs h70 ce h70 c, h70 c h70 cd h70 ca h70 ct h70 ce h70 cd h70 c h70 cJ h70 cu h70 cn h70 ce h70 c h70 c1 h70 c9 h70 c9 h70 c1 h70 c. h70 cT h70 ch h70 ci h70 cs h70 c h70 cp h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 ci h70 cs h70 c h70 cd h70 ci h70 cs h70 ct h70 cr h70 ci h70 cb h70 cu h70 ct h70 ce h70 cd h70 c h70 ci h70 cn h70 c h70 ct h70 ch h70 ce h70 c h70 ch h70 co h70 cp h70 ce h70 c h70 ct h70 ch h70 ca h70 ct h70 c h70 ci h70 ct h70 c h70 cw h70 ci h70 cl h70 cl h70 c h70 cb h70 ce h70 c h70 cu h70 cs h70 ce h70 cf h70 cu h70 cl h70 c, h70 cb h70 cu h70 ct h70 cw h70 ci h70 ct h70 ch h70 co h70 cu h70 ct h70 c h70 ce h70 cv h70 ce h70 cn h70 c h70 ct h70 ch h70 ce h70 c h70 ci h70 cm h70 cp h70 cl h70 ci h70 ce h70 cd h70 c h70 cw h70 ca h70 cr h70 cr h70 ca h70 cn h70 ct h70 cy h70 c h70 co h70 cf h70 co h70 cr h70 cS h70 ce h70 ce h70 c h70 ct h70 ch h70 ce h70 c h70 c\ h70 c* h70 c( h70 cG h70 cN h70 c h70 cG h70 ce h70 cn h70 ce h70 cr h70 ca h70 cl h70 c h70 cP h70 cu h70 cb h70 cl h70 ci h70 cc h70 c h70 cL h70 ci h70 cc h70 ce h70 cn h70 cs h70 ce h70 c h70 cf h70 co h70 cr h70 c h70 cm h70 co h70 cr h70 ce h70 c h70 cd h70 ce h70 ct h70 ca h70 ci h70 cl h70 cs h70 c. h70 cY h70 co h70 cu h70 c h70 cs h70 ch h70 co h70 cu h70 cl h70 cd h70 c h70 ch h70 ca h70 cv h70 ce h70 c h70 cr h70 ce h70 cc h70 ce h70 ci h70 cv h70 ce h70 cd h70 c h70 ca h70 c h70 cc h70 co h70 cp h70 cy h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 c\ h70 c* h70 c( h70 cG h70 cN h70 c h70 cG h70 ce h70 cn h70 ce h70 cr h70 ca h70 cl h70 c h70 cP h70 cu h70 cb h70 cl h70 ci h70 cc h70 c h70 cL h70 ci h70 cc h70 ce h70 cn h70 cs h70 ce h70 ca h70 cl h70 co h70 cn h70 cg h70 c h70 cw h70 ci h70 ct h70 ch h70 c h70 ct h70 ch h70 ci h70 cs h70 c h70 cp h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c; h70 c h70 ci h70 cf h70 c h70 cn h70 co h70 ct h70 c, h70 c h70 cw h70 cr h70 ci h70 ct h70 ce h70 c h70 ct h70 co h70 c: h70 cF h70 cr h70 ce h70 ce h70 c h70 cS h70 co h70 cf h70 ct h70 cw h70 ca h70 cr h70 ce h70 c h70 cF h70 co h70 cu h70 cn h70 cd h70 ca h70 ct h70 ci h70 co h70 cn h70 c, h70 c h70 cI h70 cn h70 cc h70 c. h70 c5 h70 c9 h70 c h70 cT h70 ce h70 cm h70 cp h70 cl h70 ce h70 c h70 cP h70 cl h70 ca h70 cc h70 ce h70 c, h70 c h70 cS h70 cu h70 ci h70 ct h70 ce h70 c h70 c3 h70 c3 h70 c0 h70 cB h70 co h70 cs h70 ct h70 co h70 cn h70 c, h70 c h70 cM h70 cA h70 c h70 c0 h70 c2 h70 c1 h70 c1 h70 c1 h70 c- h70 c1 h70 c3 h70 c0 h70 c7 h70 cU h70 cS h70 cA h70 c\ h70 cf h70 c4 h70 cB h70 ce h70 cc h70 ca h70 cu h70 cs h70 ce h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 ci h70 cs h70 c h70 cl h70 ci h70 cc h70 ce h70 cn h70 cs h70 ce h70 cd h70 c h70 cf h70 cr h70 ce h70 ce h70 c h70 co h70 cf h70 c h70 cc h70 ch h70 ca h70 cr h70 cg h70 ce h70 c, h70 c h70 ct h70 ch h70 ce h70 cr h70 ce h70 c h70 ci h70 cs h70 c h70 cn h70 co h70 c h70 cw h70 ca h70 cr h70 cr h70 ca h70 cn h70 ct h70 cy h70 c h70 cf h70 co h70 cr h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c, h70 c h70 ct h70 co h70 c h70 ct h70 ch h70 ce h70 c h70 ce h70 cx h70 ct h70 ce h70 cn h70 ct h70 c h70 cp h70 ce h70 cr h70 cm h70 ci h70 ct h70 ct h70 ce h70 cd h70 c h70 cb h70 cy h70 c h70 ca h70 cp h70 cp h70 cl h70 ci h70 cc h70 ca h70 cb h70 cl h70 ce h70 c h70 cl h70 ca h70 cw h70 c. h70 c h70 c h70 cE h70 cx h70 cc h70 ce h70 cp h70 ct h70 c h70 cw h70 ch h70 ce h70 cn h70 co h70 ct h70 ch h70 ce h70 cr h70 cw h70 ci h70 cs h70 ce h70 c h70 cs h70 ct h70 ca h70 ct h70 ce h70 cd h70 c h70 ci h70 cn h70 c h70 cw h70 cr h70 ci h70 ct h70 ci h70 cn h70 cg h70 c h70 ct h70 ch h70 ce h70 c h70 cc h70 co h70 cp h70 cy h70 cr h70 ci h70 cg h70 ch h70 ct h70 c h70 ch h70 co h70 cl h70 cd h70 ce h70 cr h70 cs h70 c h70 ca h70 cn h70 cd h70 c/ h70 co h70 cr h70 c h70 co h70 ct h70 ch h70 ce h70 cr h70 c h70 cp h70 ca h70 cr h70 ct h70 ci h70 ce h70 cs h70 cp h70 cr h70 co h70 cv h70 ci h70 cd h70 ce h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 cw h70 ci h70 ct h70 ch h70 co h70 cu h70 ct h70 c h70 cw h70 ca h70 cr h70 cr h70 ca h70 cn h70 ct h70 cy h70 c h70 co h70 cf h70 c h70 ca h70 cn h70 cy h70 c h70 ck h70 ci h70 cn h70 cd h70 c, h70 c h70 ce h70 ci h70 ct h70 ch h70 ce h70 cr h70 c h70 ce h70 cx h70 cp h70 cr h70 ce h70 cs h70 cs h70 ce h70 cd h70 c h70 co h70 cr h70 c h70 ci h70 cm h70 cp h70 cl h70 ci h70 ce h70 cd h70 c, h70 c h70 ci h70 cn h70 cc h70 cl h70 cu h70 cd h70 ci h70 cn h70 cg h70 c, h70 c h70 cb h70 cu h70 ct h70 cn h70 co h70 ct h70 c h70 cl h70 ci h70 cm h70 ci h70 ct h70 ce h70 cd h70 c h70 ct h70 co h70 c, h70 c h70 ct h70 ch h70 ce h70 c h70 ci h70 cm h70 cp h70 cl h70 ci h70 ce h70 cd h70 c h70 cw h70 ca h70 cr h70 cr h70 ca h70 cn h70 ct h70 ci h70 ce h70 cs h70 c h70 co h70 cf h70 c h70 cm h70 ce h70 cr h70 cc h70 ch h70 ca h70 cn h70 ct h70 ci h70 cb h70 ci h70 cl h70 ci h70 ct h70 cy h70 c h70 ca h70 cn h70 cd h70 c h70 cf h70 ci h70 ct h70 cn h70 ce h70 cs h70 cs h70 cf h70 co h70 cr h70 c h70 ca h70 c h70 cp h70 ca h70 cr h70 ct h70 ci h70 cc h70 cu h70 cl h70 ca h70 cr h70 c h70 cp h70 cu h70 cr h70 cp h70 co h70 cs h70 ce h70 c. h70 c h70 c h70 cT h70 ch h70 ce h70 c h70 ce h70 cn h70 ct h70 ci h70 cr h70 ce h70 c h70 cr h70 ci h70 cs h70 ck h70 c h70 ca h70 cs h70 c h70 ct h70 co h70 c h70 ct h70 ch h70 ce h70 c h70 cq h70 cu h70 ca h70 cl h70 ci h70 ct h70 cy h70 c h70 ca h70 cn h70 cd h70 cp h70 ce h70 cr h70 cf h70 co h70 cr h70 cm h70 ca h70 cn h70 cc h70 ce h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 ci h70 cs h70 c h70 cw h70 ci h70 ct h70 ch h70 c h70 cy h70 co h70 cu h70 c. h70 c h70 c h70 cS h70 ch h70 co h70 cu h70 cl h70 cd h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 cp h70 cr h70 co h70 cv h70 ce h70 cd h70 ce h70 cf h70 ce h70 cc h70 ct h70 ci h70 cv h70 ce h70 c, h70 c h70 cy h70 co h70 cu h70 c h70 ca h70 cs h70 cs h70 cu h70 cm h70 ce h70 c h70 ct h70 ch h70 ce h70 c h70 cc h70 co h70 cs h70 ct h70 c h70 co h70 cf h70 c h70 ca h70 cl h70 cl h70 c h70 cn h70 ce h70 cc h70 ce h70 cs h70 cs h70 ca h70 cr h70 cy h70 c h70 cs h70 ce h70 cr h70 cv h70 ci h70 cc h70 ci h70 cn h70 cg h70 c, h70 c h70 cr h70 ce h70 cp h70 ca h70 ci h70 cr h70 c h70 co h70 cr h70 cc h70 co h70 cr h70 cr h70 ce h70 cc h70 ct h70 ci h70 co h70 cn h70 c. h70 c\ h70 cf h70 cP h70 c\ h70 cf h70 c4 h70 cI h70 cn h70 c h70 cn h70 co h70 c h70 ce h70 cv h70 ce h70 cn h70 ct h70 c h70 cu h70 cn h70 cl h70 ce h70 cs h70 cs h70 c h70 cr h70 ce h70 cq h70 cu h70 ci h70 cr h70 ce h70 cd h70 c h70 cb h70 cy h70 c h70 ca h70 cp h70 cp h70 cl h70 ci h70 cc h70 ca h70 cb h70 cl h70 ce h70 c h70 cl h70 ca h70 cw h70 c h70 co h70 cr h70 c h70 ca h70 cg h70 cr h70 ce h70 ce h70 cd h70 c h70 ct h70 co h70 c h70 ci h70 cn h70 c h70 cw h70 cr h70 ci h70 ct h70 ci h70 cn h70 cg h70 cw h70 ci h70 cl h70 cl h70 c h70 ca h70 cn h70 cy h70 c h70 cc h70 co h70 cp h70 cy h70 cr h70 ci h70 cg h70 ch h70 ct h70 c h70 ch h70 co h70 cl h70 cd h70 ce h70 cr h70 c, h70 c h70 co h70 cr h70 c h70 ca h70 cn h70 cy h70 c h70 co h70 ct h70 ch h70 ce h70 cr h70 c h70 cp h70 ca h70 cr h70 ct h70 cy h70 c h70 cw h70 ch h70 co h70 c h70 cm h70 ca h70 cy h70 c h70 cm h70 co h70 cd h70 ci h70 cf h70 cy h70 c h70 ca h70 cn h70 cd h70 c/ h70 co h70 cr h70 cr h70 ce h70 cd h70 ci h70 cs h70 ct h70 cr h70 ci h70 cb h70 cu h70 ct h70 ce h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 ca h70 cs h70 c h70 cp h70 ce h70 cr h70 cm h70 ci h70 ct h70 ct h70 ce h70 cd h70 c h70 ca h70 cb h70 co h70 cv h70 ce h70 c, h70 c h70 cb h70 ce h70 c h70 cl h70 ci h70 ca h70 cb h70 cl h70 ce h70 c h70 ct h70 co h70 c h70 cy h70 co h70 cu h70 c h70 cf h70 co h70 cr h70 cd h70 ca h70 cm h70 ca h70 cg h70 ce h70 cs h70 c, h70 c h70 ci h70 cn h70 cc h70 cl h70 cu h70 cd h70 ci h70 cn h70 cg h70 c h70 ca h70 cn h70 cy h70 c h70 cg h70 ce h70 cn h70 ce h70 cr h70 ca h70 cl h70 c, h70 c h70 cs h70 cp h70 ce h70 cc h70 ci h70 ca h70 cl h70 c, h70 c h70 ci h70 cn h70 cc h70 ci h70 cd h70 ce h70 cn h70 ct h70 ca h70 cl h70 c h70 co h70 cr h70 c h70 cc h70 co h70 cn h70 cs h70 ce h70 cq h70 cu h70 ce h70 cn h70 ct h70 ci h70 ca h70 cl h70 c h70 cd h70 ca h70 cm h70 ca h70 cg h70 ce h70 cs h70 ca h70 cr h70 ci h70 cs h70 ci h70 cn h70 cg h70 c h70 co h70 cu h70 ct h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 cu h70 cs h70 ce h70 c h70 co h70 cr h70 c h70 ci h70 cn h70 ca h70 cb h70 ci h70 cl h70 ci h70 ct h70 cy h70 c h70 ct h70 co h70 c h70 cu h70 cs h70 ce h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 c( h70 ci h70 cn h70 cc h70 cl h70 cu h70 cd h70 ci h70 cn h70 cg h70 c h70 cb h70 cu h70 ct h70 cn h70 co h70 ct h70 c h70 cl h70 ci h70 cm h70 ci h70 ct h70 ce h70 cd h70 c h70 ct h70 co h70 c h70 cl h70 co h70 cs h70 cs h70 c h70 co h70 cf h70 c h70 cd h70 ca h70 ct h70 ca h70 c h70 co h70 cr h70 c h70 cd h70 ca h70 ct h70 ca h70 c h70 cb h70 ce h70 ci h70 cn h70 cg h70 c h70 cr h70 ce h70 cn h70 cd h70 ce h70 cr h70 ce h70 cd h70 c h70 ci h70 cn h70 ca h70 cc h70 cc h70 cu h70 cr h70 ca h70 ct h70 ce h70 c h70 co h70 cr h70 c h70 cl h70 co h70 cs h70 cs h70 ce h70 cs h70 cs h70 cu h70 cs h70 ct h70 ca h70 ci h70 cn h70 ce h70 cd h70 c h70 cb h70 cy h70 c h70 cy h70 co h70 cu h70 c h70 co h70 cr h70 c h70 ct h70 ch h70 ci h70 cr h70 cd h70 c h70 cp h70 ca h70 cr h70 ct h70 ci h70 ce h70 cs h70 c h70 co h70 cr h70 c h70 ca h70 c h70 cf h70 ca h70 ci h70 cl h70 cu h70 cr h70 ce h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 ct h70 co h70 c h70 co h70 cp h70 ce h70 cr h70 ca h70 ct h70 ce h70 cw h70 ci h70 ct h70 ch h70 c h70 ca h70 cn h70 cy h70 c h70 co h70 ct h70 ch h70 ce h70 cr h70 c h70 cp h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 cs h70 c) h70 c, h70 c h70 ce h70 cv h70 ce h70 cn h70 c h70 ci h70 cf h70 c h70 cs h70 cu h70 cc h70 ch h70 c h70 ch h70 co h70 cl h70 cd h70 ce h70 cr h70 c h70 co h70 cr h70 c h70 co h70 ct h70 ch h70 ce h70 cr h70 c h70 cp h70 ca h70 cr h70 ct h70 cy h70 c h70 ch h70 ca h70 cs h70 c h70 cb h70 ce h70 ce h70 cn h70 ca h70 cd h70 cv h70 ci h70 cs h70 ce h70 cd h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 cp h70 co h70 cs h70 cs h70 ci h70 cb h70 ci h70 cl h70 ci h70 ct h70 cy h70 c h70 co h70 cf h70 c h70 cs h70 cu h70 cc h70 ch h70 c h70 cd h70 ca h70 cm h70 ca h70 cg h70 ce h70 cs h70 c. h70 c\ h70 cf h70 cP h70 x stop
x Typesetter dvi x resolution 57816 1 1 x initialize x font 1 TR x font 2 TI x font 3 TB x font 4 TBI V0 p1 s10 f1 cC h70 co h70 cp h70 cy h70 cr h70 ci h70 cg h70 ch h70 ct h70 c h70 c\ h70 c( h70 cc h70 co h70 c h70 c2 h70 c0 h70 c0 h70 c5 h70 c h70 cB h70 cr h70 ci h70 ca h70 cn h70 c h70 cM h70 c. h70 c h70 cC h70 ca h70 cr h70 cl h70 cs h70 co h70 cn h70 cT h70 ch h70 ci h70 cs h70 c h70 cp h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 ci h70 cs h70 c h70 cf h70 cr h70 ce h70 ce h70 c h70 cs h70 co h70 cf h70 ct h70 cw h70 ca h70 cr h70 ce h70 c; h70 c h70 cy h70 co h70 cu h70 c h70 cc h70 ca h70 cn h70 c h70 cr h70 ce h70 cd h70 ci h70 cs h70 ct h70 cr h70 ci h70 cb h70 cu h70 ct h70 ce h70 c h70 ci h70 ct h70 c h70 ca h70 cn h70 cd h70 c/ h70 co h70 cr h70 c h70 cm h70 co h70 cd h70 ci h70 cf h70 cy h70 ci h70 ct h70 c h70 cu h70 cn h70 cd h70 ce h70 cr h70 c h70 ct h70 ch h70 ce h70 c h70 ct h70 ce h70 cr h70 cm h70 cs h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 c\ h70 c* h70 c( h70 cG h70 cN h70 c h70 cG h70 ce h70 cn h70 ce h70 cr h70 ca h70 cl h70 c h70 cP h70 cu h70 cb h70 cl h70 ci h70 cc h70 c h70 cL h70 ci h70 cc h70 ce h70 cn h70 cs h70 ce h70 c h70 ca h70 cs h70 c h70 cp h70 cu h70 cb h70 cl h70 ci h70 cs h70 ch h70 ce h70 cd h70 c h70 cb h70 cy h70 ct h70 ch h70 ce h70 c h70 cF h70 cr h70 ce h70 ce h70 c h70 cS h70 co h70 cf h70 ct h70 cw h70 ca h70 cr h70 ce h70 c h70 cF h70 co h70 cu h70 cn h70 cd h70 ca h70 ct h70 ci h70 co h70 cn h70 c; h70 c h70 cv h70 ce h70 cr h70 cs h70 ci h70 co h70 cn h70 c h70 c2 h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 cL h70 ci h70 cc h70 ce h70 cn h70 cs h70 ce h70 c, h70 c h70 cd h70 ca h70 ct h70 ce h70 cd h70 c h70 cJ h70 cu h70 cn h70 ce h70 c h70 c1 h70 c9 h70 c9 h70 c1 h70 c. h70 cT h70 ch h70 ci h70 cs h70 c h70 cp h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 ci h70 cs h70 c h70 cd h70 ci h70 cs h70 ct h70 cr h70 ci h70 cb h70 cu h70 ct h70 ce h70 cd h70 c h70 ci h70 cn h70 c h70 ct h70 ch h70 ce h70 c h70 ch h70 co h70 cp h70 ce h70 c h70 ct h70 ch h70 ca h70 ct h70 c h70 ci h70 ct h70 c h70 cw h70 ci h70 cl h70 cl h70 c h70 cb h70 ce h70 c h70 cu h70 cs h70 ce h70 cf h70 cu h70 cl h70 c, h70 cb h70 cu h70 ct h70 cw h70 ci h70 ct h70 ch h70 co h70 cu h70 ct h70 c h70 ce h70 cv h70 ce h70 cn h70 c h70 ct h70 ch h70 ce h70 c h70 ci h70 cm h70 cp h70 cl h70 ci h70 ce h70 cd h70 c h70 cw h70 ca h70 cr h70 cr h70 ca h70 cn h70 ct h70 cy h70 c h70 co h70 cf h70 co h70 cr h70 cS h70 ce h70 ce h70 c h70 ct h70 ch h70 ce h70 c h70 c\ h70 c* h70 c( h70 cG h70 cN h70 c h70 cG h70 ce h70 cn h70 ce h70 cr h70 ca h70 cl h70 c h70 cP h70 cu h70 cb h70 cl h70 ci h70 cc h70 c h70 cL h70 ci h70 cc h70 ce h70 cn h70 cs h70 ce h70 c h70 cf h70 co h70 cr h70 c h70 cm h70 co h70 cr h70 ce h70 c h70 cd h70 ce h70 ct h70 ca h70 ci h70 cl h70 cs h70 c. h70 cY h70 co h70 cu h70 c h70 cs h70 ch h70 co h70 cu h70 cl h70 cd h70 c h70 ch h70 ca h70 cv h70 ce h70 c h70 cr h70 ce h70 cc h70 ce h70 ci h70 cv h70 ce h70 cd h70 c h70 ca h70 c h70 cc h70 co h70 cp h70 cy h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 c\ h70 c* h70 c( h70 cG h70 cN h70 c h70 cG h70 ce h70 cn h70 ce h70 cr h70 ca h70 cl h70 c h70 cP h70 cu h70 cb h70 cl h70 ci h70 cc h70 c h70 cL h70 ci h70 cc h70 ce h70 cn h70 cs h70 ce h70 ca h70 cl h70 co h70 cn h70 cg h70 c h70 cw h70 ci h70 ct h70 ch h70 c h70 ct h70 ch h70 ci h70 cs h70 c h70 cp h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c; h70 c h70 ci h70 cf h70 c h70 cn h70 co h70 ct h70 c, h70 c h70 cw h70 cr h70 ci h70 ct h70 ce h70 c h70 ct h70 co h70 c: h70 cF h70 cr h70 ce h70 ce h70 c h70 cS h70 co h70 cf h70 ct h70 cw h70 ca h70 cr h70 ce h70 c h70 cF h70 co h70 cu h70 cn h70 cd h70 ca h70 ct h70 ci h70 co h70 cn h70 c, h70 c h70 cI h70 cn h70 cc h70 c. h70 c5 h70 c9 h70 c h70 cT h70 ce h70 cm h70 cp h70 cl h70 ce h70 c h70 cP h70 cl h70 ca h70 cc h70 ce h70 c, h70 c h70 cS h70 cu h70 ci h70 ct h70 ce h70 c h70 c3 h70 c3 h70 c0 h70 cB h70 co h70 cs h70 ct h70 co h70 cn h70 c, h70 c h70 cM h70 cA h70 c h70 c0 h70 c2 h70 c1 h70 c1 h70 c1 h70 c- h70 c1 h70 c3 h70 c0 h70 c7 h70 cU h70 cS h70 cA h70 c\ h70 cf h70 c4 h70 cB h70 ce h70 cc h70 ca h70 cu h70 cs h70 ce h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 ci h70 cs h70 c h70 cl h70 ci h70 cc h70 ce h70 cn h70 cs h70 ce h70 cd h70 c h70 cf h70 cr h70 ce h70 ce h70 c h70 co h70 cf h70 c h70 cc h70 ch h70 ca h70 cr h70 cg h70 ce h70 c, h70 c h70 ct h70 ch h70 ce h70 cr h70 ce h70 c h70 ci h70 cs h70 c h70 cn h70 co h70 c h70 cw h70 ca h70 cr h70 cr h70 ca h70 cn h70 ct h70 cy h70 c h70 cf h70 co h70 cr h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c, h70 c h70 ct h70 co h70 c h70 ct h70 ch h70 ce h70 c h70 ce h70 cx h70 ct h70 ce h70 cn h70 ct h70 c h70 cp h70 ce h70 cr h70 cm h70 ci h70 ct h70 ct h70 ce h70 cd h70 c h70 cb h70 cy h70 c h70 ca h70 cp h70 cp h70 cl h70 ci h70 cc h70 ca h70 cb h70 cl h70 ce h70 c h70 cl h70 ca h70 cw h70 c. h70 c h70 c h70 cE h70 cx h70 cc h70 ce h70 cp h70 ct h70 c h70 cw h70 ch h70 ce h70 cn h70 co h70 ct h70 ch h70 ce h70 cr h70 cw h70 ci h70 cs h70 ce h70 c h70 cs h70 ct h70 ca h70 ct h70 ce h70 cd h70 c h70 ci h70 cn h70 c h70 cw h70 cr h70 ci h70 ct h70 ci h70 cn h70 cg h70 c h70 ct h70 ch h70 ce h70 c h70 cc h70 co h70 cp h70 cy h70 cr h70 ci h70 cg h70 ch h70 ct h70 c h70 ch h70 co h70 cl h70 cd h70 ce h70 cr h70 cs h70 c h70 ca h70 cn h70 cd h70 c/ h70 co h70 cr h70 c h70 co h70 ct h70 ch h70 ce h70 cr h70 c h70 cp h70 ca h70 cr h70 ct h70 ci h70 ce h70 cs h70 cp h70 cr h70 co h70 cv h70 ci h70 cd h70 ce h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 cw h70 ci h70 ct h70 ch h70 co h70 cu h70 ct h70 c h70 cw h70 ca h70 cr h70 cr h70 ca h70 cn h70 ct h70 cy h70 c h70 co h70 cf h70 c h70 ca h70 cn h70 cy h70 c h70 ck h70 ci h70 cn h70 cd h70 c, h70 c h70 ce h70 ci h70 ct h70 ch h70 ce h70 cr h70 c h70 ce h70 cx h70 cp h70 cr h70 ce h70 cs h70 cs h70 ce h70 cd h70 c h70 co h70 cr h70 c h70 ci h70 cm h70 cp h70 cl h70 ci h70 ce h70 cd h70 c, h70 c h70 ci h70 cn h70 cc h70 cl h70 cu h70 cd h70 ci h70 cn h70 cg h70 c, h70 c h70 cb h70 cu h70 ct h70 cn h70 co h70 ct h70 c h70 cl h70 ci h70 cm h70 ci h70 ct h70 ce h70 cd h70 c h70 ct h70 co h70 c, h70 c h70 ct h70 ch h70 ce h70 c h70 ci h70 cm h70 cp h70 cl h70 ci h70 ce h70 cd h70 c h70 cw h70 ca h70 cr h70 cr h70 ca h70 cn h70 ct h70 ci h70 ce h70 cs h70 c h70 co h70 cf h70 c h70 cm h70 ce h70 cr h70 cc h70 ch h70 ca h70 cn h70 ct h70 ci h70 cb h70 ci h70 cl h70 ci h70 ct h70 cy h70 c h70 ca h70 cn h70 cd h70 c h70 cf h70 ci h70 ct h70 cn h70 ce h70 cs h70 cs h70 cf h70 co h70 cr h70 c h70 ca h70 c h70 cp h70 ca h70 cr h70 ct h70 ci h70 cc h70 cu h70 cl h70 ca h70 cr h70 c h70 cp h70 cu h70 cr h70 cp h70 co h70 cs h70 ce h70 c. h70 c h70 c h70 cT h70 ch h70 ce h70 c h70 ce h70 cn h70 ct h70 ci h70 cr h70 ce h70 c h70 cr h70 ci h70 cs h70 ck h70 c h70 ca h70 cs h70 c h70 ct h70 co h70 c h70 ct h70 ch h70 ce h70 c h70 cq h70 cu h70 ca h70 cl h70 ci h70 ct h70 cy h70 c h70 ca h70 cn h70 cd h70 cp h70 ce h70 cr h70 cf h70 co h70 cr h70 cm h70 ca h70 cn h70 cc h70 ce h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 ci h70 cs h70 c h70 cw h70 ci h70 ct h70 ch h70 c h70 cy h70 co h70 cu h70 c. h70 c h70 c h70 cS h70 ch h70 co h70 cu h70 cl h70 cd h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 cp h70 cr h70 co h70 cv h70 ce h70 cd h70 ce h70 cf h70 ce h70 cc h70 ct h70 ci h70 cv h70 ce h70 c, h70 c h70 cy h70 co h70 cu h70 c h70 ca h70 cs h70 cs h70 cu h70 cm h70 ce h70 c h70 ct h70 ch h70 ce h70 c h70 cc h70 co h70 cs h70 ct h70 c h70 co h70 cf h70 c h70 ca h70 cl h70 cl h70 c h70 cn h70 ce h70 cc h70 ce h70 cs h70 cs h70 ca h70 cr h70 cy h70 c h70 cs h70 ce h70 cr h70 cv h70 ci h70 cc h70 ci h70 cn h70 cg h70 c, h70 c h70 cr h70 ce h70 cp h70 ca h70 ci h70 cr h70 c h70 co h70 cr h70 cc h70 co h70 cr h70 cr h70 ce h70 cc h70 ct h70 ci h70 co h70 cn h70 c. h70 c\ h70 cf h70 cP h70 c\ h70 cf h70 c4 h70 cI h70 cn h70 c h70 cn h70 co h70 c h70 ce h70 cv h70 ce h70 cn h70 ct h70 c h70 cu h70 cn h70 cl h70 ce h70 cs h70 cs h70 c h70 cr h70 ce h70 cq h70 cu h70 ci h70 cr h70 ce h70 cd h70 c h70 cb h70 cy h70 c h70 ca h70 cp h70 cp h70 cl h70 ci h70 cc h70 ca h70 cb h70 cl h70 ce h70 c h70 cl h70 ca h70 cw h70 c h70 co h70 cr h70 c h70 ca h70 cg h70 cr h70 ce h70 ce h70 cd h70 c h70 ct h70 co h70 c h70 ci h70 cn h70 c h70 cw h70 cr h70 ci h70 ct h70 ci h70 cn h70 cg h70 cw h70 ci h70 cl h70 cl h70 c h70 ca h70 cn h70 cy h70 c h70 cc h70 co h70 cp h70 cy h70 cr h70 ci h70 cg h70 ch h70 ct h70 c h70 ch h70 co h70 cl h70 cd h70 ce h70 cr h70 c, h70 c h70 co h70 cr h70 c h70 ca h70 cn h70 cy h70 c h70 co h70 ct h70 ch h70 ce h70 cr h70 c h70 cp h70 ca h70 cr h70 ct h70 cy h70 c h70 cw h70 ch h70 co h70 c h70 cm h70 ca h70 cy h70 c h70 cm h70 co h70 cd h70 ci h70 cf h70 cy h70 c h70 ca h70 cn h70 cd h70 c/ h70 co h70 cr h70 cr h70 ce h70 cd h70 ci h70 cs h70 ct h70 cr h70 ci h70 cb h70 cu h70 ct h70 ce h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 ca h70 cs h70 c h70 cp h70 ce h70 cr h70 cm h70 ci h70 ct h70 ct h70 ce h70 cd h70 c h70 ca h70 cb h70 co h70 cv h70 ce h70 c, h70 c h70 cb h70 ce h70 c h70 cl h70 ci h70 ca h70 cb h70 cl h70 ce h70 c h70 ct h70 co h70 c h70 cy h70 co h70 cu h70 c h70 cf h70 co h70 cr h70 cd h70 ca h70 cm h70 ca h70 cg h70 ce h70 cs h70 c, h70 c h70 ci h70 cn h70 cc h70 cl h70 cu h70 cd h70 ci h70 cn h70 cg h70 c h70 ca h70 cn h70 cy h70 c h70 cg h70 ce h70 cn h70 ce h70 cr h70 ca h70 cl h70 c, h70 c h70 cs h70 cp h70 ce h70 cc h70 ci h70 ca h70 cl h70 c, h70 c h70 ci h70 cn h70 cc h70 ci h70 cd h70 ce h70 cn h70 ct h70 ca h70 cl h70 c h70 co h70 cr h70 c h70 cc h70 co h70 cn h70 cs h70 ce h70 cq h70 cu h70 ce h70 cn h70 ct h70 ci h70 ca h70 cl h70 c h70 cd h70 ca h70 cm h70 ca h70 cg h70 ce h70 cs h70 ca h70 cr h70 ci h70 cs h70 ci h70 cn h70 cg h70 c h70 co h70 cu h70 ct h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 cu h70 cs h70 ce h70 c h70 co h70 cr h70 c h70 ci h70 cn h70 ca h70 cb h70 ci h70 cl h70 ci h70 ct h70 cy h70 c h70 ct h70 co h70 c h70 cu h70 cs h70 ce h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 c( h70 ci h70 cn h70 cc h70 cl h70 cu h70 cd h70 ci h70 cn h70 cg h70 c h70 cb h70 cu h70 ct h70 cn h70 co h70 ct h70 c h70 cl h70 ci h70 cm h70 ci h70 ct h70 ce h70 cd h70 c h70 ct h70 co h70 c h70 cl h70 co h70 cs h70 cs h70 c h70 co h70 cf h70 c h70 cd h70 ca h70 ct h70 ca h70 c h70 co h70 cr h70 c h70 cd h70 ca h70 ct h70 ca h70 c h70 cb h70 ce h70 ci h70 cn h70 cg h70 c h70 cr h70 ce h70 cn h70 cd h70 ce h70 cr h70 ce h70 cd h70 c h70 ci h70 cn h70 ca h70 cc h70 cc h70 cu h70 cr h70 ca h70 ct h70 ce h70 c h70 co h70 cr h70 c h70 cl h70 co h70 cs h70 cs h70 ce h70 cs h70 cs h70 cu h70 cs h70 ct h70 ca h70 ci h70 cn h70 ce h70 cd h70 c h70 cb h70 cy h70 c h70 cy h70 co h70 cu h70 c h70 co h70 cr h70 c h70 ct h70 ch h70 ci h70 cr h70 cd h70 c h70 cp h70 ca h70 cr h70 ct h70 ci h70 ce h70 cs h70 c h70 co h70 cr h70 c h70 ca h70 c h70 cf h70 ca h70 ci h70 cl h70 cu h70 cr h70 ce h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 cP h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 c h70 ct h70 co h70 c h70 co h70 cp h70 ce h70 cr h70 ca h70 ct h70 ce h70 cw h70 ci h70 ct h70 ch h70 c h70 ca h70 cn h70 cy h70 c h70 co h70 ct h70 ch h70 ce h70 cr h70 c h70 cp h70 cr h70 co h70 cg h70 cr h70 ca h70 cm h70 cs h70 c) h70 c, h70 c h70 ce h70 cv h70 ce h70 cn h70 c h70 ci h70 cf h70 c h70 cs h70 cu h70 cc h70 ch h70 c h70 ch h70 co h70 cl h70 cd h70 ce h70 cr h70 c h70 co h70 cr h70 c h70 co h70 ct h70 ch h70 ce h70 cr h70 c h70 cp h70 ca h70 cr h70 ct h70 cy h70 c h70 ch h70 ca h70 cs h70 c h70 cb h70 ce h70 ce h70 cn h70 ca h70 cd h70 cv h70 ci h70 cs h70 ce h70 cd h70 c h70 co h70 cf h70 c h70 ct h70 ch h70 ce h70 c h70 cp h70 co h70 cs h70 cs h70 ci h70 cb h70 ci h70 cl h70 ci h70 ct h70 cy h70 c h70 co h70 cf h70 c h70 cs h70 cu h70 cc h70 ch h70 c h70 cd h70 ca h70 cm h70 ca h70 cg h70 ce h70 cs h70 c. h70 c\ h70 cf h70 cP h70 x stop
diff --git a/src/libs/libdriver/input.cpp b/src/libs/libdriver/input.cpp index 15f0ef1c..f49721eb 100644 --- a/src/libs/libdriver/input.cpp +++ b/src/libs/libdriver/input.cpp @@ -383,7 +383,8 @@ ColorArg color_from_Df_command(IntArg); void delete_current_env(void); // delete global var current_env void fatal_command(char); // abort for invalid command inline Char get_char(void); // read next character from input stream -ColorArg get_color_arg(void); // read in argument for new color cmds +ColorArg get_color_arg(const char * cmd); + // read in argument for new color cmds IntArray *get_D_fixed_args(const size_t); // read in fixed number of integer // arguments @@ -393,13 +394,16 @@ IntArray *get_D_fixed_args_odd_dummy(const size_t); IntArray *get_D_variable_args(void); // variable, even number of int args char *get_extended_arg(void); // argument for 'x X' (several lines) -IntArg get_integer_arg(void); // read in next integer argument +IntArg get_integer_arg(const char * const); + // read in next integer argument IntArray *get_possibly_integer_args(); // 0 or more integer arguments -char *get_string_arg(void); // read in next string arg, ended by WS +char *get_string_arg(const char * const); + // read in next string arg, ended by WS inline bool is_space_or_tab(const Char); // test on space/tab char -Char next_arg_begin(void); // skip white space on current line +Char next_arg_begin(const char * const); + // skip white space on current line Char next_command(void); // go to next command, evt. diff. line inline bool odd(const int); // test if integer is odd void position_to_end_of_args(const IntArray * const); @@ -631,12 +635,15 @@ get_char(void) /* get_color_arg(): Retrieve an argument suitable for the color commands m and DF. + cmd: In parameter; command whose argument we're parsing. To be + passed to next_arg_begin(). + Return: The retrieved color argument. */ ColorArg -get_color_arg(void) +get_color_arg(const char * const cmd) { - IntArg x = get_integer_arg(); + IntArg x = get_integer_arg(cmd); if (x < 0 || x > (IntArg)COLORARG_MAX) { error("color component argument out of range"); x = 0; @@ -662,12 +669,20 @@ get_color_arg(void) IntArray * get_D_fixed_args(const size_t number) { + // Set up command argument buffer template for diagnostics. + char cmdbuft[] = "D (argument 18446744073709551616)"; // 2^64 + char *cmdbuf = (char *)calloc(1, strlen(cmdbuft)); if (number <= 0) fatal("requested number of arguments must be > 0"); IntArray *args = new IntArray(number); - for (size_t i = 0; i < number; i++) - args->append(get_integer_arg()); + for (size_t i = 0; i < number; i++) { + if (0 == sprintf(cmdbuf, "D (argument %ld)", number)) + error("internal error using sprintf() on command buffer"); + else + args->append(get_integer_arg(cmdbuf)); + } skip_line_D(); + free(cmdbuf); return args; } @@ -688,11 +703,17 @@ get_D_fixed_args(const size_t number) IntArray * get_D_fixed_args_odd_dummy(const size_t number) { + // Set up command argument buffer template for diagnostics. + char cmdbuft[] = "D (argument 18446744073709551616)"; // 2^64 + char *cmdbuf = (char *)calloc(1, strlen(cmdbuft)); if (number <= 0) fatal("requested number of arguments must be > 0"); IntArray *args = new IntArray(number); for (size_t i = 0; i < number; i++) - args->append(get_integer_arg()); + if (0 == sprintf(cmdbuf, "D (argument %ld)", number)) + error("internal error using sprintf() on command buffer"); + else + args->append(get_integer_arg(cmdbuf)); if (odd(number)) { IntArray *a = get_possibly_integer_args(); if (a->len() > 1) @@ -700,6 +721,7 @@ get_D_fixed_args_odd_dummy(const size_t number) delete a; } skip_line_D(); + free(cmdbuf); return args; } @@ -746,7 +768,7 @@ char * get_extended_arg(void) { StringBuf buf = StringBuf(); - Char c = next_arg_begin(); + Char c = next_arg_begin("x X"); while ((int) c != EOF) { if ((int) c == '\n') { current_lineno++; @@ -774,13 +796,16 @@ get_extended_arg(void) Fatal error on all other situations. + cmd: In parameter; command whose argument we're parsing. To be + passed to next_arg_begin(). + Return: Retrieved integer. */ IntArg -get_integer_arg(void) +get_integer_arg(const char * const cmd) { StringBuf buf = StringBuf(); - Char c = next_arg_begin(); + Char c = next_arg_begin(cmd); if ((int) c == '-') { buf.append(c); c = get_char(); @@ -892,13 +917,16 @@ get_possibly_integer_args() - The terminating space, tab, newline, or EOF character is restored onto the input queue, so no line skip. + cmd: In parameter; command whose argument we're parsing. To be + passed to next_arg_begin(). + Return: Retrieved string as char *, allocated by 'new'. */ char * -get_string_arg(void) +get_string_arg(const char * const cmd) { StringBuf buf = StringBuf(); - Char c = next_arg_begin(); + Char c = next_arg_begin(cmd); while (!is_space_or_tab(c) && c != Char('\n') && c != Char(EOF)) { buf.append(c); @@ -928,10 +956,13 @@ is_space_or_tab(const Char c) Skip space and tab characters; error on newline or EOF. + cmd: In parameter, name of command whose argument we're gathering, so + that our diagnostic message is useful. + Return: The first character different from these (including '#'). */ Char -next_arg_begin(void) +next_arg_begin(const char * const cmd) { Char c; while (1) { @@ -942,7 +973,7 @@ next_arg_begin(void) break; case '\n': case EOF: - error("missing argument"); + error("missing argument to %1 command", cmd); return c; default: // first essential character return c; @@ -1260,39 +1291,42 @@ unget_char(const Char c) col: In-out-parameter; the color object to be set, must have been initialized before. + + cmd: In parameter; command whose argument we're parsing. To be + passed to next_arg_begin(). */ void -parse_color_command(color *col) +parse_color_command(color *col, const char * const cmd) { ColorArg gray = 0; ColorArg red = 0, green = 0, blue = 0; ColorArg cyan = 0, magenta = 0, yellow = 0, black = 0; - Char subcmd = next_arg_begin(); + Char subcmd = next_arg_begin(cmd); switch((int) subcmd) { case 'c': // DFc or mc: CMY - cyan = get_color_arg(); - magenta = get_color_arg(); - yellow = get_color_arg(); + cyan = get_color_arg(cmd); + magenta = get_color_arg(cmd); + yellow = get_color_arg(cmd); col->set_cmy(cyan, magenta, yellow); break; case 'd': // DFd or md: set default color col->set_default(); break; case 'g': // DFg or mg: gray - gray = get_color_arg(); + gray = get_color_arg(cmd); col->set_gray(gray); break; case 'k': // DFk or mk: CMYK - cyan = get_color_arg(); - magenta = get_color_arg(); - yellow = get_color_arg(); - black = get_color_arg(); + cyan = get_color_arg(cmd); + magenta = get_color_arg(cmd); + yellow = get_color_arg(cmd); + black = get_color_arg(cmd); col->set_cmyk(cyan, magenta, yellow, black); break; case 'r': // DFr or mr: RGB - red = get_color_arg(); - green = get_color_arg(); - blue = get_color_arg(); + red = get_color_arg(cmd); + green = get_color_arg(cmd); + blue = get_color_arg(cmd); col->set_rgb(red, green, blue); break; default: @@ -1314,7 +1348,7 @@ parse_color_command(color *col) void parse_D_command() { - Char subcmd = next_arg_begin(); + Char subcmd = next_arg_begin("D"); switch((int) subcmd) { case '~': // D~: draw B-spline // actually, this isn't available for some postprocessors @@ -1365,7 +1399,7 @@ parse_D_command() } case 'f': // Df: set fill gray; obsoleted by DFg { - IntArg arg = get_integer_arg(); + IntArg arg = get_integer_arg("Df"); if ((arg >= 0) && (arg <= 1000)) { // convert arg and treat it like DFg ColorArg gray = color_from_Df_command(arg); @@ -1378,7 +1412,7 @@ parse_D_command() } pr->change_fill_color(current_env); // skip unused 'vertical' component (\D'...' always emits pairs) - (void) get_integer_arg(); + (void) get_integer_arg("Df (unused vertical)"); # ifdef STUPID_DRAWING_POSITIONING current_env->hpos += arg; # endif @@ -1386,7 +1420,7 @@ parse_D_command() break; } case 'F': // DF: set fill color, several formats - parse_color_command(current_env->fill); + parse_color_command(current_env->fill, "DF"); pr->change_fill_color(current_env); // no positioning (setting-only command) skip_line_x(); @@ -1448,13 +1482,13 @@ bool parse_x_command(void) { bool stopped = false; - char *subcmd_str = get_string_arg(); + char *subcmd_str = get_string_arg("x"); char subcmd = subcmd_str[0]; switch (subcmd) { case 'f': // x font: mount font { - IntArg n = get_integer_arg(); - char *name = get_string_arg(); + IntArg n = get_integer_arg("x f"); + char *name = get_string_arg("x f"); pr->load_font(n, name); a_delete name; skip_line_x(); @@ -1472,7 +1506,7 @@ parse_x_command(void) break; } case 'H': // x Height: set character height - current_env->height = get_integer_arg(); + current_env->height = get_integer_arg("x H"); if (current_env->height == current_env->size) current_env->height = 0; skip_line_x(); @@ -1493,7 +1527,7 @@ parse_x_command(void) skip_line_x(); break; case 'S': // x Slant: set slant - current_env->slant = get_integer_arg(); + current_env->slant = get_integer_arg("x S"); skip_line_x(); break; case 't': // x trailer: generate trailer info @@ -1505,7 +1539,7 @@ parse_x_command(void) break; case 'u': // x underline: from .cu { - char *str_arg = get_string_arg(); + char *str_arg = get_string_arg("x u"); pr->special(str_arg, current_env, 'u'); a_delete str_arg; skip_line_x(); @@ -1594,11 +1628,11 @@ do_file(const char *filename) return; if ((int) command != 'x') fatal("the first command must be 'x T'"); - str_arg = get_string_arg(); + str_arg = get_string_arg("x T"); if (str_arg[0] != 'T') fatal("the first command must be 'x T'"); a_delete str_arg; - char *tmp_dev = get_string_arg(); + char *tmp_dev = get_string_arg("x T"); if (pr == 0) { // note: 'pr' initialized after prologue device = tmp_dev; if (!font::load_desc()) @@ -1616,18 +1650,18 @@ do_file(const char *filename) command = next_command(); if ((int) command != 'x') fatal("the second command must be 'x res'"); - str_arg = get_string_arg(); + str_arg = get_string_arg("x res"); if (str_arg[0] != 'r') fatal("the second command must be 'x res'"); a_delete str_arg; - int_arg = get_integer_arg(); + int_arg = get_integer_arg("x res (font)"); EnvInt font_res = font::res; if (int_arg != font_res) fatal("resolution does not match"); - int_arg = get_integer_arg(); + int_arg = get_integer_arg("x res (hor)"); if (int_arg != font::hor) fatal("minimum horizontal motion does not match"); - int_arg = get_integer_arg(); + int_arg = get_integer_arg("x res (vert)"); if (int_arg != font::vert) fatal("minimum vertical motion does not match"); skip_line_x(); // ignore further arguments @@ -1636,7 +1670,7 @@ do_file(const char *filename) command = next_command(); if (command != 'x') fatal("the third command must be 'x init'"); - str_arg = get_string_arg(); + str_arg = get_string_arg("x init"); if (str_arg[0] != 'i') fatal("the third command must be 'x init'"); a_delete str_arg; @@ -1676,7 +1710,7 @@ do_file(const char *filename) case '9': { // expect 2 digits and a character char s[3]; - Char c = next_arg_begin(); + Char c = next_arg_begin("jump-and-move (digits)"); if (npages <= 0) fatal_command(command); if (!isdigit((int) c)) { @@ -1692,7 +1726,7 @@ do_file(const char *filename) error("couldn't convert 2 digits"); EnvInt hor_pos = (EnvInt) x; current_env->hpos += hor_pos; - c = next_arg_begin(); + c = next_arg_begin("jump-and-move (character)"); if ((int) c == '\n' || (int) c == EOF) error("character argument expected"); else @@ -1703,10 +1737,8 @@ do_file(const char *filename) { if (npages <= 0) fatal_command(command); - Char c = next_arg_begin(); - if (c == '\n' || c == EOF) - error("missing argument to 'c' command"); - else + Char c = next_arg_begin("c"); + if (c != '\n' && c != EOF) pr->set_ascii_char((unsigned char) c, current_env); break; } @@ -1714,7 +1746,7 @@ do_file(const char *filename) { if (npages <= 0) fatal_command(command); - char *str_arg = get_string_arg(); + char *str_arg = get_string_arg("C"); pr->set_special_char(str_arg, current_env); a_delete str_arg; break; @@ -1725,7 +1757,7 @@ do_file(const char *filename) parse_D_command(); break; case 'f': // f: set font to number - current_env->fontno = get_integer_arg(); + current_env->fontno = get_integer_arg("f"); break; case 'F': // F: obsolete, replaced by 'x F' { @@ -1735,13 +1767,13 @@ do_file(const char *filename) break; } case 'h': // h: relative horizontal move - current_env->hpos += (EnvInt) get_integer_arg(); + current_env->hpos += (EnvInt) get_integer_arg("h"); break; case 'H': // H: absolute horizontal positioning - current_env->hpos = (EnvInt) get_integer_arg(); + current_env->hpos = (EnvInt) get_integer_arg("H"); break; case 'm': // m: glyph color - parse_color_command(current_env->col); + parse_color_command(current_env->col, "m"); pr->change_color(current_env); break; case 'n': // n: print end of line @@ -1749,23 +1781,23 @@ do_file(const char *filename) if (npages <= 0) fatal_command(command); pr->end_of_line(); - (void) get_integer_arg(); - (void) get_integer_arg(); + (void) get_integer_arg("n (first ignored)"); + (void) get_integer_arg("n (second ignored)"); break; case 'N': // N: print char with given int code if (npages <= 0) fatal_command(command); - pr->set_numbered_char(get_integer_arg(), current_env); + pr->set_numbered_char(get_integer_arg("N"), current_env); break; case 'p': // p: start new page with given number if (npages > 0) pr->end_page(current_env->vpos); npages++; // increment # of processed pages - pr->begin_page(get_integer_arg()); + pr->begin_page(get_integer_arg("p")); current_env->vpos = 0; break; case 's': // s: set point size - current_env->size = get_integer_arg(); + current_env->size = get_integer_arg("s"); if (current_env->height == current_env->size) current_env->height = 0; break; @@ -1774,7 +1806,7 @@ do_file(const char *filename) char c; if (npages <= 0) fatal_command(command); - char *str_arg = get_string_arg(); + char *str_arg = get_string_arg("t"); size_t i = 0; while ((c = str_arg[i++]) != '\0') { EnvInt w; @@ -1789,8 +1821,8 @@ do_file(const char *filename) char c; if (npages <= 0) fatal_command(command); - EnvInt kern = (EnvInt) get_integer_arg(); - char *str_arg = get_string_arg(); + EnvInt kern = (EnvInt) get_integer_arg("u"); + char *str_arg = get_string_arg("u"); size_t i = 0; while ((c = str_arg[i++]) != '\0') { EnvInt w; @@ -1801,10 +1833,10 @@ do_file(const char *filename) break; } case 'v': // v: relative vertical move - current_env->vpos += (EnvInt) get_integer_arg(); + current_env->vpos += (EnvInt) get_integer_arg("v"); break; case 'V': // V: absolute vertical positioning - current_env->vpos = (EnvInt) get_integer_arg(); + current_env->vpos = (EnvInt) get_integer_arg("V"); break; case 'w': // w: inform about paddable space break; diff --git a/src/libs/libgroff/errarg.cpp b/src/libs/libgroff/errarg.cpp index 593e2a57..6cb5fd12 100644 --- a/src/libs/libgroff/errarg.cpp +++ b/src/libs/libgroff/errarg.cpp @@ -121,7 +121,7 @@ void errprint(const char *format, arg3.print(); break; default: - assert(0); + assert(0 == "unsupported format specifier given to errprint()"); } } else
signature.asc
Description: PGP signature