/* Functions: do_map_header, read_header_file
**
** Author: Paul W. Carlson	April 1992
*/

#include <unistd.h>
#include <string.h>
#include "header.h"
#include "ps_info.h"
#include "local_proto.h"

static double x, y, dy, fontsize;
static int append(char,char *);
static int apply(char *,char *,char *);
static char *get_format(char *,char *);
static int output(char *,char *);

int do_map_header (char *date)
{
    char temp[100];

    /* set color and font */
    set_rgb_color(hdr.color);
    fontsize = (double)hdr.fontsize;
    fprintf(PS.fp, "(%s) FN %.1f SF\n", hdr.font, fontsize);

    /* set start of first line */
    dy = 1.2 * fontsize;
    y = 72.0 * (PS.page_height - PS.top_marg) - fontsize - 1.5;

    if (hdr.fp == NULL)
    {

    	if (PS.celltitle[0])
    	{
	    fprintf(PS.fp, "/t (TITLE:  %s) def\n", PS.celltitle);
	    fprintf(PS.fp, "t SW pop %.1f XS D2 t exch %.1f MS\n", 
		72 * PS.page_width, y);
	    y -= dy;
	}
    	strcpy(temp, G_myname());
    	G_strip(temp);
    	if (*temp == 0) strcpy(temp, G_location());
	fprintf(PS.fp, "/t (LOCATION:  %s) def\n", temp);
	fprintf(PS.fp, "t SW pop %.1f XS D2 t exch %.1f MS\n", 
	    72 * PS.page_width, y);
	y -= 0.25 * dy;
    	if (PS.min_y > y) PS.min_y = y;
	return 0;
    }
	    
    x = 72.0 * PS.left_marg + 1.5;
    read_header_file(date);
    y -= 0.25 * dy;
    if (PS.min_y > y) PS.min_y = y;

    return 0;
}

    
int read_header_file(char *date)
{
    char buf[1024];

    while (G_getl2(buf, sizeof buf, hdr.fp)) output(buf, date);
    fclose (hdr.fp);

    return 0;
}


static int output(char *line,char *date)
{
    char text[1024];
    char fmt[30];
    char *buf;

    buf = line;
    *text = 0;
    while (*buf)
    {
	if (*buf == '%')
	{
	    buf++;
	    if (*buf == '%') strcat (text, "%");
	    else if (*buf == 'n')
	    {
		if (*text) show_text(x, y, text);
		y -= dy;
		return 0;
	    }
	    else if (*buf == '_')
	    {
		fprintf(PS.fp, "BW ");
		draw_line(x, y + 0.2 * fontsize,
			  72.0 * (PS.page_width - PS.right_marg), 
			  y + 0.2 * fontsize);
		y -= dy;
		return 0;
	    }
	    else
	    {
		buf = get_format(buf, fmt);
		append('s', fmt);
		switch(*buf)
		{
		    case 'd': apply(date,          fmt, text); break;
		    case 'l': apply(G_location(),  fmt, text); break;
		    case 'L': apply(G_myname(),    fmt, text); break;
		    case 'c': 
			    if (PS.cell_fd >= 0)
			    {
			        char name[100];

			        sprintf(name, "<%s> in mapset <%s>",
				    PS.cell_name, PS.cell_mapset);
			        apply(name,        fmt, text);
			    }
			    else apply("none",     fmt, text);
			    break;
		    case 'm': apply(G_mapset(),    fmt, text); break;
		    case 'u': apply(G_whoami(),    fmt, text); break;
		    case 'x': apply(G_mask_info(), fmt, text); break;
		    case 0: continue;
		}
	    }
	}
	else append(*buf, text);
	buf++;
    }
    if (*text) show_text(x, y, text);
    y -= dy;

    return 0;
}


static char *get_format(char *buf,char *fmt)
{
    strcpy(fmt, "%");
    if (*buf == '-')
    {
	append(*buf++, fmt);
	if (*buf < '1' || *buf > '9') return(buf - 1);
    }
    while (*buf >= '0' && *buf <= '9') append(*buf++, fmt);
    return buf;
}


static int append(char c,char *buf)
{
    while (*buf) buf++;
    *buf++ = c;
    *buf = 0;

    return 0;
}

static int apply(char *buf,char *fmt,char *text)
{
    char temp[300];

    sprintf(temp, fmt, buf);
    strcat(text, temp);

    return 0;
}
