Return to man_argv.c CVS log | Up to [cvsweb.bsd.lv] / mandoc |
File: [cvsweb.bsd.lv] / mandoc / Attic / man_argv.c (download)
Revision 1.1, Thu Aug 13 11:45:29 2009 UTC (15 years, 1 month ago) by kristaps
Significant overhaul in libman. Macros are now block- and line-scoped (with next-line scope extensions possible). man.7 reflects block and line scoping, and also includes a REFERENCE section that will be used as a template for the big mdoc reference. Many fixes in next-line behaviour for both inline and block macros. Added some macros for compatibility (from me.7). Corrected quoted-literal handling for libman. |
/* $Id: man_argv.c,v 1.1 2009/08/13 11:45:29 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include <sys/types.h> #include <assert.h> #include <stdlib.h> #include <string.h> #include "libman.h" int man_args(struct man *m, int line, int *pos, char *buf, char **v) { assert(*pos); assert(' ' != buf[*pos]); if (0 == buf[*pos]) return(ARGS_EOLN); *v = &buf[*pos]; /* * Process a quoted literal. A quote begins with a double-quote * and ends with a double-quote NOT preceded by a double-quote. * Whitespace is NOT involved in literal termination. */ if ('\"' == buf[*pos]) { *v = &buf[++(*pos)]; for ( ; buf[*pos]; (*pos)++) { if ('\"' != buf[*pos]) continue; if ('\"' != buf[*pos + 1]) break; (*pos)++; } if (0 == buf[*pos]) { if ( ! man_pwarn(m, line, *pos, WTQUOTE)) return(ARGS_ERROR); return(ARGS_QWORD); } buf[(*pos)++] = 0; if (0 == buf[*pos]) return(ARGS_QWORD); while (' ' == buf[*pos]) (*pos)++; if (0 == buf[*pos]) if ( ! man_pwarn(m, line, *pos, WTSPACE)) return(ARGS_ERROR); return(ARGS_QWORD); } /* * A non-quoted term progresses until either the end of line or * a non-escaped whitespace. */ for ( ; buf[*pos]; (*pos)++) if (' ' == buf[*pos] && '\\' != buf[*pos - 1]) break; if (0 == buf[*pos]) return(ARGS_WORD); buf[(*pos)++] = 0; while (' ' == buf[*pos]) (*pos)++; if (0 == buf[*pos]) if ( ! man_pwarn(m, line, *pos, WTSPACE)) return(ARGS_ERROR); return(ARGS_WORD); }