version 1.155, 2010/07/01 23:01:47 |
version 1.160, 2010/08/07 20:33:55 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv> |
|
* Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
* purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
|
|
#include <time.h> |
#include <time.h> |
|
|
#include "mandoc.h" |
#include "mandoc.h" |
#include "regs.h" |
|
#include "libmdoc.h" |
#include "libmdoc.h" |
#include "libmandoc.h" |
#include "libmandoc.h" |
|
|
|
|
mdoc_node_free(struct mdoc_node *p) |
mdoc_node_free(struct mdoc_node *p) |
{ |
{ |
|
|
|
/* |
|
* XXX: if these end up being problematic in terms of memory |
|
* management and dereferencing freed blocks, then make them |
|
* into reference-counted double-pointers. |
|
*/ |
|
|
if (MDOC_Bd == p->tok && MDOC_BLOCK == p->type) |
if (MDOC_Bd == p->tok && MDOC_BLOCK == p->type) |
if (p->data.Bd) |
if (p->data.Bd) |
free(p->data.Bd); |
free(p->data.Bd); |
if (MDOC_Bl == p->tok && MDOC_BLOCK == p->type) |
if (MDOC_Bl == p->tok && MDOC_BLOCK == p->type) |
if (p->data.Bl) |
if (p->data.Bl) |
free(p->data.Bl); |
free(p->data.Bl); |
|
if (MDOC_Bf == p->tok && MDOC_HEAD == p->type) |
|
if (p->data.Bf) |
|
free(p->data.Bf); |
|
|
if (p->string) |
if (p->string) |
free(p->string); |
free(p->string); |
Line 712 mdoc_ptext(struct mdoc *m, int line, char *buf, int of |
|
Line 721 mdoc_ptext(struct mdoc *m, int line, char *buf, int of |
|
|
|
assert(buf < end); |
assert(buf < end); |
|
|
if (mandoc_eos(buf+offs, (size_t)(end-buf-offs))) |
if (mandoc_eos(buf+offs, (size_t)(end-buf-offs), 0)) |
m->last->flags |= MDOC_EOS; |
m->last->flags |= MDOC_EOS; |
|
|
return(1); |
return(1); |
Line 755 mdoc_pmacro(struct mdoc *m, int ln, char *buf, int off |
|
Line 764 mdoc_pmacro(struct mdoc *m, int ln, char *buf, int off |
|
|
|
i = offs; |
i = offs; |
|
|
/* Accept whitespace after the initial control char. */ |
/* Accept tabs/whitespace after the initial control char. */ |
|
|
if (' ' == buf[i]) { |
if (' ' == buf[i] || '\t' == buf[i]) { |
i++; |
i++; |
while (buf[i] && ' ' == buf[i]) |
while (buf[i] && (' ' == buf[i] || '\t' == buf[i])) |
i++; |
i++; |
if ('\0' == buf[i]) |
if ('\0' == buf[i]) |
return(1); |
return(1); |
Line 767 mdoc_pmacro(struct mdoc *m, int ln, char *buf, int off |
|
Line 776 mdoc_pmacro(struct mdoc *m, int ln, char *buf, int off |
|
|
|
sv = i; |
sv = i; |
|
|
/* Copy the first word into a nil-terminated buffer. */ |
/* |
|
* Copy the first word into a nil-terminated buffer. Stop |
|
* copying when a tab, space, or eoln is encountered. |
|
*/ |
|
|
for (j = 0; j < 4; j++, i++) { |
for (j = 0; j < 4; j++, i++) { |
if ('\0' == (mac[j] = buf[i])) |
if ('\0' == (mac[j] = buf[i])) |
break; |
break; |
else if (' ' == buf[i]) |
else if (' ' == buf[i] || '\t' == buf[i]) |
break; |
break; |
|
|
/* Check for invalid characters. */ |
/* Check for invalid characters. */ |
|
/* TODO: remove me, already done in main.c. */ |
|
|
if (isgraph((u_char)buf[i])) |
if (isgraph((u_char)buf[i])) |
continue; |
continue; |
Line 798 mdoc_pmacro(struct mdoc *m, int ln, char *buf, int off |
|
Line 811 mdoc_pmacro(struct mdoc *m, int ln, char *buf, int off |
|
return(1); |
return(1); |
} |
} |
|
|
/* The macro is sane. Jump to the next word. */ |
/* Disregard the first trailing tab, if applicable. */ |
|
|
|
if ('\t' == buf[i]) |
|
i++; |
|
|
|
/* Jump to the next non-whitespace word. */ |
|
|
while (buf[i] && ' ' == buf[i]) |
while (buf[i] && ' ' == buf[i]) |
i++; |
i++; |