static int wrstr(int fn, char *buf, int len, int echocheck) { int i; char dbuf[BUFSIZ], *dbptr = dbuf; buf[len] = 0; if (echocheck) return (wrchr(fn, buf, len)); if (Debug >= 5) { if (sysaccess(ACCESS_SYSTEMS) == 0) { /* Systems file access ok */ for (i = 0; i < len; i++) { *dbptr = buf[i]; if (*dbptr < 040) { *dbptr++ = '^'; *dbptr = buf[i] | 0100; } dbptr++; } *dbptr = 0; } else (void) strcpy(dbuf, "????????"); CDEBUG(5, "%s", dbuf); } if ((*Write)(fn, buf, len) != len) return (FAIL); return (SUCCESS); }
/* Create an initialized regular expression object. The pattern should include the slash delimiters. For example: /abc/ or /abc/g */ EjsRegExp *ejsCreateRegExp(Ejs *ejs, EjsString *pattern) { EjsRegExp *rp; cchar *errMsg; MprChar *flags; int column, errCode; if (pattern->length == 0 || pattern->value[0] != '/') { ejsThrowArgError(ejs, "Bad regular expression pattern. Must start with '/'"); return 0; } rp = ejsCreateObj(ejs, ESV(RegExp), 0); if (rp != 0) { /* Strip off flags for passing to pcre_compile2 */ rp->pattern = sclone(&pattern->value[1]); if ((flags = wrchr(rp->pattern, '/')) != 0) { rp->options = parseFlags(rp, &flags[1]); *flags = 0; } // TODO - UNICODE is pattern meant to be rp->compiled = pcre_compile2(rp->pattern, rp->options, &errCode, &errMsg, &column, NULL); if (rp->compiled == NULL) { ejsThrowArgError(ejs, "Can't compile regular expression '%s'. Error %s at column %d", rp->pattern, errMsg, column); return 0; } } return rp; }
/* Parse a regular expression string. The string should include the slash delimiters and may contain appended flags. For example: /abc/ or /abc/g */ PUBLIC EjsRegExp *ejsParseRegExp(Ejs *ejs, EjsString *pattern) { EjsRegExp *rp; cchar *errMsg; char *cp, *dp; wchar *flags; int column, errCode; if (pattern->length == 0 || pattern->value[0] != '/') { ejsThrowArgError(ejs, "Bad regular expression pattern. Must start with '/'"); return 0; } if ((rp = ejsCreateObj(ejs, ESV(RegExp), 0)) == 0) { return 0; } /* Strip off flags for passing to pcre_compile2 */ if (pattern->value[0] == '/') { rp->pattern = sclone(&pattern->value[1]); if ((flags = wrchr(rp->pattern, '/')) != 0) { if (flags == rp->pattern) { ejsThrowArgError(ejs, "Bad regular expression pattern. Must end with '/'"); return 0; } rp->options = parseFlags(rp, &flags[1]); *flags = 0; } /* NOTE: we don't expect backquotes to be quoted. That only happens when interpreting literal js code and JSON */ for (dp = cp = rp->pattern; *cp; ) { if (*cp == '\\' && cp[1] == '/') { cp++; } *dp++ = *cp++; } *dp++ = '\0'; } else { rp->pattern = sclone(&pattern->value[1]); } rp->compiled = pcre_compile2(rp->pattern, rp->options, &errCode, &errMsg, &column, NULL); if (rp->compiled == NULL) { ejsThrowArgError(ejs, "Cannot compile regular expression '%s'. Error %s at column %d", rp->pattern, errMsg, column); return 0; } return rp; }