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

Diff for /mandoc/term.c between version 1.5 and 1.8

version 1.5, 2009/02/21 19:05:28 version 1.8, 2009/02/22 15:50:45
Line 24 
Line 24 
 #include <string.h>  #include <string.h>
 #include <unistd.h>  #include <unistd.h>
   
   #ifdef __linux__
   #include <time.h>
   #endif
   
 #include "term.h"  #include "term.h"
 #include "private.h" /* XXX */  
   
 enum    termstyle {  enum    termstyle {
         STYLE_CLEAR,          STYLE_CLEAR,
Line 42  static void    termprint_footer(struct termp *,
Line 45  static void    termprint_footer(struct termp *,
                                 const struct mdoc_meta *);                                  const struct mdoc_meta *);
   
 static  void              pword(struct termp *, const char *, size_t);  static  void              pword(struct termp *, const char *, size_t);
   static  void              pescape(struct termp *,
                                   const char *, size_t *, size_t);
 static  void              chara(struct termp *, char);  static  void              chara(struct termp *, char);
 static  void              escape(struct termp *, enum termstyle);  static  void              style(struct termp *, enum termstyle);
   
   #ifdef __linux__
   extern  size_t            strlcat(char *, const char *, size_t);
   extern  size_t            strlcpy(char *, const char *, size_t);
   #endif
   
 void  void
 flushln(struct termp *p)  flushln(struct termp *p)
Line 73  flushln(struct termp *p)
Line 82  flushln(struct termp *p)
                 for (j = 0; j < p->offset; j++)                  for (j = 0; j < p->offset; j++)
                         putchar(' ');                          putchar(' ');
   
           /*
            * If we're literal, print out verbatim.
            */
           if (p->flags & TERMP_LITERAL) {
                   /* FIXME: count non-printing chars. */
                   for (i = 0; i < p->col; i++)
                           putchar(p->buf[i]);
                   putchar('\n');
                   p->col = 0;
                   return;
           }
   
         for (i = 0; i < p->col; i++) {          for (i = 0; i < p->col; i++) {
                 /*                  /*
                  * Count up visible word characters.  Control sequences                   * Count up visible word characters.  Control sequences
Line 185  chara(struct termp *p, char c)
Line 206  chara(struct termp *p, char c)
   
   
 static void  static void
 escape(struct termp *p, enum termstyle esc)  style(struct termp *p, enum termstyle esc)
 {  {
   
         if (p->col + 4 >= p->maxcols)          if (p->col + 4 >= p->maxcols)
Line 212  escape(struct termp *p, enum termstyle esc)
Line 233  escape(struct termp *p, enum termstyle esc)
   
   
 static void  static void
   pescape(struct termp *p, const char *word, size_t *i, size_t len)
   {
   
           (*i)++;
           assert(*i < len);
   
           if ('(' == word[*i]) {
                   /* Two-character escapes. */
                   (*i)++;
                   assert(*i + 1 < len);
   
                   if ('r' == word[*i] && 'B' == word[*i + 1])
                           chara(p, ']');
                   else if ('l' == word[*i] && 'B' == word[*i + 1])
                           chara(p, '[');
   
                   (*i)++;
                   return;
   
           } else if ('[' != word[*i]) {
                   /* One-character escapes. */
                   switch (word[*i]) {
                   case ('\\'):
                           /* FALLTHROUGH */
                   case ('\''):
                           /* FALLTHROUGH */
                   case ('`'):
                           /* FALLTHROUGH */
                   case ('-'):
                           /* FALLTHROUGH */
                   case ('.'):
                           chara(p, word[*i]);
                   default:
                           break;
                   }
                   return;
           }
           /* n-character escapes. */
   }
   
   
   static void
 pword(struct termp *p, const char *word, size_t len)  pword(struct termp *p, const char *word, size_t len)
 {  {
         size_t           i;          size_t           i;
   
         assert(len > 0);          /*assert(len > 0);*/ /* Can be, if literal. */
   
         if ( ! (p->flags & TERMP_NOSPACE))          if ( ! (p->flags & TERMP_NOSPACE) &&
                           ! (p->flags & TERMP_LITERAL))
                 chara(p, ' ');                  chara(p, ' ');
   
         p->flags &= ~TERMP_NOSPACE;          p->flags &= ~TERMP_NOSPACE;
   
         if (p->flags & TERMP_BOLD)          if (p->flags & TERMP_BOLD)
                 escape(p, STYLE_BOLD);                  style(p, STYLE_BOLD);
         if (p->flags & TERMP_UNDERLINE)          if (p->flags & TERMP_UNDERLINE)
                 escape(p, STYLE_UNDERLINE);                  style(p, STYLE_UNDERLINE);
   
         /* TODO: escape patterns. */          for (i = 0; i < len; i++) {
                   if ('\\' == word[i]) {
         for (i = 0; i < len; i++)                          pescape(p, word, &i, len);
                           continue;
                   }
                 chara(p, word[i]);                  chara(p, word[i]);
           }
   
         if (p->flags & TERMP_BOLD ||          if (p->flags & TERMP_BOLD ||
                         p->flags & TERMP_UNDERLINE)                          p->flags & TERMP_UNDERLINE)
                 escape(p, STYLE_CLEAR);                  style(p, STYLE_CLEAR);
 }  }
   
   
Line 244  word(struct termp *p, const char *word)
Line 311  word(struct termp *p, const char *word)
 {  {
         size_t           i, j, len;          size_t           i, j, len;
   
         if (mdoc_isdelim(word))          if (p->flags & TERMP_LITERAL) {
                 p->flags |= TERMP_NOSPACE;                  pword(p, word, strlen(word));
                   return;
           }
   
         len = strlen(word);          len = strlen(word);
         assert(len > 0);          assert(len > 0);
   
           if (mdoc_isdelim(word))
                   p->flags |= TERMP_NOSPACE;
   
         /* LINTED */          /* LINTED */
         for (j = i = 0; i < len; i++) {          for (j = i = 0; i < len; i++) {
                 if ( ! isspace(word[i])) {                  if ( ! isspace(word[i])) {
Line 293  termprint_r(struct termp *p, const struct mdoc_meta *m
Line 365  termprint_r(struct termp *p, const struct mdoc_meta *m
   
         /* Post-processing. */          /* Post-processing. */
   
         if (MDOC_TEXT != node->type) {          if (MDOC_TEXT != node->type)
                 if (termacts[node->tok].post)                  if (termacts[node->tok].post)
                         if ( ! (*termacts[node->tok].post)(p, meta, node))                          (*termacts[node->tok].post)(p, meta, node);
                                 return;  
         }  
   
         /* Siblings. */          /* Siblings. */
   
Line 319  termprint_footer(struct termp *p, const struct mdoc_me
Line 389  termprint_footer(struct termp *p, const struct mdoc_me
                 err(1, "malloc");                  err(1, "malloc");
   
         tm = localtime(&meta->date);          tm = localtime(&meta->date);
   
   #ifdef __linux__
           if (0 == strftime(buf, p->rmargin, "%B %d, %Y", tm))
   #else
         if (NULL == strftime(buf, p->rmargin, "%B %d, %Y", tm))          if (NULL == strftime(buf, p->rmargin, "%B %d, %Y", tm))
   #endif
                 err(1, "strftime");                  err(1, "strftime");
   
         osz = strlcpy(os, meta->os, p->rmargin);          osz = strlcpy(os, meta->os, p->rmargin);
Line 351  termprint_footer(struct termp *p, const struct mdoc_me
Line 426  termprint_footer(struct termp *p, const struct mdoc_me
 static void  static void
 termprint_header(struct termp *p, const struct mdoc_meta *meta)  termprint_header(struct termp *p, const struct mdoc_meta *meta)
 {  {
         char            *msec, *buf, *title, *pp;          char            *buf, *title;
           const char      *pp, *msec;
         size_t           ssz, tsz, ttsz, i;;          size_t           ssz, tsz, ttsz, i;;
   
         if (NULL == (buf = malloc(p->rmargin)))          if (NULL == (buf = malloc(p->rmargin)))
Line 439  termprint_header(struct termp *p, const struct mdoc_me
Line 515  termprint_header(struct termp *p, const struct mdoc_me
 }  }
   
   
 int  void
 termprint(const struct mdoc_node *node,  termprint(const struct mdoc_node *node,
                 const struct mdoc_meta *meta)                  const struct mdoc_meta *meta)
 {  {
Line 459  termprint(const struct mdoc_node *node,
Line 535  termprint(const struct mdoc_node *node,
         termprint_footer(&p, meta);          termprint_footer(&p, meta);
   
         free(p.buf);          free(p.buf);
   
         return(1);  
 }  }
   
   

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.8

CVSweb