예제 #1
0
static int
check_root(CHKARGS) 
{

	if (MAN_BLINE & man->flags)
		man_nmsg(man, n, MANDOCERR_SCOPEEXIT);
	else if (MAN_ELINE & man->flags)
		man_nmsg(man, n, MANDOCERR_SCOPEEXIT);

	man->flags &= ~MAN_BLINE;
	man->flags &= ~MAN_ELINE;

	if (NULL == man->first->child) {
		man_nmsg(man, n, MANDOCERR_NODOCBODY);
		return(0);
	} else if (NULL == man->meta.title) {
		man_nmsg(man, n, MANDOCERR_NOTITLE);

		/*
		 * If a title hasn't been set, do so now (by
		 * implication, date and section also aren't set).
		 */

	        man->meta.title = mandoc_strdup("unknown");
		man->meta.msec = mandoc_strdup("1");
		man->meta.date = mandoc_normdate
			(man->parse, NULL, n->line, n->pos);
	}

	return(1);
}
예제 #2
0
static int
post_vs(CHKARGS)
{

	if (NULL != n->prev)
		return(1);

	switch (n->parent->tok) {
	case (MAN_SH):
		/* FALLTHROUGH */
	case (MAN_SS):
		man_nmsg(man, n, MANDOCERR_IGNPAR);
		/* FALLTHROUGH */
	case (MAN_MAX):
		/* 
		 * Don't warn about this because it occurs in pod2man
		 * and would cause considerable (unfixable) warnage.
		 */
		man_node_delete(man, n);
		break;
	default:
		break;
	}

	return(1);
}
예제 #3
0
static int
post_fi(CHKARGS)
{

	if ( ! (MAN_LITERAL & man->flags))
		man_nmsg(man, n, MANDOCERR_WNOSCOPE);

	man->flags &= ~MAN_LITERAL;
	return(1);
}
예제 #4
0
static int
post_nf(CHKARGS)
{

	if (MAN_LITERAL & man->flags)
		man_nmsg(man, n, MANDOCERR_SCOPEREP);

	man->flags |= MAN_LITERAL;
	return(1);
}
예제 #5
0
static int
post_sec(CHKARGS)
{

	if ( ! (MAN_HEAD == n->type && 0 == n->nchild)) 
		return(1);

	man_nmsg(man, n, MANDOCERR_SYNTARGCOUNT);
	return(0);
}
예제 #6
0
static int
check_par(CHKARGS)
{

	switch (n->type) {
	case (MAN_BLOCK):
		if (0 == n->body->nchild)
			man_node_delete(man, n);
		break;
	case (MAN_BODY):
		if (0 == n->nchild)
			man_nmsg(man, n, MANDOCERR_IGNPAR);
		break;
	case (MAN_HEAD):
		if (n->nchild)
			man_nmsg(man, n, MANDOCERR_ARGSLOST);
		break;
	default:
		break;
	}

	return(1);
}
예제 #7
0
/*
 * Warn when "n" is an explicit non-roff macro.
 */
static void
rew_warn(struct man *man, struct man_node *n, enum mandocerr er)
{

	if (er == MANDOCERR_MAX || MAN_BLOCK != n->type)
		return;
	if (MAN_VALID & n->flags)
		return;
	if ( ! (MAN_EXPLICIT & man_macros[n->tok].flags))
		return;

	assert(er < MANDOCERR_FATAL);
	man_nmsg(man, n, er);
}
예제 #8
0
static int
post_IP(CHKARGS)
{

	switch (n->type) {
	case (MAN_BLOCK):
		if (0 == n->head->nchild && 0 == n->body->nchild)
			man_node_delete(man, n);
		break;
	case (MAN_BODY):
		if (0 == n->parent->head->nchild && 0 == n->nchild)
			man_nmsg(man, n, MANDOCERR_IGNPAR);
		break;
	default:
		break;
	}
	return(1);
}
예제 #9
0
static int
post_TH(CHKARGS)
{
	const char	*p;
	int		 line, pos;

	free(man->meta.title);
	free(man->meta.vol);
	free(man->meta.source);
	free(man->meta.msec);
	free(man->meta.date);

	line = n->line;
	pos = n->pos;
	man->meta.title = man->meta.vol = man->meta.date =
		man->meta.msec = man->meta.source = NULL;

	/* ->TITLE<- MSEC DATE SOURCE VOL */

	n = n->child;
	if (n && n->string) {
		for (p = n->string; '\0' != *p; p++) {
			/* Only warn about this once... */
			if (isalpha((unsigned char)*p) && 
					! isupper((unsigned char)*p)) {
				man_nmsg(man, n, MANDOCERR_UPPERCASE);
				break;
			}
		}
		man->meta.title = mandoc_strdup(n->string);
	} else
		man->meta.title = mandoc_strdup("");

	/* TITLE ->MSEC<- DATE SOURCE VOL */

	if (n)
		n = n->next;
	if (n && n->string)
		man->meta.msec = mandoc_strdup(n->string);
	else
		man->meta.msec = mandoc_strdup("");

	/* TITLE MSEC ->DATE<- SOURCE VOL */

	if (n)
		n = n->next;
	if (n && n->string && '\0' != n->string[0]) {
		pos = n->pos;
		man->meta.date = mandoc_normdate
		    (man->parse, n->string, line, pos);
	} else
		man->meta.date = mandoc_strdup("");

	/* TITLE MSEC DATE ->SOURCE<- VOL */

	if (n && (n = n->next))
		man->meta.source = mandoc_strdup(n->string);

	/* TITLE MSEC DATE SOURCE ->VOL<- */
	/* If missing, use the default VOL name for MSEC. */

	if (n && (n = n->next))
		man->meta.vol = mandoc_strdup(n->string);
	else if ('\0' != man->meta.msec[0] &&
	    (NULL != (p = mandoc_a2msec(man->meta.msec))))
		man->meta.vol = mandoc_strdup(p);

	/*
	 * Remove the `TH' node after we've processed it for our
	 * meta-data.
	 */
	man_node_delete(man, man->last);
	return(1);
}