",
CellPadding); // CellPadding must be 0, 1, 2, 5 or 10
HTM_TABLE_NestingLevel++;
}
else
HTM_TABLE_BeginWideMargin ();
}
void HTM_TABLE_BeginWideMargin (void)
{
fprintf (Gbl.F.Out,"");
HTM_TABLE_NestingLevel++;
}
void HTM_TABLE_End (void)
{
if (HTM_TABLE_NestingLevel == 0) // No TABLE open
Ale_ShowAlert (Ale_ERROR,"Trying to close unopened TABLE.");
fprintf (Gbl.F.Out,"
");
HTM_TABLE_NestingLevel--;
}
/*****************************************************************************/
/**************************** Start/end table row ****************************/
/*****************************************************************************/
void HTM_TR_Begin (const char *fmt,...)
{
va_list ap;
int NumBytesPrinted;
char *Attr;
if (fmt)
{
if (fmt[0])
{
va_start (ap,fmt);
NumBytesPrinted = vasprintf (&Attr,fmt,ap);
va_end (ap);
if (NumBytesPrinted < 0) // If memory allocation wasn't possible,
// or some other error occurs,
// vasprintf will return -1
Lay_NotEnoughMemoryExit ();
/***** Print HTML *****/
fprintf (Gbl.F.Out,"",Attr);
free ((void *) Attr);
}
else
HTM_TR_BeginWithoutAttr ();
}
else
HTM_TR_BeginWithoutAttr ();
HTM_TR_NestingLevel++;
}
static void HTM_TR_BeginWithoutAttr (void)
{
fprintf (Gbl.F.Out,"
");
}
void HTM_TR_End (void)
{
if (HTM_TR_NestingLevel == 0) // No TR open
Ale_ShowAlert (Ale_ERROR,"Trying to close unopened TR.");
fprintf (Gbl.F.Out,"
");
HTM_TR_NestingLevel--;
}
/*****************************************************************************/
/***************************** Table heading cells ***************************/
/*****************************************************************************/
void HTM_TH (unsigned RowSpan,unsigned ColSpan,const char *Class,const char *Txt)
{
HTM_TH_Begin (RowSpan,ColSpan,Class);
if (Txt)
if (Txt[0])
fprintf (Gbl.F.Out,"%s",Txt);
HTM_TH_End ();
}
void HTM_TH_Begin (unsigned RowSpan,unsigned ColSpan,const char *Class)
{
if (RowSpan > 1 && ColSpan > 1)
{
if (Class)
HTM_TH_BeginAttr ("rowspan=\"%u\" colspan=\"%u\" class=\"%s\"",
RowSpan,ColSpan,Class);
else
HTM_TH_BeginAttr ("rowspan=\"%u\" colspan=\"%u\"",
RowSpan,ColSpan);
}
else if (RowSpan > 1)
{
if (Class)
HTM_TH_BeginAttr ("rowspan=\"%u\" class=\"%s\"",
RowSpan,Class);
else
HTM_TH_BeginAttr ("rowspan=\"%u\"",
RowSpan);
}
else if (ColSpan > 1)
{
if (Class)
HTM_TH_BeginAttr ("colspan=\"%u\" class=\"%s\"",
ColSpan,Class);
else
HTM_TH_BeginAttr ("colspan=\"%u\"",
ColSpan);
}
else
{
if (Class)
HTM_TH_BeginAttr ("class=\"%s\"",
Class);
else
HTM_TH_BeginWithoutAttr ();
}
}
static void HTM_TH_BeginAttr (const char *fmt,...)
{
va_list ap;
int NumBytesPrinted;
char *Attr;
if (fmt)
{
if (fmt[0])
{
va_start (ap,fmt);
NumBytesPrinted = vasprintf (&Attr,fmt,ap);
va_end (ap);
if (NumBytesPrinted < 0) // If memory allocation wasn't possible,
// or some other error occurs,
// vasprintf will return -1
Lay_NotEnoughMemoryExit ();
/***** Print HTML *****/
fprintf (Gbl.F.Out,"",Attr);
free ((void *) Attr);
}
else
HTM_TH_BeginWithoutAttr ();
}
else
HTM_TH_BeginWithoutAttr ();
HTM_TH_NestingLevel++;
}
static void HTM_TH_BeginWithoutAttr (void)
{
fprintf (Gbl.F.Out," | ");
}
void HTM_TH_End (void)
{
if (HTM_TH_NestingLevel == 0) // No TH open
Ale_ShowAlert (Ale_ERROR,"Trying to close unopened TR.");
fprintf (Gbl.F.Out," | ");
HTM_TH_NestingLevel--;
}
void HTM_TH_Empty (unsigned NumColumns)
{
unsigned NumCol;
for (NumCol = 0;
NumCol < NumColumns;
NumCol++)
{
HTM_TH_BeginAttr (NULL);
HTM_TH_End ();
}
}
/*****************************************************************************/
/********************************* Table cells *******************************/
/*****************************************************************************/
void HTM_TD_Begin (const char *fmt,...)
{
va_list ap;
int NumBytesPrinted;
char *Attr;
if (fmt)
{
if (fmt[0])
{
va_start (ap,fmt);
NumBytesPrinted = vasprintf (&Attr,fmt,ap);
va_end (ap);
if (NumBytesPrinted < 0) // If memory allocation wasn't possible,
// or some other error occurs,
// vasprintf will return -1
Lay_NotEnoughMemoryExit ();
/***** Print HTML *****/
fprintf (Gbl.F.Out,"",Attr);
free ((void *) Attr);
}
else
HTM_TD_BeginWithoutAttr ();
}
else
HTM_TD_BeginWithoutAttr ();
HTM_TD_NestingLevel++;
}
static void HTM_TD_BeginWithoutAttr (void)
{
fprintf (Gbl.F.Out," | ");
}
void HTM_TD_End (void)
{
if (HTM_TD_NestingLevel == 0) // No TH open
Ale_ShowAlert (Ale_ERROR,"Trying to close unopened TD.");
fprintf (Gbl.F.Out," | ");
HTM_TD_NestingLevel--;
}
void HTM_TD_Empty (unsigned NumColumns)
{
unsigned NumCol;
for (NumCol = 0;
NumCol < NumColumns;
NumCol++)
{
HTM_TD_Begin (NULL);
HTM_TD_End ();
}
}
void HTM_TD_ColouredEmpty (unsigned NumColumns)
{
unsigned NumCol;
for (NumCol = 0;
NumCol < NumColumns;
NumCol++)
{
HTM_TD_Begin ("class=\"COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_End ();
}
}