- if (P->flags & PSI_PARSER_DEBUG) {
- fprintf(stderr, "PSI> Fill: consumed=%zu reserved=%zu available=%zu didread=%zu\n",
- consumed, reserved, available, didread);
+ return true;
+}
+
+bool psi_parser_open_string(struct psi_parser *P, const char *string, size_t length)
+{
+ P->input.type = PSI_PARSE_STRING;
+ P->input.data.string.length = length;
+ if (!(P->input.data.string.buffer = strndup(string, length))) {
+ return false;
+ }
+
+ P->file.fn = strdup("<input>");
+
+ return true;
+}
+
+static ssize_t psi_parser_fill(struct psi_parser *P, size_t n)
+{
+ PSI_DEBUG_PRINT(P, "PSI> Fill: n=%zu (input.type=%d)\n", n, P->input.type);
+
+ /* init if n==0 */
+ if (!n) {
+ switch (P->input.type) {
+ case PSI_PARSE_FILE:
+ P->cur = P->tok = P->mrk = P->input.data.file.buffer;
+#if HAVE_MMAP
+ P->eof = P->input.data.file.buffer + P->input.data.file.length;
+ P->lim = P->eof;
+#else
+ P->eof = NULL;
+ P->lim = P->input.data.file.buffer;
+#endif
+ break;
+
+ case PSI_PARSE_STRING:
+ P->cur = P->tok = P->mrk = P->input.data.string.buffer;
+ P->eof = P->input.data.string.buffer + P->input.data.string.length;
+ P->lim = P->eof;
+ break;