2019-07-22 20:32:33 +00:00
|
|
|
/* #includes */ /*{{{C}}}*//*{{{*/
|
|
|
|
#ifndef NO_POSIX_SOURCE
|
|
|
|
#undef _POSIX_SOURCE
|
|
|
|
#define _POSIX_SOURCE 1
|
|
|
|
#undef _POSIX_C_SOURCE
|
|
|
|
#define _POSIX_C_SOURCE 2
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef DMALLOC
|
|
|
|
#include "dmalloc.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <assert.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <limits.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
|
|
|
#include "context.h"
|
|
|
|
#include "main.h"
|
|
|
|
#include "misc.h"
|
|
|
|
/*}}}*/
|
|
|
|
|
|
|
|
/* savecontext -- save as ConTeXt table */ /*{{{*/
|
2019-07-27 04:14:26 +00:00
|
|
|
const char *savecontext(Sheet *sheet, const char *name, int body,
|
|
|
|
const Location beg, const Location end,
|
|
|
|
unsigned int *count)
|
2019-07-22 20:32:33 +00:00
|
|
|
{
|
|
|
|
/* variables */ /*{{{*/
|
|
|
|
FILE *fp=(FILE*)0; /* cause runtime error */
|
2019-07-27 04:14:26 +00:00
|
|
|
Location w;
|
2019-07-22 20:32:33 +00:00
|
|
|
char buf[1024];
|
|
|
|
char num[20];
|
|
|
|
char fullname[PATH_MAX];
|
|
|
|
/*}}}*/
|
|
|
|
|
|
|
|
/* asserts */ /*{{{*/
|
2019-07-27 04:14:26 +00:00
|
|
|
assert(sheet != (Sheet*)0);
|
|
|
|
assert(name != (const char*)0);
|
2019-07-22 20:32:33 +00:00
|
|
|
/*}}}*/
|
|
|
|
*count=0;
|
2019-07-27 04:14:26 +00:00
|
|
|
w[X] = beg[X];
|
|
|
|
for (w[Z]=beg[Z]; w[Z]<=end[Z]; ++(w[Z]))
|
|
|
|
for (w[Y]=beg[Y]; w[Y]<=end[Y]; ++(w[Y]))
|
2019-09-03 08:41:37 +00:00
|
|
|
if (shadowed(sheet, w)) return _("Shadowed cells in first column");
|
2019-07-22 20:32:33 +00:00
|
|
|
if (!body && (fp=fopen(name,"w"))==(FILE*)0) return strerror(errno);
|
2019-07-27 04:14:26 +00:00
|
|
|
for (w[Z]=beg[Z]; w[Z]<=end[Z]; ++(w[Z]))
|
2019-07-22 20:32:33 +00:00
|
|
|
{
|
|
|
|
if (body)
|
|
|
|
/* open new file */ /*{{{*/
|
|
|
|
{
|
2019-07-27 04:14:26 +00:00
|
|
|
sprintf(num, ".%d", w[Z]);
|
2019-07-22 20:32:33 +00:00
|
|
|
|
|
|
|
fullname[sizeof(fullname)-strlen(num)-1]='\0';
|
|
|
|
(void)strncpy(fullname,name,sizeof(fullname)-strlen(num)-1);
|
|
|
|
fullname[sizeof(fullname)-1]='\0';
|
|
|
|
(void)strncat(fullname,num,sizeof(fullname)-strlen(num)-1);
|
|
|
|
fullname[sizeof(fullname)-1]='\0';
|
|
|
|
if ((fp=fopen(fullname,"w"))==(FILE*)0) return strerror(errno);
|
|
|
|
}
|
|
|
|
/*}}}*/
|
|
|
|
else
|
|
|
|
/* print header */ /*{{{*/
|
2019-07-27 04:14:26 +00:00
|
|
|
if (w[Z] == beg[Z])
|
2019-07-22 20:32:33 +00:00
|
|
|
{
|
|
|
|
if (fputs_close("\\starttext\n",fp)==EOF) return strerror(errno);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (fputs_close("\\page\n",fp)==EOF) return strerror(errno);
|
|
|
|
}
|
|
|
|
/*}}}*/
|
|
|
|
|
|
|
|
/* print bogus format */ /*{{{*/
|
|
|
|
fprintf(fp,"\\starttable[");
|
2019-07-27 04:14:26 +00:00
|
|
|
for (w[X]=beg[X]; w[X]<=end[X]; ++(w[X]))
|
|
|
|
if (fputs_close("|l",fp)==EOF) return strerror(errno);
|
2019-07-22 20:32:33 +00:00
|
|
|
fprintf(fp,"|]\n");
|
|
|
|
/*}}}*/
|
2019-07-27 04:14:26 +00:00
|
|
|
for (w[Y]=beg[Y]; w[Y]<=end[Y]; ++(w[Y]))
|
2019-07-22 20:32:33 +00:00
|
|
|
/* print contents */ /*{{{*/
|
|
|
|
{
|
2019-07-27 04:14:26 +00:00
|
|
|
for (w[X]=beg[X]; w[X]<=end[X]; )
|
2019-07-22 20:32:33 +00:00
|
|
|
{
|
2019-09-03 08:41:37 +00:00
|
|
|
if (w[X] > beg[X] && fputs_close("\\NC", fp) == EOF)
|
|
|
|
return strerror(errno);
|
|
|
|
Location mw; LOCATION_GETS(mw, w);
|
2019-09-05 07:24:24 +00:00
|
|
|
for (++(mw[X]); ((size_t)mw[X]) < sheet->dim[X] && shadowed(sheet, mw);
|
|
|
|
++(mw[X]));
|
2019-09-03 08:41:37 +00:00
|
|
|
int multicols = mw[X] - w[X];
|
|
|
|
if (multicols > 1) fprintf(fp,"\\use{%d}", multicols);
|
|
|
|
Style cs = getstyle(sheet, w);
|
|
|
|
switch (cs.adjust)
|
2019-07-22 20:32:33 +00:00
|
|
|
{
|
2019-09-03 08:41:37 +00:00
|
|
|
case LEFT:
|
|
|
|
if (fputs_close("\\JustLeft ", fp) == EOF) return strerror(errno);
|
2019-09-09 14:33:41 +00:00
|
|
|
break;
|
2019-09-03 08:41:37 +00:00
|
|
|
case RIGHT:
|
|
|
|
if (fputs_close("\\JustRight ", fp) == EOF) return strerror(errno);
|
2019-09-09 14:33:41 +00:00
|
|
|
break;
|
2019-09-03 08:41:37 +00:00
|
|
|
case CENTER:
|
|
|
|
if (fputs_close("\\JustCenter ", fp) == EOF) return strerror(errno);
|
2019-09-09 14:33:41 +00:00
|
|
|
break;
|
2019-07-22 20:32:33 +00:00
|
|
|
default: assert(0);
|
|
|
|
}
|
2019-09-03 08:41:37 +00:00
|
|
|
printvalue(buf, sizeof(buf), 0, DIRECT_STRING, cs.fform, cs.precision,
|
|
|
|
sheet, w);
|
2019-07-22 20:32:33 +00:00
|
|
|
/* if (fputs_close("}{",fp)==EOF) return strerror(errno);*/
|
2019-09-03 08:41:37 +00:00
|
|
|
if (cs.transparent)
|
2019-07-22 20:32:33 +00:00
|
|
|
{
|
2019-09-03 08:41:37 +00:00
|
|
|
if (fputs_close(buf,fp) == EOF) return strerror(errno);
|
2019-07-22 20:32:33 +00:00
|
|
|
}
|
2019-09-03 08:41:37 +00:00
|
|
|
else for (char *bufp = buf; *bufp; ++bufp) switch (*bufp)
|
2019-07-22 20:32:33 +00:00
|
|
|
{
|
|
|
|
case '%':
|
|
|
|
case '$':
|
|
|
|
case '&':
|
|
|
|
case '#':
|
|
|
|
case '_':
|
|
|
|
case '{':
|
|
|
|
case '}':
|
|
|
|
case '~':
|
|
|
|
case '^': if (fputc_close('\\',fp)==EOF || fputc_close(*bufp,fp)==EOF) return strerror(errno); break;
|
|
|
|
case '\\': if (fputs_close("\\backslash ",fp)==EOF) return strerror(errno); break;
|
|
|
|
default: if (fputc_close(*bufp,fp)==EOF) return strerror(errno);
|
|
|
|
}
|
|
|
|
/* if (fputc_close('}',fp)==EOF) return strerror(errno);*/
|
2019-07-27 04:14:26 +00:00
|
|
|
w[X] += multicols;
|
2019-07-22 20:32:33 +00:00
|
|
|
++*count;
|
|
|
|
}
|
2019-07-27 04:14:26 +00:00
|
|
|
if (fputs_close(w[Y]<end[Y] ? "\\MR\n" : "\n\\stoptable\n",fp)==EOF) return strerror(errno);
|
2019-07-22 20:32:33 +00:00
|
|
|
}
|
|
|
|
/*}}}*/
|
|
|
|
if (body)
|
|
|
|
{
|
|
|
|
if (fclose(fp)==EOF) return strerror(errno);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (fputs_close("\n",fp)==EOF) return strerror(errno);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!body)
|
|
|
|
{
|
|
|
|
if (fputs_close("\\stoptext\n",fp)==EOF) return strerror(errno);
|
|
|
|
if (fclose(fp)==EOF) return strerror(errno);
|
|
|
|
}
|
|
|
|
return (const char*)0;
|
|
|
|
}
|
|
|
|
/*}}}*/
|