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

Diff for /mandoc/roff_escape.c between version 1.7 and 1.13

version 1.7, 2022/06/02 11:29:07 version 1.13, 2022/06/07 09:54:40
Line 1 
Line 1 
 /* $OpenBSD$ */  /* $Id$ */
 /*  /*
  * Copyright (c) 2011, 2012, 2013, 2014, 2015, 2017, 2018, 2020, 2022   * Copyright (c) 2011, 2012, 2013, 2014, 2015, 2017, 2018, 2020, 2022
  *               Ingo Schwarze <schwarze@openbsd.org>   *               Ingo Schwarze <schwarze@openbsd.org>
Line 98  roff_escape(const char *buf, const int ln, const int a
Line 98  roff_escape(const char *buf, const int ln, const int a
         iarg = iendarg = iend = inam + 1;          iarg = iendarg = iend = inam + 1;
         maxl = INT_MAX;          maxl = INT_MAX;
         term = '\0';          term = '\0';
           err = MANDOCERR_OK;
         switch (buf[inam]) {          switch (buf[inam]) {
   
         /* Escape sequences taking no arguments at all. */          /* Escape sequences taking no arguments at all. */
Line 127  roff_escape(const char *buf, const int ln, const int a
Line 128  roff_escape(const char *buf, const int ln, const int a
         case '\0':          case '\0':
                 iendarg = --iend;                  iendarg = --iend;
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
           case '.':
         case '\\':          case '\\':
         default:          default:
                 iarg--;                  iarg--;
Line 136  roff_escape(const char *buf, const int ln, const int a
Line 138  roff_escape(const char *buf, const int ln, const int a
         case ' ':          case ' ':
         case '\'':          case '\'':
         case '-':          case '-':
         case '.':  
         case '0':          case '0':
         case ':':          case ':':
         case '_':          case '_':
Line 205  roff_escape(const char *buf, const int ln, const int a
Line 206  roff_escape(const char *buf, const int ln, const int a
                 term = '\b';                  term = '\b';
                 break;                  break;
         case 'C':          case 'C':
                 if (buf[iarg] != '\'') {  
                         rval = ESCAPE_ERROR;  
                         goto out;  
                 }  
                 rval = ESCAPE_SPECIAL;                  rval = ESCAPE_SPECIAL;
                 term = '\b';                  term = '\b';
                 break;                  break;
Line 273  roff_escape(const char *buf, const int ln, const int a
Line 270  roff_escape(const char *buf, const int ln, const int a
                 goto out_sub;                  goto out_sub;
   
         if (term == '\b') {          if (term == '\b') {
                 if ((buf[inam] == 'N' && isdigit((unsigned char)buf[iarg])) ||                  if (strchr("BDHLRSvxNhl", buf[inam]) != NULL &&
                     (buf[inam] == 'h' && strchr(" %&()*+-./0123456789:<=>",                      strchr(" %&()*+-./0123456789:<=>", buf[iarg]) != NULL) {
                      buf[iarg]) != NULL)) {                          err = MANDOCERR_ESC_DELIM;
                         iendarg = iend = iarg + 1;                          if (rval != ESCAPE_EXPAND)
                         rval = ESCAPE_ERROR;                                  rval = ESCAPE_ERROR;
                         goto out;                          if (buf[inam] != 'D') {
                                   iendarg = iend = iarg + 1;
                                   goto out;
                           }
                 }                  }
                 term = buf[iarg++];                  term = buf[iarg++];
         } else if (term == '\0' && maxl == INT_MAX) {          } else if (term == '\0' && maxl == INT_MAX) {
Line 292  roff_escape(const char *buf, const int ln, const int a
Line 292  roff_escape(const char *buf, const int ln, const int a
                 case '[':                  case '[':
                         if (buf[++iarg] == ' ') {                          if (buf[++iarg] == ' ') {
                                 iendarg = iend = iarg + 1;                                  iendarg = iend = iarg + 1;
                                   err = MANDOCERR_ESC_ARG;
                                 rval = ESCAPE_ERROR;                                  rval = ESCAPE_ERROR;
                                 goto out;                                  goto out;
                         }                          }
Line 309  roff_escape(const char *buf, const int ln, const int a
Line 310  roff_escape(const char *buf, const int ln, const int a
         iendarg = iarg;          iendarg = iarg;
         while (maxl > 0) {          while (maxl > 0) {
                 if (buf[iendarg] == '\0') {                  if (buf[iendarg] == '\0') {
                           err = MANDOCERR_ESC_INCOMPLETE;
                           if (rval != ESCAPE_EXPAND)
                                   rval = ESCAPE_ERROR;
                         /* Ignore an incomplete argument except for \w. */                          /* Ignore an incomplete argument except for \w. */
                         if (buf[inam] != 'w')                          if (buf[inam] != 'w')
                                 iendarg = iarg;                                  iendarg = iarg;
Line 343  roff_escape(const char *buf, const int ln, const int a
Line 347  roff_escape(const char *buf, const int ln, const int a
                         iend = ++iendarg;                          iend = ++iendarg;
                 }                  }
         }          }
         if (resc != NULL && ((maxl != INT_MAX && maxl != 0) ||  
             (term != '\0' && buf[iendarg] != term)))  
                 mandoc_msg(MANDOCERR_ESC_BAD, ln, iesc, "%s", buf + iesc);  
   
         /* Post-process depending on the content of the argument. */          /* Post-process depending on the content of the argument. */
   
Line 369  roff_escape(const char *buf, const int ln, const int a
Line 370  roff_escape(const char *buf, const int ln, const int a
                 case '2':                  case '2':
                 case '3':                  case '3':
                 case '4':                  case '4':
                         rval = argl == 1 ? ESCAPE_IGNORE : ESCAPE_ERROR;                          if (argl == 1)
                                   rval = ESCAPE_IGNORE;
                           else {
                                   err = MANDOCERR_ESC_ARG;
                                   rval = ESCAPE_ERROR;
                           }
                         break;                          break;
                 case '5':                  case '5':
                         rval = buf[iarg - 1] == '[' ? ESCAPE_UNSUPP :                          if (buf[iarg - 1] == '[')
                             ESCAPE_ERROR;                                  rval = ESCAPE_UNSUPP;
                           else {
                                   err = MANDOCERR_ESC_ARG;
                                   rval = ESCAPE_ERROR;
                           }
                         break;                          break;
                 default:                  default:
                           err = MANDOCERR_ESC_ARG;
                         rval = ESCAPE_ERROR;                          rval = ESCAPE_ERROR;
                         break;                          break;
                 }                  }
Line 387  roff_escape(const char *buf, const int ln, const int a
Line 398  roff_escape(const char *buf, const int ln, const int a
         switch (rval) {          switch (rval) {
         case ESCAPE_FONT:          case ESCAPE_FONT:
                 rval = mandoc_font(buf + iarg, argl);                  rval = mandoc_font(buf + iarg, argl);
                   if (rval == ESCAPE_ERROR)
                           err = MANDOCERR_ESC_ARG;
                 break;                  break;
   
         case ESCAPE_SPECIAL:          case ESCAPE_SPECIAL:
                   if (argl == 0) {
                           err = MANDOCERR_ESC_BADCHAR;
                           rval = ESCAPE_ERROR;
                           break;
                   }
   
                 /*                  /*
                  * The file chars.c only provides one common list of                   * The file chars.c only provides one common list of
Line 399  roff_escape(const char *buf, const int ln, const int a
Line 417  roff_escape(const char *buf, const int ln, const int a
                  */                   */
   
                 if (term != '\0' && argl == 1 && buf[iarg] != '-') {                  if (term != '\0' && argl == 1 && buf[iarg] != '-') {
                           err = MANDOCERR_ESC_BADCHAR;
                         rval = ESCAPE_ERROR;                          rval = ESCAPE_ERROR;
                         break;                          break;
                 }                  }
Line 414  roff_escape(const char *buf, const int ln, const int a
Line 433  roff_escape(const char *buf, const int ln, const int a
                         c = 0;                          c = 0;
                         for (i = iarg; i < iendarg; i++)                          for (i = iarg; i < iendarg; i++)
                                 c = 10 * c + (buf[i] - '0');                                  c = 10 * c + (buf[i] - '0');
                         if (c < 0x21 || (c > 0x7e && c < 0xa0) || c > 0xff)                          if (c < 0x21 || (c > 0x7e && c < 0xa0) || c > 0xff) {
                                   err = MANDOCERR_ESC_BADCHAR;
                                 break;                                  break;
                           }
                         iarg += 4;                          iarg += 4;
                         rval = ESCAPE_NUMBERED;                          rval = ESCAPE_NUMBERED;
                         break;                          break;
Line 431  roff_escape(const char *buf, const int ln, const int a
Line 452  roff_escape(const char *buf, const int ln, const int a
                 if (buf[iarg] != 'u' || argl < 5 || argl > 7)                  if (buf[iarg] != 'u' || argl < 5 || argl > 7)
                         break;                          break;
                 if (argl == 7 &&                  if (argl == 7 &&
                     (buf[iarg + 1] != '1' || buf[iarg + 2] != '0'))                      (buf[iarg + 1] != '1' || buf[iarg + 2] != '0')) {
                           err = MANDOCERR_ESC_BADCHAR;
                         break;                          break;
                 if (argl == 6 && buf[iarg + 1] == '0')                  }
                   if (argl == 6 && buf[iarg + 1] == '0') {
                           err = MANDOCERR_ESC_BADCHAR;
                         break;                          break;
                   }
                 if (argl == 5 && buf[iarg + 1] == 'D' &&                  if (argl == 5 && buf[iarg + 1] == 'D' &&
                     strchr("89ABCDEF", buf[iarg + 2]) != NULL)                      strchr("89ABCDEF", buf[iarg + 2]) != NULL) {
                           err = MANDOCERR_ESC_BADCHAR;
                         break;                          break;
                   }
                 if ((int)strspn(buf + iarg + 1, "0123456789ABCDEFabcdef")                  if ((int)strspn(buf + iarg + 1, "0123456789ABCDEFabcdef")
                     + 1 == argl)                      + 1 == argl)
                         rval = ESCAPE_UNICODE;                          rval = ESCAPE_UNICODE;
Line 474  out:
Line 501  out:
   
         *resc = iesc;          *resc = iesc;
         switch (rval) {          switch (rval) {
         case ESCAPE_ERROR:  
                 err = MANDOCERR_ESC_BAD;  
                 break;  
         case ESCAPE_UNSUPP:          case ESCAPE_UNSUPP:
                 err = MANDOCERR_ESC_UNSUPP;                  err = MANDOCERR_ESC_UNSUPP;
                 break;                  break;
         case ESCAPE_UNDEF:          case ESCAPE_UNDEF:
                 if (buf[inam] == '\\')                  if (buf[inam] != '\\' && buf[inam] != '.')
                         return rval;                          err = MANDOCERR_ESC_UNDEF;
                 err = MANDOCERR_ESC_UNDEF;  
                 break;                  break;
         case ESCAPE_SPECIAL:          case ESCAPE_SPECIAL:
                 if (mchars_spec2cp(buf + iarg, argl) >= 0)                  if (mchars_spec2cp(buf + iarg, argl) >= 0)
                         return rval;                          err = MANDOCERR_OK;
                 err = MANDOCERR_ESC_BAD;                  else if (err == MANDOCERR_OK)
                           err = MANDOCERR_ESC_UNKCHAR;
                 break;                  break;
         default:          default:
                 return rval;                  break;
         }          }
         mandoc_msg(err, ln, iesc, "%.*s", iend - iesc, buf + iesc);          if (err != MANDOCERR_OK)
                   mandoc_msg(err, ln, iesc, "%.*s", iend - iesc, buf + iesc);
         return rval;          return rval;
 }  }

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.13

CVSweb