projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix assertion for proper Huffman merge pattern: 0 == 1 modulo 1.
[pspp]
/
src
/
ascii.c
diff --git
a/src/ascii.c
b/src/ascii.c
index bdaac410566cdf55a5ef26e7bb0e4a319ac6db31..4a30663fa452df1fa9ef46e24708e87940a71fd7 100644
(file)
--- a/
src/ascii.c
+++ b/
src/ascii.c
@@
-184,22
+184,29
@@
struct ascii_driver_ext
#endif
};
#endif
};
-static struct pool *ascii_pool;
-
static int postopen (struct file_ext *);
static int preclose (struct file_ext *);
static int postopen (struct file_ext *);
static int preclose (struct file_ext *);
+static struct outp_option_info *option_info;
+
static int
ascii_open_global (struct outp_class *this UNUSED)
{
static int
ascii_open_global (struct outp_class *this UNUSED)
{
- ascii_pool = pool_create ();
+ option_info = xmalloc ( sizeof (struct outp_option_info ) ) ;
+ option_info->initial = 0;
+ option_info->options = 0;
return 1;
}
return 1;
}
+
+static unsigned char *s=0;
static int
ascii_close_global (struct outp_class *this UNUSED)
{
static int
ascii_close_global (struct outp_class *this UNUSED)
{
- pool_destroy (ascii_pool);
+ free(option_info->initial);
+ free(option_info->options);
+ free(option_info);
+ free(s);
return 1;
}
return 1;
}
@@
-288,11
+295,11
@@
ascii_postopen_driver (struct outp_driver *this)
this->length = x->l * this->vert;
if (ls_null_p (&x->ops[OPS_FORMFEED]))
this->length = x->l * this->vert;
if (ls_null_p (&x->ops[OPS_FORMFEED]))
- ls_create (
ascii_pool,
&x->ops[OPS_FORMFEED], "\f");
+ ls_create (&x->ops[OPS_FORMFEED], "\f");
if (ls_null_p (&x->ops[OPS_NEWLINE])
if (ls_null_p (&x->ops[OPS_NEWLINE])
- || !strcmp (ls_
value
(&x->ops[OPS_NEWLINE]), "default"))
+ || !strcmp (ls_
c_str
(&x->ops[OPS_NEWLINE]), "default"))
{
{
- ls_create (
ascii_pool,
&x->ops[OPS_NEWLINE], "\n");
+ ls_create (&x->ops[OPS_NEWLINE], "\n");
x->file.mode = "wt";
}
x->file.mode = "wt";
}
@@
-351,7
+358,7
@@
ascii_postopen_driver (struct outp_driver *this)
c[0] = '+';
break;
}
c[0] = '+';
break;
}
- ls_create (
ascii_pool,
&x->box[i], c);
+ ls_create (&x->box[i], c);
}
}
}
}
@@
-389,11
+396,18
@@
static int
ascii_close_driver (struct outp_driver *this)
{
struct ascii_driver_ext *x = this->ext;
ascii_close_driver (struct outp_driver *this)
{
struct ascii_driver_ext *x = this->ext;
+ int i;
assert (this->driver_open == 1);
msg (VM (2), _("%s: Beginning closing..."), this->name);
x = this->ext;
assert (this->driver_open == 1);
msg (VM (2), _("%s: Beginning closing..."), this->name);
x = this->ext;
+ for (i = 0; i < OPS_COUNT; i++)
+ ls_destroy (&x->ops[i]);
+ for (i = 0; i < LNS_COUNT; i++)
+ ls_destroy (&x->box[i]);
+ for (i = 0; i < FSTY_COUNT; i++)
+ ls_destroy (&x->fonts[i]);
if (x->lines != NULL)
{
int line;
if (x->lines != NULL)
{
int line;
@@
-452,7
+466,6
@@
static struct outp_option option_tab[] =
{"squeeze", boolean_arg, 2},
{"", 0, 0},
};
{"squeeze", boolean_arg, 2},
{"", 0, 0},
};
-static struct outp_option_info option_info;
static void
ascii_option (struct outp_driver *this, const char *key,
static void
ascii_option (struct outp_driver *this, const char *key,
@@
-462,7
+475,7
@@
ascii_option (struct outp_driver *this, const char *key,
int cat, subcat;
const char *value;
int cat, subcat;
const char *value;
- value = ds_
value
(val);
+ value = ds_
c_str
(val);
if (!strncmp (key, "box[", 4))
{
char *tail;
if (!strncmp (key, "box[", 4))
{
char *tail;
@@
-476,11
+489,11
@@
ascii_option (struct outp_driver *this, const char *key,
}
if (!ls_null_p (&x->box[indx]))
msg (SW, _("Duplicate value for key `%s'."), key);
}
if (!ls_null_p (&x->box[indx]))
msg (SW, _("Duplicate value for key `%s'."), key);
- ls_create (
ascii_pool,
&x->box[indx], value);
+ ls_create (&x->box[indx], value);
return;
}
return;
}
- cat = outp_match_keyword (key, option_tab,
&
option_info, &subcat);
+ cat = outp_match_keyword (key, option_tab, option_info, &subcat);
switch (cat)
{
case 0:
switch (cat)
{
case 0:
@@
-605,17
+618,17
@@
ascii_option (struct outp_driver *this, const char *key,
assert (0);
abort ();
}
assert (0);
abort ();
}
- ls_create (
ascii_pool,
s, value);
+ ls_create (s, value);
}
break;
case font_string_arg:
{
if (!strcmp (value, "overstrike"))
{
}
break;
case font_string_arg:
{
if (!strcmp (value, "overstrike"))
{
- ls_destroy (
ascii_pool,
&x->fonts[subcat]);
+ ls_destroy (&x->fonts[subcat]);
return;
}
return;
}
- ls_create (
ascii_pool,
&x->fonts[subcat], value);
+ ls_create (&x->fonts[subcat], value);
}
break;
case boolean_arg:
}
break;
case boolean_arg:
@@
-659,7
+672,7
@@
postopen (struct file_ext *f)
struct ascii_driver_ext *x = f->param;
struct len_string *s = &x->ops[OPS_INIT];
struct ascii_driver_ext *x = f->param;
struct len_string *s = &x->ops[OPS_INIT];
- if (!ls_empty_p (s) && fwrite (ls_
value
(s), ls_length (s), 1, f->file) < 1)
+ if (!ls_empty_p (s) && fwrite (ls_
c_str
(s), ls_length (s), 1, f->file) < 1)
{
msg (ME, _("ASCII output driver: %s: %s"),
f->filename, strerror (errno));
{
msg (ME, _("ASCII output driver: %s: %s"),
f->filename, strerror (errno));
@@
-674,7
+687,7
@@
preclose (struct file_ext *f)
struct ascii_driver_ext *x = f->param;
struct len_string *d = &x->ops[OPS_DONE];
struct ascii_driver_ext *x = f->param;
struct len_string *d = &x->ops[OPS_DONE];
- if (!ls_empty_p (d) && fwrite (ls_
value
(d), ls_length (d), 1, f->file) < 1)
+ if (!ls_empty_p (d) && fwrite (ls_
c_str
(d), ls_length (d), 1, f->file) < 1)
{
msg (ME, _("ASCII output driver: %s: %s"),
f->filename, strerror (errno));
{
msg (ME, _("ASCII output driver: %s: %s"),
f->filename, strerror (errno));
@@
-971,7
+984,7
@@
delineate (struct outp_driver *this, struct outp_text *t, int draw)
int max_y;
/* Current position in string, character following end of string. */
int max_y;
/* Current position in string, character following end of string. */
- const char *s = ls_
value
(&t->s);
+ const char *s = ls_
c_str
(&t->s);
const char *end = ls_end (&t->s);
/* Temporary struct outp_text to pass to low-level function. */
const char *end = ls_end (&t->s);
/* Temporary struct outp_text to pass to low-level function. */
@@
-1103,7
+1116,7
@@
text_draw (struct outp_driver *this, struct outp_text *t)
int x = t->x;
int y = t->y;
int x = t->x;
int y = t->y;
- char *s = ls_
value
(&t->s);
+ char *s = ls_
c_str
(&t->s);
/* Expand the line with the assumption that S takes up LEN character
spaces (sometimes it takes up less). */
/* Expand the line with the assumption that S takes up LEN character
spaces (sometimes it takes up less). */
@@
-1201,7
+1214,7
@@
output_shorts (struct outp_driver *this,
if (remaining >= len)
{
if (remaining >= len)
{
- memcpy (line_p, ls_
value
(box), len);
+ memcpy (line_p, ls_
c_str
(box), len);
line_p += len;
remaining -= len;
}
line_p += len;
remaining -= len;
}
@@
-1209,7
+1222,7
@@
output_shorts (struct outp_driver *this,
{
if (!commit_line_buf (this))
return 0;
{
if (!commit_line_buf (this))
return 0;
- output_string (this, ls_
value
(box), ls_end (box));
+ output_string (this, ls_
c_str
(box), ls_end (box));
remaining = LINE_BUF_SIZE - (line_p - line_buf);
}
}
remaining = LINE_BUF_SIZE - (line_p - line_buf);
}
}
@@
-1426,7
+1439,7
@@
output_lines (struct outp_driver *this, int first, int count)
abort ();
}
if (off)
abort ();
}
if (off)
- output_string (this, ls_
value
(off), ls_end (off));
+ output_string (this, ls_
c_str
(off), ls_end (off));
}
/* Turn on new font. */
}
/* Turn on new font. */
@@
-1451,7
+1464,7
@@
output_lines (struct outp_driver *this, int first, int count)
abort ();
}
if (on)
abort ();
}
if (on)
- output_string (this, ls_
value
(on), ls_end (on));
+ output_string (this, ls_
c_str
(on), ls_end (on));
}
ep = bp + 1;
}
ep = bp + 1;
@@
-1510,14
+1523,14
@@
output_lines (struct outp_driver *this, int first, int count)
}
}
}
}
- output_string (this, ls_
value
(newline), ls_end (newline));
+ output_string (this, ls_
c_str
(newline), ls_end (newline));
}
}
}
}
+
static int
ascii_close_page (struct outp_driver *this)
{
static int
ascii_close_page (struct outp_driver *this)
{
- static unsigned char *s;
static int s_len;
struct ascii_driver_ext *x = this->ext;
static int s_len;
struct ascii_driver_ext *x = this->ext;
@@
-1542,7
+1555,7
@@
ascii_close_page (struct outp_driver *this)
}
for (cp = s, i = 0; i < x->top_margin; i++)
{
}
for (cp = s, i = 0; i < x->top_margin; i++)
{
- memcpy (cp, ls_
value
(&x->ops[OPS_NEWLINE]), nl_len);
+ memcpy (cp, ls_
c_str
(&x->ops[OPS_NEWLINE]), nl_len);
cp += nl_len;
}
output_string (this, s, &s[total_len]);
cp += nl_len;
}
output_string (this, s, &s[total_len]);
@@
-1572,7
+1585,7
@@
ascii_close_page (struct outp_driver *this)
len = min ((int) strlen (outp_title), x->w);
memcpy (s, outp_title, len);
}
len = min ((int) strlen (outp_title), x->w);
memcpy (s, outp_title, len);
}
- memcpy (&s[x->w], ls_
value
(&x->ops[OPS_NEWLINE]), nl_len);
+ memcpy (&s[x->w], ls_
c_str
(&x->ops[OPS_NEWLINE]), nl_len);
output_string (this, s, &s[total_len]);
memset (s, ' ', x->w);
output_string (this, s, &s[total_len]);
memset (s, ' ', x->w);
@@
-1585,7
+1598,7
@@
ascii_close_page (struct outp_driver *this)
len = min ((int) strlen (string), x->w);
memcpy (s, string, len);
}
len = min ((int) strlen (string), x->w);
memcpy (s, string, len);
}
- memcpy (&s[x->w], ls_
value
(&x->ops[OPS_NEWLINE]), nl_len);
+ memcpy (&s[x->w], ls_
c_str
(&x->ops[OPS_NEWLINE]), nl_len);
output_string (this, s, &s[total_len]);
output_string (this, &s[x->w], &s[total_len]);
}
output_string (this, s, &s[total_len]);
output_string (this, &s[x->w], &s[total_len]);
}
@@
-1600,14
+1613,19
@@
ascii_close_page (struct outp_driver *this)
s = xrealloc (s, total_len);
for (cp = s, i = 0; i < x->bottom_margin; i++)
{
s = xrealloc (s, total_len);
for (cp = s, i = 0; i < x->bottom_margin; i++)
{
- memcpy (cp, ls_
value
(&x->ops[OPS_NEWLINE]), nl_len);
+ memcpy (cp, ls_
c_str
(&x->ops[OPS_NEWLINE]), nl_len);
cp += nl_len;
}
cp += nl_len;
}
- memcpy (cp, ls_
value
(&x->ops[OPS_FORMFEED]), ff_len);
+ memcpy (cp, ls_
c_str
(&x->ops[OPS_FORMFEED]), ff_len);
if ( x->paginate )
output_string (this, s, &s[total_len]);
if ( x->paginate )
output_string (this, s, &s[total_len]);
+
if (line_p != line_buf && !commit_line_buf (this))
if (line_p != line_buf && !commit_line_buf (this))
+ {
+ free(s);
+ s=0;
return 0;
return 0;
+ }
this->page_open = 0;
return 1;
this->page_open = 0;
return 1;