mirror of
https://github.com/Kitware/CMake.git
synced 2026-11-06 05:16:58 +00:00
88 lines
2.8 KiB
C
88 lines
2.8 KiB
C
/* Distributed under the OSI-approved BSD 3-Clause License.
|
|
See accompanying file LICENSE.rst for details. */
|
|
|
|
#include "llpkgc_file.h"
|
|
#include "llpkgc_whitespace__internal.h"
|
|
|
|
/* Callback dispatch and EOF recipes are generated from the grammar. Pending
|
|
* punctuation is owned by the parser. Deferred whitespace is borrowed only
|
|
* under the explicit PFCE_NEED_MORE retention contract. */
|
|
int llpkgc_file__on_ident(llpkgc_file_t*, const unsigned char*,
|
|
const unsigned char*);
|
|
int llpkgc_file__on_value_literal(llpkgc_file_t*, const unsigned char*,
|
|
const unsigned char*);
|
|
int llpkgc_file__on_value_literal_complete(llpkgc_file_t*, const unsigned char*,
|
|
const unsigned char*);
|
|
|
|
int llpkgc_file__mark(llpkgc_file_t* s, const unsigned char* p,
|
|
const unsigned char* endp) {
|
|
s->mark = *p;
|
|
return 0;
|
|
}
|
|
|
|
int llpkgc_file__emit_ident_mark(llpkgc_file_t* s, const unsigned char* p,
|
|
const unsigned char* endp) {
|
|
const unsigned char* mark = &s->mark;
|
|
return llpkgc_file__on_ident(s, mark, mark + 1);
|
|
}
|
|
|
|
int llpkgc_file__emit_literal_mark(llpkgc_file_t* s, const unsigned char* p,
|
|
const unsigned char* endp) {
|
|
const unsigned char* mark = &s->mark;
|
|
return llpkgc_file__on_value_literal(s, mark, mark + 1);
|
|
}
|
|
|
|
int llpkgc_file__clear_whitespace(llpkgc_file_t* s, const unsigned char* p,
|
|
const unsigned char* endp) {
|
|
s->whitespace_start = NULL;
|
|
s->whitespace_end = NULL;
|
|
return 0;
|
|
}
|
|
|
|
int llpkgc_file__whitespace(llpkgc_file_t* s, const unsigned char* p,
|
|
const unsigned char* endp) {
|
|
if(s->whitespace_start == NULL)
|
|
s->whitespace_start = (void*) p;
|
|
s->whitespace_end = (void*) endp;
|
|
return 0;
|
|
}
|
|
|
|
/* The private delivery grammar emits each physical range separately. */
|
|
int llpkgc_file__deferred_span(llpkgc_whitespace__internal_t* delivery,
|
|
const unsigned char* p, const unsigned char* endp) {
|
|
llpkgc_file_t* s = delivery->parent;
|
|
int err;
|
|
if(p == endp)
|
|
return 0;
|
|
err = llpkgc_file__on_value_literal(s, p, endp);
|
|
if(err != 0)
|
|
return err;
|
|
return llpkgc_file__on_value_literal_complete(s, p, endp);
|
|
}
|
|
|
|
int llpkgc_file__flush_whitespace_all(llpkgc_file_t* s, const unsigned char* p,
|
|
const unsigned char* endp) {
|
|
llpkgc_whitespace__internal_t delivery;
|
|
int err;
|
|
if(s->whitespace_start == NULL)
|
|
return 0;
|
|
llpkgc_whitespace__internal_init(&delivery);
|
|
delivery.parent = s;
|
|
err = llpkgc_whitespace__internal_execute(&delivery, s->whitespace_start,
|
|
s->whitespace_end);
|
|
if(err != 0 && s->reason == NULL)
|
|
s->reason = delivery.reason;
|
|
llpkgc_file__clear_whitespace(s, p, endp);
|
|
return err;
|
|
}
|
|
|
|
const char* llpkgc_file_get_retained_start(const llpkgc_file_t* s) {
|
|
return s->whitespace_start;
|
|
}
|
|
|
|
size_t llpkgc_file_get_retained_length(const llpkgc_file_t* s) {
|
|
if(s->whitespace_start == NULL)
|
|
return 0;
|
|
return (size_t) ((const char*) s->end - (const char*) s->whitespace_start);
|
|
}
|