version 1.3, 2008/12/03 19:21:58 |
version 1.5, 2008/12/04 19:31:57 |
|
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
* PERFORMANCE OF THIS SOFTWARE. |
* PERFORMANCE OF THIS SOFTWARE. |
*/ |
*/ |
|
#include <assert.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
|
|
|
ml_nputstring(struct md_mbuf *p, |
ml_nputstring(struct md_mbuf *p, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
int i; |
int i, v; |
|
const char *seq; |
|
size_t ssz; |
|
|
for (i = 0; i < (int)sz; i++) { |
for (i = 0; i < (int)sz; i++) { |
switch (buf[i]) { |
switch (buf[i]) { |
case ('&'): |
|
if ( ! ml_nputs(p, "&", 5, pos)) |
/* Escaped value. */ |
|
case ('\\'): |
|
if (-1 == (v = rofftok_scan(buf, &i))) { |
|
/* TODO: error. */ |
return(0); |
return(0); |
|
} |
|
|
|
switch (v) { |
|
case (ROFFTok_Sp_A): |
|
seq = "\\a"; |
|
ssz = 2; |
|
break; |
|
case (ROFFTok_Sp_B): |
|
seq = "\\b"; |
|
ssz = 2; |
|
break; |
|
case (ROFFTok_Sp_F): |
|
seq = "\\f"; |
|
ssz = 2; |
|
break; |
|
case (ROFFTok_Sp_N): |
|
seq = "\\n"; |
|
ssz = 2; |
|
break; |
|
case (ROFFTok_Sp_R): |
|
seq = "\\r"; |
|
ssz = 2; |
|
break; |
|
case (ROFFTok_Sp_T): |
|
seq = "\\t"; |
|
ssz = 2; |
|
break; |
|
case (ROFFTok_Sp_V): |
|
seq = "\\v"; |
|
ssz = 2; |
|
break; |
|
case (ROFFTok_Sp_0): |
|
seq = "\\0"; |
|
ssz = 2; |
|
break; |
|
case (ROFFTok_Space): |
|
seq = " "; |
|
ssz = 6; |
|
break; |
|
case (ROFFTok_Hyphen): |
|
seq = "‐"; |
|
ssz = 7; |
|
break; |
|
case (ROFFTok_Em): |
|
seq = "—"; |
|
ssz = 7; |
|
break; |
|
case (ROFFTok_En): |
|
seq = "–"; |
|
ssz = 7; |
|
break; |
|
case (ROFFTok_Ge): |
|
seq = "≥"; |
|
ssz = 7; |
|
break; |
|
case (ROFFTok_Le): |
|
seq = "≤"; |
|
ssz = 7; |
|
break; |
|
case (ROFFTok_Rquote): |
|
seq = "”"; |
|
ssz = 7; |
|
break; |
|
case (ROFFTok_Lquote): |
|
seq = "“"; |
|
ssz = 7; |
|
break; |
|
case (ROFFTok_Uparrow): |
|
seq = "↑"; |
|
ssz = 7; |
|
break; |
|
case (ROFFTok_Acute): |
|
seq = "´"; |
|
ssz = 6; |
|
break; |
|
case (ROFFTok_Grave): |
|
seq = "`"; |
|
ssz = 5; |
|
break; |
|
case (ROFFTok_Pi): |
|
seq = "π"; |
|
ssz = 6; |
|
break; |
|
case (ROFFTok_Ne): |
|
seq = "≠"; |
|
ssz = 7; |
|
break; |
|
case (ROFFTok_Lt): |
|
seq = "<"; |
|
ssz = 4; |
|
break; |
|
case (ROFFTok_Gt): |
|
seq = ">"; |
|
ssz = 4; |
|
break; |
|
case (ROFFTok_Plusmin): |
|
seq = "±"; |
|
ssz = 6; |
|
break; |
|
case (ROFFTok_Infty): |
|
seq = "∞"; |
|
ssz = 7; |
|
break; |
|
case (ROFFTok_Bar): |
|
seq = "|"; |
|
ssz = 6; |
|
break; |
|
case (ROFFTok_Nan): |
|
seq = "Nan"; |
|
ssz = 3; |
|
break; |
|
case (ROFFTok_Quote): |
|
seq = """; |
|
ssz = 6; |
|
break; |
|
case (ROFFTok_Slash): |
|
seq = "\\"; |
|
ssz = 1; |
|
break; |
|
case (ROFFTok_Null): |
|
seq = ""; |
|
ssz = 0; |
|
break; |
|
default: |
|
/* TODO: print error. */ |
|
return(-1); |
|
} |
break; |
break; |
|
|
|
/* Ampersand ml-escape. */ |
|
case ('&'): |
|
seq = "&"; |
|
ssz = 5; |
|
break; |
|
|
|
/* Quotation ml-escape. */ |
case ('"'): |
case ('"'): |
if ( ! ml_nputs(p, """, 6, pos)) |
seq = """; |
return(0); |
ssz = 6; |
break; |
break; |
|
|
|
/* Lt ml-escape. */ |
case ('<'): |
case ('<'): |
if ( ! ml_nputs(p, "<", 4, pos)) |
seq = "<"; |
return(0); |
ssz = 4; |
break; |
break; |
|
|
|
/* Gt ml-escape. */ |
case ('>'): |
case ('>'): |
if ( ! ml_nputs(p, ">", 4, pos)) |
seq = ">"; |
return(0); |
ssz = 4; |
break; |
break; |
|
|
default: |
default: |
if ( ! ml_nputs(p, &buf[i], 1, pos)) |
seq = &buf[i]; |
return(0); |
ssz = 1; |
break; |
break; |
} |
} |
|
|
|
if (ssz > 0 && ! ml_nputs(p, seq, ssz, pos)) |
|
return(-1); |
} |
} |
return(1); |
return(1); |
} |
} |
|
|
ml_nputs(struct md_mbuf *p, const char *buf, size_t sz, size_t *pos) |
ml_nputs(struct md_mbuf *p, const char *buf, size_t sz, size_t *pos) |
{ |
{ |
|
|
|
if (0 == sz) |
|
return(1); |
|
|
if ( ! md_buf_puts(p, buf, sz)) |
if ( ! md_buf_puts(p, buf, sz)) |
return(0); |
return(0); |
|
|
Line 80 ml_puts(struct md_mbuf *p, const char *buf, size_t *po |
|
Line 232 ml_puts(struct md_mbuf *p, const char *buf, size_t *po |
|
{ |
{ |
size_t sz; |
size_t sz; |
|
|
sz = strlen(buf); |
if (0 == (sz = strlen(buf))) |
|
return(1); |
|
|
if ( ! md_buf_puts(p, buf, sz)) |
if ( ! md_buf_puts(p, buf, sz)) |
return(0); |
return(0); |
*pos += sz; |
*pos += sz; |