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

Diff for /mandoc/Attic/mdoc_action.c between version 1.86 and 1.87

version 1.86, 2010/11/30 10:32:05 version 1.87, 2010/11/30 12:35:10
Line 32 
Line 32 
 #include "libmdoc.h"  #include "libmdoc.h"
 #include "libmandoc.h"  #include "libmandoc.h"
   
   #define DATESIZ   32
 /*  /*
  * FIXME: this file is deprecated.  All future "actions" should be   * FIXME: this file is deprecated.  All future "actions" should be
  * pushed into mdoc_validate.c.   * pushed into mdoc_validate.c.
Line 40 
Line 41 
 #define POST_ARGS struct mdoc *m, struct mdoc_node *n  #define POST_ARGS struct mdoc *m, struct mdoc_node *n
 #define PRE_ARGS  struct mdoc *m, struct mdoc_node *n  #define PRE_ARGS  struct mdoc *m, struct mdoc_node *n
   
 #define NUMSIZ    32  
 #define DATESIZ   32  
   
 struct  actions {  struct  actions {
         int     (*pre)(PRE_ARGS);          int     (*pre)(PRE_ARGS);
         int     (*post)(POST_ARGS);          int     (*post)(POST_ARGS);
Line 51  struct actions {
Line 49  struct actions {
 static  int       concat(struct mdoc *, char *,  static  int       concat(struct mdoc *, char *,
                         const struct mdoc_node *, size_t);                          const struct mdoc_node *, size_t);
   
 static  int       post_bl(POST_ARGS);  
 static  int       post_bl_tagwidth(POST_ARGS);  
 static  int       post_bl_width(POST_ARGS);  
 static  int       post_dd(POST_ARGS);  static  int       post_dd(POST_ARGS);
 static  int       post_dt(POST_ARGS);  static  int       post_dt(POST_ARGS);
 static  int       post_os(POST_ARGS);  static  int       post_os(POST_ARGS);
Line 72  static const struct actions mdoc_actions[MDOC_MAX] = {
Line 67  static const struct actions mdoc_actions[MDOC_MAX] = {
         { NULL, NULL }, /* Dl */          { NULL, NULL }, /* Dl */
         { NULL, NULL }, /* Bd */          { NULL, NULL }, /* Bd */
         { NULL, NULL }, /* Ed */          { NULL, NULL }, /* Ed */
         { NULL, post_bl }, /* Bl */          { NULL, NULL }, /* Bl */
         { NULL, NULL }, /* El */          { NULL, NULL }, /* El */
         { NULL, NULL }, /* It */          { NULL, NULL }, /* It */
         { NULL, NULL }, /* Ad */          { NULL, NULL }, /* Ad */
Line 430  post_os(POST_ARGS)
Line 425  post_os(POST_ARGS)
   
         m->meta.os = mandoc_strdup(buf);          m->meta.os = mandoc_strdup(buf);
         return(post_prol(m, n));          return(post_prol(m, n));
 }  
   
   
 /*  
  * Calculate the -width for a `Bl -tag' list if it hasn't been provided.  
  * Uses the first head macro.  NOTE AGAIN: this is ONLY if the -width  
  * argument has NOT been provided.  See post_bl_width() for converting  
  * the -width string.  
  */  
 static int  
 post_bl_tagwidth(POST_ARGS)  
 {  
         struct mdoc_node *nn;  
         size_t            sz, ssz;  
         int               i;  
         char              buf[NUMSIZ];  
   
         sz = 10;  
   
         for (nn = n->body->child; nn; nn = nn->next) {  
                 if (MDOC_It != nn->tok)  
                         continue;  
   
                 assert(MDOC_BLOCK == nn->type);  
                 nn = nn->head->child;  
   
                 if (nn == NULL) {  
                         /* No -width for .Bl and first .It is emtpy */  
                         if ( ! mdoc_nmsg(m, n, MANDOCERR_NOWIDTHARG))  
                                 return(0);  
                         break;  
                 }  
   
                 if (MDOC_TEXT == nn->type) {  
                         sz = strlen(nn->string) + 1;  
                         break;  
                 }  
   
                 if (0 != (ssz = mdoc_macro2len(nn->tok)))  
                         sz = ssz;  
                 else if ( ! mdoc_nmsg(m, n, MANDOCERR_NOWIDTHARG))  
                         return(0);  
   
                 break;  
         }  
   
         /* Defaults to ten ens. */  
   
         snprintf(buf, NUMSIZ, "%zun", sz);  
   
         /*  
          * We have to dynamically add this to the macro's argument list.  
          * We're guaranteed that a MDOC_Width doesn't already exist.  
          */  
   
         assert(n->args);  
         i = (int)(n->args->argc)++;  
   
         n->args->argv = mandoc_realloc(n->args->argv,  
                         n->args->argc * sizeof(struct mdoc_argv));  
   
         n->args->argv[i].arg = MDOC_Width;  
         n->args->argv[i].line = n->line;  
         n->args->argv[i].pos = n->pos;  
         n->args->argv[i].sz = 1;  
         n->args->argv[i].value = mandoc_malloc(sizeof(char *));  
         n->args->argv[i].value[0] = mandoc_strdup(buf);  
   
         /* Set our width! */  
         n->data.Bl->width = n->args->argv[i].value[0];  
         return(1);  
 }  
   
   
 /*  
  * Calculate the real width of a list from the -width string, which may  
  * contain a macro (with a known default width), a literal string, or a  
  * scaling width.  
  */  
 static int  
 post_bl_width(POST_ARGS)  
 {  
         size_t            width;  
         int               i;  
         enum mdoct        tok;  
         char              buf[NUMSIZ];  
   
         /*  
          * If the value to -width is a macro, then we re-write it to be  
          * the macro's width as set in share/tmac/mdoc/doc-common.  
          */  
   
         if (0 == strcmp(n->data.Bl->width, "Ds"))  
                 width = 6;  
         else if (MDOC_MAX == (tok = mdoc_hash_find(n->data.Bl->width)))  
                 return(1);  
         else if (0 == (width = mdoc_macro2len(tok)))  
                 return(mdoc_nmsg(m, n, MANDOCERR_BADWIDTH));  
   
         /* The value already exists: free and reallocate it. */  
   
         assert(n->args);  
   
         for (i = 0; i < (int)n->args->argc; i++)  
                 if (MDOC_Width == n->args->argv[i].arg)  
                         break;  
   
         assert(i < (int)n->args->argc);  
   
         snprintf(buf, NUMSIZ, "%zun", width);  
         free(n->args->argv[i].value[0]);  
         n->args->argv[i].value[0] = mandoc_strdup(buf);  
   
         /* Set our width! */  
         n->data.Bl->width = n->args->argv[i].value[0];  
         return(1);  
 }  
   
   
 static int  
 post_bl(POST_ARGS)  
 {  
   
         if (MDOC_BLOCK != n->type)  
                 return(1);  
   
         /*  
          * These are fairly complicated, so we've broken them into two  
          * functions.  post_bl_tagwidth() is called when a -tag is  
          * specified, but no -width (it must be guessed).  The second  
          * when a -width is specified (macro indicators must be  
          * rewritten into real lengths).  
          */  
   
         if (LIST_tag == n->data.Bl->type && NULL == n->data.Bl->width) {  
                 if ( ! post_bl_tagwidth(m, n))  
                         return(0);  
         } else if (NULL != n->data.Bl->width) {  
                 if ( ! post_bl_width(m, n))  
                         return(0);  
         } else  
                 return(1);  
   
         assert(n->data.Bl->width);  
         return(1);  
 }  }
   
 /*  /*

Legend:
Removed from v.1.86  
changed lines
  Added in v.1.87

CVSweb