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

Diff for /mandoc/Attic/action.c between version 1.11 and 1.15

version 1.11, 2009/01/17 16:47:02 version 1.15, 2009/01/20 22:55:46
Line 22 
Line 22 
   
 #include "private.h"  #include "private.h"
   
   /*
    * Actions are executed on macros after they've been post-validated: in
    * other words, a macro will not be "acted upon" until all of its
    * children have been filled in (post-fix order).
    */
   
 struct  actions {  struct  actions {
         int     (*post)(struct mdoc *);          int     (*post)(struct mdoc *);
Line 29  struct actions {
Line 34  struct actions {
   
 /* Per-macro action routines. */  /* Per-macro action routines. */
   
 static int       post_sh(struct mdoc *);  static  int      post_sh(struct mdoc *);
 static int       post_os(struct mdoc *);  static  int      post_os(struct mdoc *);
 static int       post_dt(struct mdoc *);  static  int      post_dt(struct mdoc *);
 static int       post_dd(struct mdoc *);  static  int      post_dd(struct mdoc *);
 static int       post_nm(struct mdoc *);  static  int      post_nm(struct mdoc *);
   
   static  int      post_prologue(struct mdoc *);
   
 /* Array of macro action routines. */  /* Array of macro action routines. */
   
 const   struct actions mdoc_actions[MDOC_MAX] = {  const   struct actions mdoc_actions[MDOC_MAX] = {
Line 147  const struct actions mdoc_actions[MDOC_MAX] = {
Line 154  const struct actions mdoc_actions[MDOC_MAX] = {
 };  };
   
   
   /*
    * The `Nm' macro sets the document's name when used the first time with
    * an argument.  Subsequent calls without a value will result in the
    * name value being used.
    */
 static int  static int
 post_nm(struct mdoc *mdoc)  post_nm(struct mdoc *mdoc)
 {  {
Line 167  post_nm(struct mdoc *mdoc)
Line 179  post_nm(struct mdoc *mdoc)
 }  }
   
   
   /*
    * We keep track of the current section in order to provide warnings on
    * section ordering, per-section macros, and so on.
    */
 static int  static int
 post_sh(struct mdoc *mdoc)  post_sh(struct mdoc *mdoc)
 {  {
Line 186  post_sh(struct mdoc *mdoc)
Line 202  post_sh(struct mdoc *mdoc)
 }  }
   
   
   /*
    * Prologue title must be parsed into document meta-data.
    */
 static int  static int
 post_dt(struct mdoc *mdoc)  post_dt(struct mdoc *mdoc)
 {  {
Line 226  post_dt(struct mdoc *mdoc)
Line 245  post_dt(struct mdoc *mdoc)
   
         if (NULL == mdoc->meta.title)          if (NULL == mdoc->meta.title)
                 mdoc->meta.title = xstrdup("untitled");                  mdoc->meta.title = xstrdup("untitled");
         return(1);  
           mdoc_msg(mdoc, "title: %s", mdoc->meta.title);
   
           return(post_prologue(mdoc));
 }  }
   
   
   /*
    * Prologue operating system must be parsed into document meta-data.
    */
 static int  static int
 post_os(struct mdoc *mdoc)  post_os(struct mdoc *mdoc)
 {  {
Line 244  post_os(struct mdoc *mdoc)
Line 269  post_os(struct mdoc *mdoc)
   
         mdoc->meta.os = xstrdup(buf[0] ? buf : "local");          mdoc->meta.os = xstrdup(buf[0] ? buf : "local");
         mdoc->sec_lastn = mdoc->sec_last = SEC_BODY;          mdoc->sec_lastn = mdoc->sec_last = SEC_BODY;
         return(1);          mdoc->flags |= MDOC_BODYPARSE;
   
           return(post_prologue(mdoc));
 }  }
   
   
   /*
    * Prologue date must be parsed into document meta-data.
    */
 static int  static int
 post_dd(struct mdoc *mdoc)  post_dd(struct mdoc *mdoc)
 {  {
         char              date[64];          char              buf[64];
         size_t            sz;  
         char             *p;  
         struct mdoc_node *n;  
   
         assert(MDOC_ELEM == mdoc->last->type);          assert(MDOC_ELEM == mdoc->last->type);
         assert(MDOC_Dd == mdoc->last->tok);          assert(MDOC_Dd == mdoc->last->tok);
   
         n = mdoc->last->child;  
         assert(0 == mdoc->meta.date);          assert(0 == mdoc->meta.date);
         date[0] = 0;  
   
         sz = 64;          if ( ! xstrlcats(buf, mdoc->last->child, 64))
                   return(mdoc_err(mdoc, "macro parameters too long"));
           if (0 == (mdoc->meta.date = mdoc_atotime(buf)))
                   return(mdoc_err(mdoc, "invalid parameter syntax"));
   
         for ( ; 0 == mdoc->meta.date && n; n = n->next) {          mdoc_msg(mdoc, "date: %u", mdoc->meta.date);
                 assert(MDOC_TEXT == n->type);  
                 p = n->data.text.string;  
   
                 if (xstrcmp(p, "$Mdocdate$")) {          return(post_prologue(mdoc));
                         mdoc->meta.date = time(NULL);  }
                         continue;  
                 } else if (xstrcmp(p, "$")) {  
                         mdoc->meta.date = mdoc_atotime(date);  
                         continue;  
                 } else if (xstrcmp(p, "$Mdocdate:"))  
                         continue;  
   
                 if ( ! xstrlcat(date, n->data.text.string, sz))  
                         return(mdoc_nerr(mdoc, n, "invalid parameter syntax"));  /*
                 if (n->next && ! xstrlcat(date, " ", sz))   * The end document shouldn't have the prologue macros as part of the
                         return(mdoc_nerr(mdoc, n, "invalid parameter syntax"));   * syntax tree (they encompass only meta-data).
    */
   static int
   post_prologue(struct mdoc *mdoc)
   {
           struct mdoc_node *n;
   
           if (mdoc->last->parent->child == mdoc->last)
                   mdoc->last->parent->child = mdoc->last->prev;
           if (mdoc->last->prev)
                   mdoc->last->prev->next = NULL;
   
           n = mdoc->last;
           assert(NULL == mdoc->last->next);
   
           if (mdoc->last->prev) {
                   mdoc->last = mdoc->last->prev;
                   mdoc->next = MDOC_NEXT_SIBLING;
           } else {
                   mdoc->last = mdoc->last->parent;
                   mdoc->next = MDOC_NEXT_CHILD;
         }          }
   
         if (mdoc->meta.date && NULL == n)          mdoc_node_freelist(n);
                 return(1);          return(1);
         else if (n)  
                 return(mdoc_err(mdoc, "invalid parameter syntax"));  
         if ((mdoc->meta.date = mdoc_atotime(date)))  
                 return(1);  
         return(mdoc_err(mdoc, "invalid parameter syntax"));  
 }  }
   
   
 int  int
 mdoc_action_post(struct mdoc *mdoc)  mdoc_action_post(struct mdoc *mdoc)
 {  {
   
           if (MDOC_ACTED & mdoc->last->flags)
                   return(1);
           mdoc->last->flags |= MDOC_ACTED;
   
         if (MDOC_TEXT == mdoc->last->type)          if (MDOC_TEXT == mdoc->last->type)
                 return(1);                  return(1);

Legend:
Removed from v.1.11  
changed lines
  Added in v.1.15

CVSweb