/*
* Example entries from the isc file:
"after","Prep","1.³á~ÊÚÄ"
We shall meet here the day after tomarrow.
Day after day I tried to meet him but could not.
My name comes after yours in the roll call.
After all your ill conduct, I do not wish to speak to you.
She arrived just after lunch.
--"2.³Ü~°Ï"
The children stared after the detectives dressed
I ran after him to tell him to meet me later.
I'm after a job in the hospital.
--"3.³á~ÊÚÏá~Ìá¢"
I inquired after him and come to know that he was ill.
--"4.³á~¤ÆÝ×ÏÁ~ÈÏ"
He was named after his grandfather and really emerged just like him.
"after","Adj","1.ÊÚÄ~³Ú"
We shall rectify these problems in the after years.
* Sometimes there are malformed entries:
"abstract","V","1.ؽÚ~ÑáÆÚ"
Two other points must be abstracted to the lecture.
--"2."×¢³èÖÛÈèÂ~ÊÆÚÆÚ/×¢³èÖáÈ~³ÏÆÚ"
Most of the famous novels are abstracted.
(The third line has a quote sign too much.)
* There are bytes in the hindi that are not explained
by the ISCII-1991 standard: 237 and 254.
* The empty line separating entries sometimes contains whitespace.
* Sometimes there are 3 minus signs indicating
alternatives instead of 2 only.
* Sometimes even missing final quotes (need to be corrected in the input file):
"depress","VT","1.ÄÊÚÆÚ"
The glut of oil depressed gas prices
--"2.¨ÄÚ× ³ÏÆÚ
These news depressed her
--"3.³Ì ³ÏÆÚ
The lack of rain had depressed the water level in the reservoir
--"4.ÌÆèÄ ³ÏÆÚ
The rising inflation depressed the economy
* Sometimes missing "1." indicating the definition number:
"haltingly","Adv","ÔÛÏÑ ×á ÊåÑÆá ÔÚÑÚ"
¨Ìá× ³Ü ºÊÚÆ"haltingly"ºÆèÌ ×á ØÜ Øâ.
* Sometimes space follows the final quoatation mark in a line:
(third line here):
"crave","VT","1.ÑÚÑ×Ú~³ÏÆÚ/¤ËÛÑÚÖÚ~³ÏÆÚ"
In my childhood,I craved for my parent's attention.
--"2.ÍÚ¸ÆÚ~³ÏÆÚ"
She craved for her husband's life.
* Sometimes the definition is missing:
"clonk","N","1."
I could hear the clonk of aircrafts.
These entries in the source file got a comment
added saying "# definition missing".
* sometimes example sentences span two lines - it's
'impossible' for the scanner to spell this apart from
two ex. sentences.
* Sometimes after a DEFINITION the lines contain #-comments.
They don't get translated into the XML file!
"cloze test","N","1.³èÑåºé~½á×è½" #ÏÛ³èÂ~×èÃÚÆå~³Ü~ÈÞÏèÂÜ~רÜ~ÕÊèÄå~×á~³ÏÆá~³Ü~ÈÏܳèÖÚ
We had to take a cloze test before joining the English teaching course.
* Are there superfluous spaces after the definition sometimes?
"stern","Adj","1.³¾åÏ ÍÚ ÆÛÏèÄÍ"
Hotler was a stern man.
--"2.ºéØÚºé ³Ú ÈÛ¹ÑÚ ËÚµ' "
When an iceberg was seen in front of a ship, people tried to escape from the stern part.
* Sometimes the source file contains malformed entries
where there comes a quote directly after the
alternative number:
"weighed-anchor","V","1.ÈÚÆÜ ×á Ñ¢µÏ ¨¾Ú ÑáÆÚ ±Ï ºÚÆá ³á ÑÛ¬ ÂâÍÚÏ ÏØÆÚ"
The steamer blow a whistle and weighed anchor to start.
--"2."רÍåµ/רÚÏÚ"
Without the anchor of his wife's support,he couldn't have been successful.
--------
* Sometimes the translation has alternatives separated by "/"
-> is translated into several
-Elements
"absurd","Adj","1.ÆÛÏÏèó/ÊáÂݳÚ"
I find his ideas absurd.
--"2.ÌÞÏè´/ÊÝÄèÅÛÏÞÄèÅ"
That dress makes them look absurd.
* standardize POS contents
* sometimes the example sentence is in Hindi.
"author","N","1.Ñá´³"
Shakespeare is my favorite author.
Õá³è×ÈÛÍÏ ÌáÏá ÈèÏÛÍ Ñá´³ Øâ.
--"2.ÈèÏÔÏè³ "
Ram is the author of the proposal so he can't comment.
ÏÚÌ ¦× ÈèÏ×èÂÚÔ ³Ú ÈèÏÔÏè³ Øâ ¤Â: ÔØ ½ÛÈèÈÁÜ ÆØÜ¢ ³Ï ׳ÂÚ .
--------
*/
%option yylineno
%s HEADWORD POS DEFINITION DE1 EXAMPLE EX1 ALTERNATIVE
int num_entries = 0;
void printEscaped(char *str) {
while (*str != '\0') {
switch(*str) {
case '"': printf("""); break;
case '&': printf("&"); break;
case '<': printf("<"); break;
case '>': printf(">"); break;
case '`': printf("‘"); break;
case '’': printf("’"); break;
default:
if(*str>128) fprintf(stderr,"Don't know how to escape '%c'",*str);
putchar(*str);
}
str++;
}
}
void printfIscii2Utf8(char *str) {
unsigned char u8[3],c,s[]=" ";
int u;
if(0==strncmp("Liberty to hold one",str,19))
fprintf(stderr,"yylineno: %i '%s' %hu\n",yylineno,str,(*(str+19) & 255));
while (*str != '\0') {
c = *str;
//printf("%i\n",c);
// Iscii-1991 -> UCS-2
if(c<0x80) u = c;
else if (c=='`') u=0x2018;
else if (c=='’') u=0x2019;
else if (c==146) u=0x2019;
else if(c<0xa0) {
fprintf(stderr,"problem char: %c",c);
u = c;}
else switch(c) {
case 0xa1:
case 0xa2:
case 0xa3:u=0x900+c-0xa0; break;
case 0xa4:
case 0xa5:
case 0xa6:
case 0xa7:
case 0xa8:
case 0xa9:
case 0xaa:u=0x900+c-0x9f; break;
case 0xab:u=0x90e; break;
case 0xac:u=0x90f; break;
case 0xad:u=0x910; break;
case 0xae:u=0x90d; break;
case 0xaf:u=0x912; break;
case 0xb0:u=0x913; break;
case 0xb1:u=0x914; break;
case 0xb2:u=0x911; break;
case 0xb3:u=0x915; break;
case 0xb4:
case 0xb5:
case 0xb6:
case 0xb7:
case 0xb8:
case 0xb9:
case 0xba:
case 0xbb:
case 0xbc:
case 0xbd:
case 0xbe:
case 0xbf:
case 0xc0:
case 0xc1:
case 0xc2:
case 0xc3:
case 0xc4:
case 0xc5:
case 0xc6:
case 0xc7:
case 0xc8:
case 0xc9:
case 0xca:
case 0xcb:
case 0xcc:
case 0xcd:u=0x900+c-0x9e; break;// should become 0x92f
case 0xce:u=0x95f; break;
case 0xcf:
case 0xd0:
case 0xd1:
case 0xd2:
case 0xd3:
case 0xd4:
case 0xd5:
case 0xd6:
case 0xd7:
case 0xd8:u=0x900+c-0x9f;break;// should become 0x939
case 0xda:
case 0xdb:
case 0xdc:
case 0xdd:
case 0xde:
case 0xdf:u=0x900+c-0x9c;break;// should become 0x943
case 0xe0:
case 0xe1:
case 0xe2:u=0x900+c-0x9a;break;// should become 0x948
case 0xe3:u=0x945; break;
case 0xe4:
case 0xe5:
case 0xe6:u=0x900+c-0x9a;break;// should become 0x94c
case 0xe7:u=0x949; break;
case 0xe8:u=0x94d; break;
case 0xe9:u=0x93c; break;
case 0xea:u=0x964; break;
case 0xf1:
case 0xf2:
case 0xf3:
case 0xf4:
case 0xf5:
case 0xf6:
case 0xf7:
case 0xf8:
case 0xf9:
case 0xfa:u=0x900+c-0x8b; break;// should become 0x96f
case 0xfb:
case 0xfc:
case 0xfd:
case 0xfe:
case 0xff:
case 0xf0:
case 0xeb:
case 0xec:
case 0xed:
case 0xee:
case 0xef:
case 0xd9:
case 0xa0:
default: fprintf(stderr,"line %i: not my iscii range: %i\n",yylineno,c);u='?';
};
// UCS-2 -> Utf8:
if(u>0xefff) { fprintf(stderr,"not my utf8 range");exit(1); }
if(u<0x80) { s[0]=u;s[1]=0;printEscaped(s);
if(u=='’') fprintf(stderr,"%c",s[0]);
// so we don't just output utf8, but even
// escape some sgml specific chars
}
else if(u<0x800) {
// 00000yyy yyxxxxxx -> 110yyyyy 10xxxxxx
u8[0] = 0xc0 | ((u>>6) & 0x1f);
u8[1] = 0x80 | (u & 0x3f);
printf("%c%c",u8[0],u8[1]);
}
else {
// zzzzyyyy yyxxxxxx -> 1110zzzz 10yyyyyy 10xxxxxx
u8[0] = 0xe0 | ((u>>12) & 0xf);
u8[1] = 0x80 | ((u>>6) & 0x3f);
u8[2] = 0x80 | (u & 0x3f);
//printf("(%x %x %x)",u8[0],u8[1],u8[2]);
printf("%c%c%c",u8[0],u8[1],u8[2]);
}
str++;
}
}
OPTCOMMENT ("#"[^\n]*)?
WHITESPACE [ \t]*
%%
\" printf("\n"); BEGIN(HEADWORD);
[^"]+ printf(" \n",yytext);
\",\" BEGIN(POS);
[^"]+ printf(" %s\n",yytext);
\",\"[1-9]\. {
printf(" \n ",yytext[3]); BEGIN(DEFINITION);
}
\",\" {
printf(" \n "); BEGIN(DEFINITION);
}
[^\"/]+\/ {
printf("");
yytext[yyleng-1]='\0';// remove trailing '/'
printfIscii2Utf8(yytext);
printf("
");
}
[^\"/]+/\" {
printf("");
printfIscii2Utf8(yytext);
printf("
\n");
BEGIN(DE1);
}
\"{WHITESPACE}{OPTCOMMENT}\n BEGIN(EXAMPLE);
\"{WHITESPACE}{OPTCOMMENT}/\n{WHITESPACE}\n BEGIN(EX1);
[^\n]+ {
printf(" ");
/* special chars like " and & also get encoded! */
printfIscii2Utf8(yytext);
printf("
\n"); BEGIN(EX1);
}
\n--\"[1-9]\. {
printf(" \n \n ",yytext[4]);
BEGIN(DEFINITION);// Alternative
}
\n---\"[1-9]\. {
printf(" \n \n ",yytext[5]);
BEGIN(DEFINITION);// Alternative
}
\n{WHITESPACE}\n {
printf(" \n \n\n"); num_entries++;
if(num_entries) BEGIN(INITIAL);
else return 0;
}
\n BEGIN(EXAMPLE);
<> printf(" \n \n"); yyterminate();
. {
fprintf(stderr, "Malformed input in line %i: %s\n",yylineno,yytext); }
%%
int main() {
yylex();
printf("