sam, acme: fix character classes quoting for 21-bit runes
quote handling was broken with 21-bit runes. nextrec() returned quoted rune as long rune | (Runemax+1) to escape it. with 16-bit runes, storing that long into 16-bit Rune would automatically remove the escaping, but with 21-bit runes, Rune is uint32 so the escaping would remain. we now use (Runemask+1) instead, and mask the escaping off explicitely when storing back to Rune.
This commit is contained in:
parent
5b5eb3b4b4
commit
50e2c9b4d4
2 changed files with 8 additions and 8 deletions
|
@ -455,7 +455,7 @@ nextrec(void)
|
|||
exprp++;
|
||||
return '\n';
|
||||
}
|
||||
return *exprp++|(Runemax+1);
|
||||
return *exprp++|(Runemask+1);
|
||||
}
|
||||
return *exprp++;
|
||||
}
|
||||
|
@ -491,11 +491,11 @@ bldcclass(void)
|
|||
if((c2 = nextrec()) == ']')
|
||||
goto Error;
|
||||
classp[n+0] = Runemax;
|
||||
classp[n+1] = c1;
|
||||
classp[n+2] = c2;
|
||||
classp[n+1] = c1 & Runemask;
|
||||
classp[n+2] = c2 & Runemask;
|
||||
n += 3;
|
||||
}else
|
||||
classp[n++] = c1;
|
||||
classp[n++] = c1 & Runemask;
|
||||
}
|
||||
classp[n] = 0;
|
||||
if(nclass == Nclass){
|
||||
|
|
|
@ -462,7 +462,7 @@ nextrec(void){
|
|||
exprp++;
|
||||
return '\n';
|
||||
}
|
||||
return *exprp++|(Runemax+1);
|
||||
return *exprp++|(Runemask+1);
|
||||
}
|
||||
return *exprp++;
|
||||
}
|
||||
|
@ -498,11 +498,11 @@ bldcclass(void)
|
|||
if((c2 = nextrec()) == ']')
|
||||
goto Error;
|
||||
classp[n+0] = Runemax;
|
||||
classp[n+1] = c1;
|
||||
classp[n+2] = c2;
|
||||
classp[n+1] = c1 & Runemask;
|
||||
classp[n+2] = c2 & Runemask;
|
||||
n += 3;
|
||||
}else
|
||||
classp[n++] = c1;
|
||||
classp[n++] = c1 & Runemask;
|
||||
}
|
||||
classp[n] = 0;
|
||||
if(nclass == Nclass){
|
||||
|
|
Loading…
Reference in a new issue