summaryrefslogtreecommitdiff
path: root/indexing/upmendex/source/fread.c
diff options
context:
space:
mode:
Diffstat (limited to 'indexing/upmendex/source/fread.c')
-rw-r--r--indexing/upmendex/source/fread.c81
1 files changed, 59 insertions, 22 deletions
diff --git a/indexing/upmendex/source/fread.c b/indexing/upmendex/source/fread.c
index a336022e11..66d3e0b144 100644
--- a/indexing/upmendex/source/fread.c
+++ b/indexing/upmendex/source/fread.c
@@ -344,7 +344,7 @@ LOOP:
copy_multibyte_char(buff, table, &j, &k);
}
- table[k]='\0';
+ table[k]='\0';
for (k=0;k<=ind[l].num;k++) {
if (strcmp(ind[l].p[k].page,table)==0) {
@@ -356,9 +356,9 @@ LOOP:
ind[l].num++;
if (!((ind[l].num)%16)) ind[l].p=(struct page *)xrealloc(ind[l].p,sizeof(struct page)*((int)((ind[l].num)/16)+1)*16);
- ind[l].p[ind[l].num].page=xstrdup(table);
+ ind[l].p[ind[l].num].page=xstrdup(table);
- ind[l].p[ind[l].num].enc=xstrdup(estr);
+ ind[l].p[ind[l].num].enc=xstrdup(estr);
chkpageattr(&ind[l].p[ind[l].num]);
}
}
@@ -388,15 +388,15 @@ LOOP:
nest++;
if (buff[j]==arg_close) {
if (nest==0) {
- table[k]='\0';
- ind[i].p[0].page=xstrdup(table);
+ table[k]='\0';
+ ind[i].p[0].page=xstrdup(table);
break;
}
else nest--;
}
copy_multibyte_char(buff, table, &j, &k);
}
- ind[l].p[0].enc=xstrdup(estr);
+ ind[l].p[0].enc=xstrdup(estr);
chkpageattr(&ind[i].p[0]);
}
}
@@ -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,10 @@ 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 ||
+ (strchr("ivx",*page0) && strchr(page_precedence,'r') && !pcpos)) {
+ /* heuristic detection as roman number since I=1, V=5, X=10 are quite small */
+ if (pattr[cc]<pplen-1)
pattr[cc]++;
else pattr[cc]=0;
for (j=cc+1;j<3;j++) pattr[j]=0;
@@ -546,8 +579,10 @@ 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 ||
+ (strchr("IVX",*page0) && strchr(page_precedence,'R') && !pcpos)) {
+ /* heuristic detection as roman number since I=1, V=5, X=10 are quite small */
+ if (pattr[cc]<pplen-1)
pattr[cc]++;
else pattr[cc]=0;
for (j=cc+1;j<3;j++) pattr[j]=0;
@@ -555,7 +590,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);
}
}
}