[BACK]Return to strings.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/Attic/strings.c between version 1.1 and 1.30

version 1.1, 2008/12/15 03:13:01 version 1.30, 2009/03/20 19:56:25
Line 16 
Line 16 
  * 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 <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
 #include <ctype.h>  #include <ctype.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <stdio.h>  #include <stdio.h>
   #include <string.h>
   
 #include "private.h"  #include "private.h"
   
 int  /*
 mdoc_isdelim(const char *p)   * Various string-literal operations:  converting scalars to and from
 {   * strings, etc.
    */
   
         if (0 == *p)  struct mdoc_secname {
           const char      *name;
           int              flag;
   #define MSECNAME_META   (1 << 0)
   };
   
   /* Section names corresponding to mdoc_sec. */
   
   static  const struct mdoc_secname secnames[] = {
           { "PROLOGUE", MSECNAME_META },
           { "BODY", MSECNAME_META },
           { "NAME", 0 },
           { "LIBRARY", 0 },
           { "SYNOPSIS", 0 },
           { "DESCRIPTION", 0 },
           { "IMPLEMENTATION NOTES", 0 },
           { "RETURN VALUES", 0 },
           { "ENVIRONMENT", 0 },
           { "FILES", 0 },
           { "EXAMPLES", 0 },
           { "DIAGNOSTICS", 0 },
           { "COMPATIBILITY", 0 },
           { "ERRORS", 0 },
           { "SEE ALSO", 0 },
           { "STANDARDS", 0 },
           { "HISTORY", 0 },
           { "AUTHORS", 0 },
           { "CAVEATS", 0 },
           { "BUGS", 0 },
           { NULL, 0 }
   };
   
   #ifdef __linux__
   extern  char            *strptime(const char *, const char *, struct tm *);
   #endif
   
   
   size_t
   mdoc_isescape(const char *p)
   {
           size_t           c;
   
           if ('\\' != *p++)
                 return(0);                  return(0);
         if (0 != *(p + 1))  
                 return(0);  
   
         switch (*p) {          switch (*p) {
         case('{'):          case ('\\'):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
           case ('\''):
                   /* FALLTHROUGH */
           case ('`'):
                   /* FALLTHROUGH */
           case ('q'):
                   /* FALLTHROUGH */
           case ('-'):
                   /* FALLTHROUGH */
           case (' '):
                   /* FALLTHROUGH */
           case ('|'):
                   /* FALLTHROUGH */
           case ('&'):
                   /* FALLTHROUGH */
           case ('.'):
                   /* FALLTHROUGH */
           case (':'):
                   /* FALLTHROUGH */
           case ('e'):
                   return(2);
           case ('*'):
                   if (0 == *++p || ! isgraph((u_char)*p))
                           return(0);
                   switch (*p) {
                   case ('('):
                           if (0 == *++p || ! isgraph((u_char)*p))
                                   return(0);
                           return(4);
                   case ('['):
                           for (c = 3, p++; *p && ']' != *p; p++, c++)
                                   if ( ! isgraph((u_char)*p))
                                           break;
                           return(*p == ']' ? c : 0);
                   default:
                           break;
                   }
                   return(3);
           case ('('):
                   if (0 == *++p || ! isgraph((u_char)*p))
                           return(0);
                   if (0 == *++p || ! isgraph((u_char)*p))
                           return(0);
                   return(4);
           case ('['):
                   break;
           default:
                   return(0);
           }
   
           for (c = 3, p++; *p && ']' != *p; p++, c++)
                   if ( ! isgraph((u_char)*p))
                           break;
   
           return(*p == ']' ? c : 0);
   }
   
   
   int
   mdoc_iscdelim(char p)
   {
   
           switch (p) {
         case('.'):          case('.'):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case(','):          case(','):
Line 55  mdoc_isdelim(const char *p)
Line 161  mdoc_isdelim(const char *p)
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case(']'):          case(']'):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
           case('{'):
                   /* FALLTHROUGH */
         case('}'):          case('}'):
                 return(1);                  return(1);
         default:          default:
Line 64  mdoc_isdelim(const char *p)
Line 172  mdoc_isdelim(const char *p)
         return(0);          return(0);
 }  }
   
   
   int
   mdoc_isdelim(const char *p)
   {
   
           if (0 == *p)
                   return(0);
           if (0 != *(p + 1))
                   return(0);
           return(mdoc_iscdelim(*p));
   }
   
   
   enum mdoc_sec
   mdoc_atosec(const char *p)
   {
           const struct mdoc_secname *n;
           int                        i;
   
           for (i = 0, n = secnames; n->name; n++, i++)
                   if ( ! (n->flag & MSECNAME_META))
                           if (xstrcmp(p, n->name))
                                   return((enum mdoc_sec)i);
   
           return(SEC_CUSTOM);
   }
   
   
   time_t
   mdoc_atotime(const char *p)
   {
           struct tm        tm;
           char            *pp;
   
           (void)memset(&tm, 0, sizeof(struct tm));
   
           if (xstrcmp(p, "$Mdocdate$"))
                   return(time(NULL));
           if ((pp = strptime(p, "$Mdocdate$", &tm)) && 0 == *pp)
                   return(mktime(&tm));
           /* XXX - this matches "June 1999", which is wrong. */
           if ((pp = strptime(p, "%b %d %Y", &tm)) && 0 == *pp)
                   return(mktime(&tm));
           if ((pp = strptime(p, "%b %d, %Y", &tm)) && 0 == *pp)
                   return(mktime(&tm));
   
           return(0);
   }
   
   
   size_t
   mdoc_macro2len(int macro)
   {
   
           switch (macro) {
           case(MDOC_Ad):
                   return(12);
           case(MDOC_Ao):
                   return(12);
           case(MDOC_An):
                   return(12);
           case(MDOC_Aq):
                   return(12);
           case(MDOC_Ar):
                   return(12);
           case(MDOC_Bo):
                   return(12);
           case(MDOC_Bq):
                   return(12);
           case(MDOC_Cd):
                   return(12);
           case(MDOC_Cm):
                   return(10);
           case(MDOC_Do):
                   return(10);
           case(MDOC_Dq):
                   return(12);
           case(MDOC_Dv):
                   return(12);
           case(MDOC_Eo):
                   return(12);
           case(MDOC_Em):
                   return(10);
           case(MDOC_Er):
                   return(12);
           case(MDOC_Ev):
                   return(15);
           case(MDOC_Fa):
                   return(12);
           case(MDOC_Fl):
                   return(10);
           case(MDOC_Fo):
                   return(16);
           case(MDOC_Fn):
                   return(16);
           case(MDOC_Ic):
                   return(10);
           case(MDOC_Li):
                   return(16);
           case(MDOC_Ms):
                   return(6);
           case(MDOC_Nm):
                   return(10);
           case(MDOC_No):
                   return(12);
           case(MDOC_Oo):
                   return(10);
           case(MDOC_Op):
                   return(14);
           case(MDOC_Pa):
                   return(32);
           case(MDOC_Pf):
                   return(12);
           case(MDOC_Po):
                   return(12);
           case(MDOC_Pq):
                   return(12);
           case(MDOC_Ql):
                   return(16);
           case(MDOC_Qo):
                   return(12);
           case(MDOC_So):
                   return(12);
           case(MDOC_Sq):
                   return(12);
           case(MDOC_Sy):
                   return(6);
           case(MDOC_Sx):
                   return(16);
           case(MDOC_Tn):
                   return(10);
           case(MDOC_Va):
                   return(12);
           case(MDOC_Vt):
                   return(12);
           case(MDOC_Xr):
                   return(10);
           default:
                   break;
           };
           return(0);
   }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.30

CVSweb