+
+/* escape BRE meta-characters in a string */
+char *
+literalize(s)
+ char *s;
+{
+ static char *hd = NULL;
+
+ char *t;
+ int size;
+ int offset;
+ int m;
+
+ free(hd);
+ if ((hd = t = (char *) malloc(size = 2 * strlen(s) + 1)) == NULL) {
+ regerr("out of memory");
+ return NULL;
+ }
+ if (*o_magic)
+ while (*s) {
+ if (*s == '~' || *s == '&') {
+ regerr("can't use ~ or & in pattern");
+ return NULL;
+ } else if (*s == '\\') {
+ s++;
+ if (isdigit(*s)) {
+ regerr("can't use \\d in pattern");
+ return NULL;
+ } else if (*s == '&' || *s == '~') {
+ *t++ = '\\';
+ *t++ = *s++;
+ }
+ } else if (*s == '^' || *s == '$' || *s == '.' ||
+ *s == '[' || *s == '*') {
+ *t++ = '\\';
+ *t++ = *s++;
+ } else
+ *t++ = *s++;
+ }
+ else
+ while (*s) {
+ if (*s == '\\') {
+ s++;
+ if (*s == '&' || *s == '~') {
+ regerr("can't use \\~ or \\& in pattern");
+ return NULL;
+ } else if (isdigit(*s)) {
+ regerr("can't use \\d in pattern");
+ return NULL;
+ }
+ } else
+ *t++ = *s++;
+ }
+ *t = '\0';
+ return hd;
+}
+