diff options
Diffstat (limited to 'Build/source/texk/upmendex/fread.c')
-rw-r--r-- | Build/source/texk/upmendex/fread.c | 65 |
1 files changed, 49 insertions, 16 deletions
diff --git a/Build/source/texk/upmendex/fread.c b/Build/source/texk/upmendex/fread.c index a336022e11b..ba1d3514856 100644 --- a/Build/source/texk/upmendex/fread.c +++ b/Build/source/texk/upmendex/fread.c @@ -493,25 +493,54 @@ int widechar_to_multibyte(char *mbstr, int32_t size, UChar *wcstr) static void chkpageattr(struct page *p) { - int i,j,cc=0; + int i,j,cc=0,cnt,pplen,pclen; + char buff[16],*pcpos,*page0; + pplen=strlen(page_precedence); + pclen=strlen(page_compositor); for (i=0;i<strlen(p->page);i++) { - if (strncmp(page_compositor,&p->page[i],strlen(page_compositor))==0) { + page0=&p->page[i]; + if (strncmp(page_compositor,page0,pclen)==0) { p->attr[cc]=pattr[cc]; cc++; - i+=strlen(page_compositor)-1; + i+=pclen-1; + if (cc>=PAGE_COMPOSIT_DEPTH) { + if (pclen>0) + verb_printf(efp, "\nToo many fields of page number \"%s\".\n", p->page); + else + verb_printf(efp, "\nIllegular page_comositor specification.\n"); + exit(253); + } } else { -ATTRLOOP: - if (!((p->page[i]>='0' && p->page[i]<='9') || (p->page[i]>='A' && p->page[i]<='Z') || (p->page[i]>='a' && p->page[i]<='z'))) { + cnt=0; + if (!((*page0>='0' && *page0<='9') || (*page0>='A' && *page0<='Z') || (*page0>='a' && *page0<='z'))) { p->attr[cc]= -1; if (cc<2) p->attr[++cc]= -1; return; } + pcpos=strstr(page0,page_compositor); + j=pcpos ? pcpos-page0 : strlen(page0); + if (j>15) { + verb_printf(efp, "\nToo long page number string \"%s\".\n", page0); + exit(253); + } + strncpy(buff,page0,j); + buff[j]='\0'; +ATTRLOOP: + cnt++; + if (cnt>pplen) { + verb_printf(efp, "\nFailed to find page type for page \"%s\" in page_precedence specification (%s).\n", + page0, page_precedence); + exit(253); + } + switch(page_precedence[pattr[cc]]) { case 'r': - if (strchr("ivxlcdm",p->page[i])==NULL) { - if (pattr[cc]<strlen(page_precedence)-1) + if (strchr("ivxlcdm",*page0)==NULL || + (strchr("lcdm",*page0) && strchr(page_precedence,'a') && strlen(buff)==1 && pcpos)) { + /* heuristic detection as alphabet since L=50, C=100, D=100, M=1000 are quite large */ + if (pattr[cc]<pplen-1) pattr[cc]++; else pattr[cc]=0; for (j=cc+1;j<3;j++) pattr[j]=0; @@ -519,8 +548,10 @@ ATTRLOOP: } break; case 'R': - if (strchr("IVXLCDM",p->page[i])==NULL) { - if (pattr[cc]<strlen(page_precedence)-1) + if (strchr("IVXLCDM",*page0)==NULL || + (strchr("LCDM",*page0) && strchr(page_precedence,'A') && strlen(buff)==1 && pcpos)) { + /* heuristic detection as alphabet since L=50, C=100, D=100, M=1000 are quite large */ + if (pattr[cc]<pplen-1) pattr[cc]++; else pattr[cc]=0; for (j=cc+1;j<3;j++) pattr[j]=0; @@ -528,8 +559,8 @@ ATTRLOOP: } break; case 'n': - if (p->page[i]<'0' || p->page[i]>'9') { - if (pattr[cc]<strlen(page_precedence)-1) + if (*page0<'0' || *page0>'9') { + if (pattr[cc]<pplen-1) pattr[cc]++; else pattr[cc]=0; for (j=cc+1;j<3;j++) pattr[j]=0; @@ -537,8 +568,8 @@ ATTRLOOP: } break; case 'a': - if (p->page[i]<'a' || p->page[i]>'z') { - if (pattr[cc]<strlen(page_precedence)-1) + if (*page0<'a' || *page0>'z' || strlen(buff)>1) { + if (pattr[cc]<pplen-1) pattr[cc]++; else pattr[cc]=0; for (j=cc+1;j<3;j++) pattr[j]=0; @@ -546,8 +577,8 @@ ATTRLOOP: } break; case 'A': - if (p->page[i]<'A' || p->page[i]>'Z') { - if (pattr[cc]<strlen(page_precedence)-1) + if (*page0<'A' || *page0>'Z' || strlen(buff)>1) { + if (pattr[cc]<pplen-1) pattr[cc]++; else pattr[cc]=0; for (j=cc+1;j<3;j++) pattr[j]=0; @@ -555,7 +586,9 @@ ATTRLOOP: } break; default: - break; + verb_printf(efp, "\nUnknown page type '%c' in page_precedence specification (%s).\n", + page_precedence[pattr[cc]], page_precedence); + exit(253); } } } |