[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.11 and 1.14

version 1.11, 2022/06/06 12:09:48 version 1.14, 2022/06/08 13:23:57
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 59  mandoc_escape(const char **rendarg, const char **rarg,
Line 59  mandoc_escape(const char **rendarg, const char **rarg,
  * sequence are returned in *resc ... *rend.   * sequence are returned in *resc ... *rend.
  * Otherwise, *resc is set to aesc and the positions of the escape   * Otherwise, *resc is set to aesc and the positions of the escape
  * sequence starting at aesc are returned.   * sequence starting at aesc are returned.
  * Diagnostic messages are generated if and only if resc != NULL,   * Diagnostic messages are generated if and only if ln != 0,
  * that is, if and only if called by roff_expand().   * that is, if and only if called by roff_expand().
  */   */
 enum mandoc_esc  enum mandoc_esc
Line 72  roff_escape(const char *buf, const int ln, const int a
Line 72  roff_escape(const char *buf, const int ln, const int a
         int              iendarg;       /* index right after the argument */          int              iendarg;       /* index right after the argument */
         int              iend;          /* index right after the sequence */          int              iend;          /* index right after the sequence */
         int              sesc, snam, sarg, sendarg, send; /* for sub-escape */          int              sesc, snam, sarg, sendarg, send; /* for sub-escape */
           int              escterm;       /* whether term is escaped */
         int              maxl;          /* expected length of the argument */          int              maxl;          /* expected length of the argument */
         int              argl;          /* actual length of the argument */          int              argl;          /* actual length of the argument */
         int              c, i;          /* for \[char...] parsing */          int              c, i;          /* for \[char...] parsing */
         int              valid_A;       /* for \A parsing */          int              valid_A;       /* for \A parsing */
         enum mandoc_esc  rval;          /* return value */          enum mandoc_esc  rval;          /* return value */
           enum mandoc_esc  stype;         /* for sub-escape */
         enum mandocerr   err;           /* diagnostic code */          enum mandocerr   err;           /* diagnostic code */
         char             term;          /* byte terminating the argument */          char             term;          /* byte terminating the argument */
   
Line 264  roff_escape(const char *buf, const int ln, const int a
Line 266  roff_escape(const char *buf, const int ln, const int a
   
         /* Decide how to end the argument. */          /* Decide how to end the argument. */
   
           escterm = 0;
           stype = ESCAPE_EXPAND;
         if ((term == '\b' || (term == '\0' && maxl == INT_MAX)) &&          if ((term == '\b' || (term == '\0' && maxl == INT_MAX)) &&
             buf[iarg] == buf[iesc] && roff_escape(buf, ln, iendarg,              buf[iarg] == buf[iesc]) {
             &sesc, &snam, &sarg, &sendarg, &send) == ESCAPE_EXPAND)                  stype = roff_escape(buf, ln, iendarg,
                 goto out_sub;                      &sesc, &snam, &sarg, &sendarg, &send);
                   if (stype == ESCAPE_EXPAND)
                           goto out_sub;
           }
   
         if (term == '\b') {          if (term == '\b') {
                 if ((buf[inam] == 'N' && isdigit((unsigned char)buf[iarg])) ||                  if (stype == ESCAPE_UNDEF)
                     (buf[inam] == 'h' && strchr(" %&()*+-./0123456789:<=>",                          iarg++;
                      buf[iarg]) != NULL)) {                  if (stype != ESCAPE_EXPAND && stype != ESCAPE_UNDEF) {
                         iendarg = iend = iarg + 1;                          if (strchr("BHLRSNhlvx", buf[inam]) != NULL &&
                         rval = ESCAPE_ERROR;                              strchr(" ,.0DLOXYZ^abdhlortuvx|~",
                         goto out;                              buf[snam]) != NULL) {
                                   err = MANDOCERR_ESC_DELIM;
                                   iend = send;
                                   iarg = iendarg = sesc;
                                   goto out;
                           }
                           escterm = 1;
                           iarg = send;
                           term = buf[snam];
                   } else if (strchr("BDHLRSvxNhl", buf[inam]) != NULL &&
                       strchr(" %&()*+-./0123456789:<=>", buf[iarg]) != NULL) {
                           err = MANDOCERR_ESC_DELIM;
                           if (rval != ESCAPE_EXPAND)
                                   rval = ESCAPE_ERROR;
                           if (buf[inam] != 'D') {
                                   iendarg = iend = iarg + 1;
                                   goto out;
                           }
                 }                  }
                 term = buf[iarg++];                  if (term == '\b')
                           term = buf[iarg++];
         } else if (term == '\0' && maxl == INT_MAX) {          } else if (term == '\0' && maxl == INT_MAX) {
                 if (buf[inam] == 'n' && (buf[iarg] == '+' || buf[iarg] == '-'))                  if (buf[inam] == 'n' && (buf[iarg] == '+' || buf[iarg] == '-'))
                         iarg++;                          iarg++;
Line 289  roff_escape(const char *buf, const int ln, const int a
Line 314  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 307  roff_escape(const char *buf, const int ln, const int a
Line 333  roff_escape(const char *buf, const int ln, const int a
         while (maxl > 0) {          while (maxl > 0) {
                 if (buf[iendarg] == '\0') {                  if (buf[iendarg] == '\0') {
                         err = MANDOCERR_ESC_INCOMPLETE;                          err = MANDOCERR_ESC_INCOMPLETE;
                         if (rval != ESCAPE_EXPAND)                          if (rval != ESCAPE_EXPAND &&
                               rval != ESCAPE_OVERSTRIKE)
                                 rval = ESCAPE_ERROR;                                  rval = ESCAPE_ERROR;
                         /* Ignore an incomplete argument except for \w. */                          /* Usually, ignore an incomplete argument. */
                         if (buf[inam] != 'w')                          if (strchr("Aow", buf[inam]) == NULL)
                                 iendarg = iarg;                                  iendarg = iarg;
                         break;                          break;
                 }                  }
                 if (buf[iendarg] == term) {                  if (escterm == 0 && buf[iendarg] == term) {
                         iend = iendarg + 1;                          iend = iendarg + 1;
                         break;                          break;
                 }                  }
                 if (buf[inam] == 'N' &&  
                     isdigit((unsigned char)buf[iendarg]) == 0) {  
                         iend = iendarg + 1;  
                         break;  
                 }  
                 if (buf[iendarg] == buf[iesc]) {                  if (buf[iendarg] == buf[iesc]) {
                         switch (roff_escape(buf, ln, iendarg,                          stype = roff_escape(buf, ln, iendarg,
                             &sesc, &snam, &sarg, &sendarg, &send)) {                              &sesc, &snam, &sarg, &sendarg, &send);
                         case ESCAPE_EXPAND:                          if (stype == ESCAPE_EXPAND)
                                 goto out_sub;                                  goto out_sub;
                         case ESCAPE_UNDEF:                          iend = send;
                           if (escterm == 1 &&
                               (buf[snam] == term || buf[inam] == 'N'))
                                 break;                                  break;
                         default:                          if (stype != ESCAPE_UNDEF)
                                 valid_A = 0;                                  valid_A = 0;
                                 break;                          iendarg = send;
                         }                  } else if (buf[inam] == 'N' &&
                         iendarg = iend = send;                      isdigit((unsigned char)buf[iendarg]) == 0) {
                           iend = iendarg + 1;
                           break;
                 } else {                  } else {
                         if (buf[iendarg] == ' ' || buf[iendarg] == '\t')                          if (buf[iendarg] == ' ' || buf[iendarg] == '\t')
                                 valid_A = 0;                                  valid_A = 0;
Line 366  roff_escape(const char *buf, const int ln, const int a
Line 392  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 384  roff_escape(const char *buf, const int ln, const int a
Line 420  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:
Line 467  out_sub:
Line 505  out_sub:
         rval = ESCAPE_EXPAND;          rval = ESCAPE_EXPAND;
   
 out:  out:
           if (resc != NULL)
                   *resc = iesc;
         if (rnam != NULL)          if (rnam != NULL)
                 *rnam = inam;                  *rnam = inam;
         if (rarg != NULL)          if (rarg != NULL)
Line 475  out:
Line 515  out:
                 *rendarg = iendarg;                  *rendarg = iendarg;
         if (rend != NULL)          if (rend != NULL)
                 *rend = iend;                  *rend = iend;
         if (resc == NULL)          if (ln == 0)
                 return rval;                  return rval;
   
         /*          /*
Line 483  out:
Line 523  out:
          * from the parser, not when called from the formatters.           * from the parser, not when called from the formatters.
          */           */
   
         *resc = iesc;  
         switch (rval) {          switch (rval) {
         case ESCAPE_ERROR:  
                 if (err == MANDOCERR_OK)  
                         err = MANDOCERR_ESC_BAD;  
                 break;  
         case ESCAPE_UNSUPP:          case ESCAPE_UNSUPP:
                 err = MANDOCERR_ESC_UNSUPP;                  err = MANDOCERR_ESC_UNSUPP;
                 break;                  break;

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

CVSweb