+ /* Convert name, which is always lower-case. */
+ if (ISLOWER (*p))
+ {
+ do
+ *d++ = *p++;
+ while (ISLOWER(*p) || ISDIGIT (*p)
+ || (p[0] == '_' && (ISLOWER (p[1]) || ISDIGIT (p[1]))));
+ }
+ else if (p[0] == 'O')
+ {
+ static const char * const operators[][2] =
+ {{"Oabs", "abs"}, {"Oand", "and"}, {"Omod", "mod"},
+ {"Onot", "not"}, {"Oor", "or"}, {"Orem", "rem"},
+ {"Oxor", "xor"}, {"Oeq", "="}, {"One", "/="},
+ {"Olt", "<"}, {"Ole", "<="}, {"Ogt", ">"},
+ {"Oge", ">="}, {"Oadd", "+"}, {"Osubtract", "-"},
+ {"Oconcat", "&"}, {"Omultiply", "*"}, {"Odivide", "/"},
+ {"Oexpon", "**"}, {NULL, NULL}};
+ int k;
+
+ for (k = 0; operators[k][0]; k++)
+ {
+ int l = strlen (operators[k][0]);
+ if (!strncmp (p, operators[k][0], l))
+ {
+ p += l;
+ l = strlen (operators[k][1]);
+ *d++ = '"';
+ memcpy (d, operators[k][1], l);
+ d += l;
+ *d++ = '"';
+ break;
+ }
+ }
+ /* Operator not found. */
+ if (!operators[k][0])
+ goto unknown;
+ }