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

Diff for /mandoc/preconv.c between version 1.2 and 1.3

version 1.2, 2011/05/26 12:01:14 version 1.3, 2011/05/26 14:43:07
Line 55  struct encode {
Line 55  struct encode {
         int             (*conv)(const struct buf *);          int             (*conv)(const struct buf *);
 };  };
   
   static  int      cue_enc(const struct buf *, size_t *, enum enc *);
 static  int      conv_latin_1(const struct buf *);  static  int      conv_latin_1(const struct buf *);
 static  int      conv_us_ascii(const struct buf *);  static  int      conv_us_ascii(const struct buf *);
 static  int      conv_utf_8(const struct buf *);  static  int      conv_utf_8(const struct buf *);
Line 94  conv_latin_1(const struct buf *b)
Line 95  conv_latin_1(const struct buf *b)
          * Latin-1 falls into the first 256 code-points of Unicode, so           * Latin-1 falls into the first 256 code-points of Unicode, so
          * there's no need for any sort of translation.  Just make the           * there's no need for any sort of translation.  Just make the
          * 8-bit characters use the Unicode escape.           * 8-bit characters use the Unicode escape.
            * Note that binary values 128 < v < 160 are passed through
            * unmodified to mandoc.
          */           */
   
         for (i = b->offs; i < b->sz; i++) {          for (i = b->offs; i < b->sz; i++) {
                 cu = (unsigned char)*cp++;                  cu = (unsigned char)*cp++;
                 cu < 128U ? putchar(cu) : printf("\\[u%.4X]", cu);                  cu < 160U ? putchar(cu) : printf("\\[u%.4X]", cu);
         }          }
   
         return(1);          return(1);
Line 306  read_whole_file(const char *f, int fd, 
Line 309  read_whole_file(const char *f, int fd, 
         return(0);          return(0);
 }  }
   
   static int
   cue_enc(const struct buf *b, size_t *offs, enum enc *enc)
   {
           const char      *ln, *eoln, *eoph;
           size_t           sz, phsz, nsz;
           int              i;
   
           ln = b->buf + (int)*offs;
           sz = b->sz - *offs;
   
           /* Look for the end-of-line. */
   
           if (NULL == (eoln = memchr(ln, '\n', sz)))
                   return(-1);
   
           /* Set next-line marker. */
   
           *offs = (size_t)((eoln + 1) - b->buf);
   
           /* Check if we have the correct header/trailer. */
   
           if ((sz = (size_t)(eoln - ln)) < 10 ||
                           memcmp(ln, ".\\\" -*-", 7) ||
                           memcmp(eoln - 3, "-*-", 3))
                   return(0);
   
           /* Move after the header and adjust for the trailer. */
   
           ln += 7;
           sz -= 10;
   
           while (sz > 0) {
                   while (sz > 0 && ' ' == *ln) {
                           ln++;
                           sz--;
                   }
                   if (0 == sz)
                           break;
   
                   /* Find the end-of-phrase marker (or eoln). */
   
                   if (NULL == (eoph = memchr(ln, ';', sz)))
                           eoph = eoln - 3;
                   else
                           eoph++;
   
                   /* Only account for the "coding" phrase. */
   
                   if ((phsz = (size_t)(eoph - ln)) < 7 ||
                                   strncasecmp(ln, "coding:", 7)) {
                           sz -= phsz;
                           ln += phsz;
                           continue;
                   }
   
                   sz -= 7;
                   ln += 7;
   
                   while (sz > 0 && ' ' == *ln) {
                           ln++;
                           sz--;
                   }
                   if (0 == sz)
                           break;
   
                   /* Check us against known encodings. */
   
                   for (i = 0; i < ENC__MAX; i++) {
                           nsz = strlen(encs[i].name);
                           if (phsz < nsz)
                                   continue;
                           if (strncasecmp(ln, encs[i].name, nsz))
                                   continue;
   
                           *enc = (enum enc)i;
                           return(1);
                   }
   
                   /* Unknown encoding. */
   
                   *enc = ENC__MAX;
                   return(1);
           }
   
           return(0);
   }
   
 int  int
 main(int argc, char *argv[])  main(int argc, char *argv[])
 {  {
Line 314  main(int argc, char *argv[])
Line 404  main(int argc, char *argv[])
         const char      *fn;          const char      *fn;
         enum enc         enc, def;          enum enc         enc, def;
         const char       bom[3] = { 0xEF, 0xBB, 0xBF };          const char       bom[3] = { 0xEF, 0xBB, 0xBF };
           size_t           offs;
         extern int       optind;          extern int       optind;
         extern char     *optarg;          extern char     *optarg;
   
Line 394  main(int argc, char *argv[])
Line 485  main(int argc, char *argv[])
                         enc = ENC_UTF_8;                          enc = ENC_UTF_8;
                 }                  }
   
           /* Try reading from the "-*-" cue. */
   
           if (ENC__MAX == enc) {
                   offs = b.offs;
                   ch = cue_enc(&b, &offs, &enc);
                   if (0 == ch)
                           ch = cue_enc(&b, &offs, &enc);
           }
   
         /*          /*
          * No encoding has been detected.           * No encoding has been detected.
          * Thus, we either fall into our default encoder, if specified,           * Thus, we either fall into our default encoder, if specified,
Line 403  main(int argc, char *argv[])
Line 503  main(int argc, char *argv[])
         if (ENC__MAX == enc)          if (ENC__MAX == enc)
                 enc = ENC__MAX == def ? ENC_LATIN_1 : def;                  enc = ENC__MAX == def ? ENC_LATIN_1 : def;
   
         if ( ! (*encs[(int)enc].conv)(&b))          if ( ! (*encs[(int)enc].conv)(&b)) {
                   fprintf(stderr, "%s: Bad encoding\n", fn);
                 goto out;                  goto out;
           }
   
         rc = EXIT_SUCCESS;          rc = EXIT_SUCCESS;
 out:  out:

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.3

CVSweb