xref: /petsc/src/sys/objects/optionsyaml.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
1951eb098SLisandro Dalcin #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for strdup() */
2f996e368SLisandro Dalcin #include <petsc/private/petscimpl.h>     /*I  "petscsys.h"  I*/
3951eb098SLisandro Dalcin 
4f996e368SLisandro Dalcin #if defined(PETSC_HAVE_YAML)
5951eb098SLisandro Dalcin   #include <yaml.h> /* use external LibYAML */
6951eb098SLisandro Dalcin #else
7951eb098SLisandro Dalcin   #include <../src/sys/yaml/include/yaml.h>
8f996e368SLisandro Dalcin #endif
9f996e368SLisandro Dalcin 
10f996e368SLisandro Dalcin static MPI_Comm petsc_yaml_comm = MPI_COMM_NULL; /* only used for parallel error handling */
11f996e368SLisandro Dalcin 
12*d71ae5a4SJacob Faibussowitsch static inline MPI_Comm PetscYAMLGetComm(void)
13*d71ae5a4SJacob Faibussowitsch {
14f996e368SLisandro Dalcin   return PetscLikely(petsc_yaml_comm != MPI_COMM_NULL) ? petsc_yaml_comm : (petsc_yaml_comm = PETSC_COMM_SELF);
15f996e368SLisandro Dalcin }
16f996e368SLisandro Dalcin 
17*d71ae5a4SJacob Faibussowitsch static inline MPI_Comm PetscYAMLSetComm(MPI_Comm comm)
18*d71ae5a4SJacob Faibussowitsch {
199371c9d4SSatish Balay   MPI_Comm prev   = PetscYAMLGetComm();
209371c9d4SSatish Balay   petsc_yaml_comm = comm;
219371c9d4SSatish Balay   return prev;
22f996e368SLisandro Dalcin }
23f996e368SLisandro Dalcin 
24f996e368SLisandro Dalcin #define TAG(node) ((const char *)((node)->tag))
25f996e368SLisandro Dalcin #define STR(node) ((const char *)((node)->data.scalar.value))
26f996e368SLisandro Dalcin #define SEQ(node) ((node)->data.sequence.items)
27f996e368SLisandro Dalcin #define MAP(node) ((node)->data.mapping.pairs)
28f996e368SLisandro Dalcin 
29*d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscParseLayerYAML(PetscOptions options, yaml_document_t *doc, yaml_node_t *node)
30*d71ae5a4SJacob Faibussowitsch {
31f996e368SLisandro Dalcin   MPI_Comm comm                        = PetscYAMLGetComm();
32f996e368SLisandro Dalcin   char     name[PETSC_MAX_OPTION_NAME] = "", prefix[PETSC_MAX_OPTION_NAME] = "";
33f996e368SLisandro Dalcin 
34f996e368SLisandro Dalcin   PetscFunctionBegin;
352b8ac955SLisandro Dalcin   if (node->type == YAML_SCALAR_NODE && !STR(node)[0]) PetscFunctionReturn(0); /* empty */
3608401ef6SPierre Jolivet   PetscCheck(node->type == YAML_MAPPING_NODE, comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected mapping");
37f996e368SLisandro Dalcin   for (yaml_node_pair_t *pair = MAP(node).start; pair < MAP(node).top; pair++) {
38f996e368SLisandro Dalcin     yaml_node_t *keynode = yaml_document_get_node(doc, pair->key);
39f996e368SLisandro Dalcin     yaml_node_t *valnode = yaml_document_get_node(doc, pair->value);
40f996e368SLisandro Dalcin     PetscBool    isMergeKey, isDummyKey, isIncludeTag;
41f996e368SLisandro Dalcin 
4228b400f6SJacob Faibussowitsch     PetscCheck(keynode, comm, PETSC_ERR_LIB, "Corrupt YAML document");
4328b400f6SJacob Faibussowitsch     PetscCheck(valnode, comm, PETSC_ERR_LIB, "Corrupt YAML document");
4408401ef6SPierre Jolivet     PetscCheck(keynode->type == YAML_SCALAR_NODE, comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected scalar");
45f996e368SLisandro Dalcin 
46f996e368SLisandro Dalcin     /* "<<" is the merge key: don't increment the prefix */
479566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(STR(keynode), "<<", &isMergeKey));
48f996e368SLisandro Dalcin     if (isMergeKey) {
49f996e368SLisandro Dalcin       if (valnode->type == YAML_SEQUENCE_NODE) {
50f996e368SLisandro Dalcin         for (yaml_node_item_t *item = SEQ(valnode).start; item < SEQ(valnode).top; item++) {
51f996e368SLisandro Dalcin           yaml_node_t *itemnode = yaml_document_get_node(doc, *item);
5228b400f6SJacob Faibussowitsch           PetscCheck(itemnode, comm, PETSC_ERR_LIB, "Corrupt YAML document");
5308401ef6SPierre Jolivet           PetscCheck(itemnode->type == YAML_MAPPING_NODE, comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected mapping");
549566063dSJacob Faibussowitsch           PetscCall(PetscParseLayerYAML(options, doc, itemnode));
55f996e368SLisandro Dalcin         }
56f996e368SLisandro Dalcin       } else if (valnode->type == YAML_MAPPING_NODE) {
579566063dSJacob Faibussowitsch         PetscCall(PetscParseLayerYAML(options, doc, valnode));
58f996e368SLisandro Dalcin       } else SETERRQ(comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected sequence or mapping");
59f996e368SLisandro Dalcin       continue; /* to next pair */
60f996e368SLisandro Dalcin     }
61f996e368SLisandro Dalcin 
62f996e368SLisandro Dalcin     /* "$$*" are treated as dummy keys, we use them for !include tags and to define anchors */
639566063dSJacob Faibussowitsch     PetscCall(PetscStrbeginswith(STR(keynode), "$$", &isDummyKey));
64f996e368SLisandro Dalcin     if (isDummyKey) {
659566063dSJacob Faibussowitsch       PetscCall(PetscStrendswith(TAG(valnode), "!include", &isIncludeTag));
66f996e368SLisandro Dalcin       if (isIncludeTag) { /* TODO: add proper support relative paths */
679566063dSJacob Faibussowitsch         PetscCall(PetscOptionsInsertFileYAML(comm, options, STR(valnode), PETSC_TRUE));
68f996e368SLisandro Dalcin       }
69f996e368SLisandro Dalcin       continue; /* to next pair */
70f996e368SLisandro Dalcin     }
71f996e368SLisandro Dalcin 
72f996e368SLisandro Dalcin     if (valnode->type == YAML_SCALAR_NODE) {
739566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(name, sizeof(name), "-%s", STR(keynode)));
749566063dSJacob Faibussowitsch       PetscCall(PetscOptionsSetValue(options, name, STR(valnode)));
75f996e368SLisandro Dalcin 
76f996e368SLisandro Dalcin     } else if (valnode->type == YAML_SEQUENCE_NODE) {
77f996e368SLisandro Dalcin       PetscSegBuffer seg;
78f996e368SLisandro Dalcin       char          *buf, *strlist;
79f996e368SLisandro Dalcin       PetscBool      addSep = PETSC_FALSE;
80f996e368SLisandro Dalcin 
819566063dSJacob Faibussowitsch       PetscCall(PetscSegBufferCreate(sizeof(char), PETSC_MAX_PATH_LEN, &seg));
82f996e368SLisandro Dalcin       for (yaml_node_item_t *item = SEQ(valnode).start; item < SEQ(valnode).top; item++) {
83f996e368SLisandro Dalcin         yaml_node_t *itemnode = yaml_document_get_node(doc, *item);
84f996e368SLisandro Dalcin         const char  *itemstr  = NULL;
85f996e368SLisandro Dalcin         size_t       itemlen;
86f996e368SLisandro Dalcin 
8728b400f6SJacob Faibussowitsch         PetscCheck(itemnode, comm, PETSC_ERR_LIB, "Corrupt YAML document");
88f996e368SLisandro Dalcin 
89f996e368SLisandro Dalcin         if (itemnode->type == YAML_SCALAR_NODE) {
90f996e368SLisandro Dalcin           itemstr = STR(itemnode);
91f996e368SLisandro Dalcin 
92f996e368SLisandro Dalcin         } else if (itemnode->type == YAML_MAPPING_NODE) {
93f996e368SLisandro Dalcin           yaml_node_pair_t *kvn = itemnode->data.mapping.pairs.start;
94f996e368SLisandro Dalcin           yaml_node_pair_t *top = itemnode->data.mapping.pairs.top;
95f996e368SLisandro Dalcin 
96cc73adaaSBarry Smith           PetscCheck(top - kvn <= 1, comm, PETSC_ERR_SUP, "Unsupported YAML node value: expected a single key:value pair");
97f996e368SLisandro Dalcin           if (top - kvn > 0) {
98f996e368SLisandro Dalcin             yaml_node_t *kn = yaml_document_get_node(doc, kvn->key);
99f996e368SLisandro Dalcin             yaml_node_t *vn = yaml_document_get_node(doc, kvn->value);
100f996e368SLisandro Dalcin 
10128b400f6SJacob Faibussowitsch             PetscCheck(kn, comm, PETSC_ERR_LIB, "Corrupt YAML document");
10228b400f6SJacob Faibussowitsch             PetscCheck(vn, comm, PETSC_ERR_LIB, "Corrupt YAML document");
10308401ef6SPierre Jolivet             PetscCheck(kn->type == YAML_SCALAR_NODE, comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected scalar");
104f996e368SLisandro Dalcin 
1059566063dSJacob Faibussowitsch             PetscCall(PetscStrcmp(STR(kn), "<<", &isMergeKey));
10628b400f6SJacob Faibussowitsch             PetscCheck(!isMergeKey, comm, PETSC_ERR_SUP, "Unsupported YAML node value: merge key '<<' not supported here");
107f996e368SLisandro Dalcin 
1089566063dSJacob Faibussowitsch             PetscCall(PetscStrbeginswith(STR(kn), "$$", &isDummyKey));
109f996e368SLisandro Dalcin             if (isDummyKey) continue;
110f996e368SLisandro Dalcin             itemstr = STR(kn);
111f996e368SLisandro Dalcin           }
112f996e368SLisandro Dalcin 
1139566063dSJacob Faibussowitsch           PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "%s_", STR(keynode)));
1149566063dSJacob Faibussowitsch           PetscCall(PetscOptionsPrefixPush(options, prefix));
1159566063dSJacob Faibussowitsch           PetscCall(PetscParseLayerYAML(options, doc, itemnode));
1169566063dSJacob Faibussowitsch           PetscCall(PetscOptionsPrefixPop(options));
117f996e368SLisandro Dalcin 
118f996e368SLisandro Dalcin         } else SETERRQ(comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected scalar or mapping");
119f996e368SLisandro Dalcin 
1209566063dSJacob Faibussowitsch         PetscCall(PetscStrlen(itemstr, &itemlen));
121f996e368SLisandro Dalcin         if (itemlen) {
122f996e368SLisandro Dalcin           if (addSep) {
1239566063dSJacob Faibussowitsch             PetscCall(PetscSegBufferGet(seg, 1, &buf));
1249566063dSJacob Faibussowitsch             PetscCall(PetscArraycpy(buf, ",", 1));
125f996e368SLisandro Dalcin           }
1269566063dSJacob Faibussowitsch           PetscCall(PetscSegBufferGet(seg, itemlen, &buf));
1279566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(buf, itemstr, itemlen));
128f996e368SLisandro Dalcin           addSep = PETSC_TRUE;
129f996e368SLisandro Dalcin         }
130f996e368SLisandro Dalcin       }
1319566063dSJacob Faibussowitsch       PetscCall(PetscSegBufferGet(seg, 1, &buf));
1329566063dSJacob Faibussowitsch       PetscCall(PetscArrayzero(buf, 1));
1339566063dSJacob Faibussowitsch       PetscCall(PetscSegBufferExtractAlloc(seg, &strlist));
1349566063dSJacob Faibussowitsch       PetscCall(PetscSegBufferDestroy(&seg));
135f996e368SLisandro Dalcin 
1369566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(name, sizeof(name), "-%s", STR(keynode)));
1379566063dSJacob Faibussowitsch       PetscCall(PetscOptionsSetValue(options, name, strlist));
1389566063dSJacob Faibussowitsch       PetscCall(PetscFree(strlist));
139f996e368SLisandro Dalcin 
140f996e368SLisandro Dalcin     } else if (valnode->type == YAML_MAPPING_NODE) {
1419566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "%s_", STR(keynode)));
1429566063dSJacob Faibussowitsch       PetscCall(PetscOptionsPrefixPush(options, prefix));
1439566063dSJacob Faibussowitsch       PetscCall(PetscParseLayerYAML(options, doc, valnode));
1449566063dSJacob Faibussowitsch       PetscCall(PetscOptionsPrefixPop(options));
145f996e368SLisandro Dalcin 
146f996e368SLisandro Dalcin     } else SETERRQ(comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected scalar, sequence or mapping");
147f996e368SLisandro Dalcin   }
148f996e368SLisandro Dalcin   PetscFunctionReturn(0);
149f996e368SLisandro Dalcin }
150f996e368SLisandro Dalcin 
151f996e368SLisandro Dalcin /*@C
152811af0c4SBarry Smith    PetscOptionsInsertStringYAML - Inserts YAML-formatted options into the options database from a string
153f996e368SLisandro Dalcin 
154f996e368SLisandro Dalcin    Logically Collective
155f996e368SLisandro Dalcin 
156d8d19677SJose E. Roman    Input Parameters:
157f996e368SLisandro Dalcin +  options - options database, use NULL for default global database
158f996e368SLisandro Dalcin -  in_str - YAML-formatted string options
159f996e368SLisandro Dalcin 
160f996e368SLisandro Dalcin    Level: intermediate
161f996e368SLisandro Dalcin 
162db781477SPatrick Sanan .seealso: `PetscOptionsSetValue()`, `PetscOptionsView()`, `PetscOptionsHasName()`, `PetscOptionsGetInt()`,
163db781477SPatrick Sanan           `PetscOptionsGetReal()`, `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`,
164db781477SPatrick Sanan           `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
165c2e3fba1SPatrick Sanan           `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
166db781477SPatrick Sanan           `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
167db781477SPatrick Sanan           `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsInsertFile()`, `PetscOptionsInsertFileYAML()`
168f996e368SLisandro Dalcin @*/
169*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsInsertStringYAML(PetscOptions options, const char in_str[])
170*d71ae5a4SJacob Faibussowitsch {
171f996e368SLisandro Dalcin   MPI_Comm        comm = PetscYAMLGetComm();
172f996e368SLisandro Dalcin   yaml_parser_t   parser;
173f996e368SLisandro Dalcin   yaml_document_t doc;
174f996e368SLisandro Dalcin   yaml_node_t    *root;
175d0609cedSBarry Smith   int             err;
176f996e368SLisandro Dalcin 
177f996e368SLisandro Dalcin   PetscFunctionBegin;
178f996e368SLisandro Dalcin   if (!in_str) in_str = "";
1799371c9d4SSatish Balay   err = !yaml_parser_initialize(&parser);
1809371c9d4SSatish Balay   PetscCheck(!err, comm, PETSC_ERR_LIB, "YAML parser initialization error");
181f996e368SLisandro Dalcin   yaml_parser_set_input_string(&parser, (const unsigned char *)in_str, strlen(in_str));
182f996e368SLisandro Dalcin   do {
1839371c9d4SSatish Balay     err = !yaml_parser_load(&parser, &doc);
1849371c9d4SSatish Balay     PetscCheck(!err, comm, PETSC_ERR_LIB, "YAML parser loading error");
185f996e368SLisandro Dalcin     root = yaml_document_get_root_node(&doc);
18648a46eb9SPierre Jolivet     if (root) PetscCall(PetscParseLayerYAML(options, &doc, root));
187f996e368SLisandro Dalcin     yaml_document_delete(&doc);
188f996e368SLisandro Dalcin   } while (root);
189f996e368SLisandro Dalcin   yaml_parser_delete(&parser);
190f996e368SLisandro Dalcin   PetscFunctionReturn(0);
191f996e368SLisandro Dalcin }
192f996e368SLisandro Dalcin 
193f996e368SLisandro Dalcin /*@C
1947a30eb05SPatrick Sanan   PetscOptionsInsertFileYAML - Insert a YAML-formatted file in the options database
195f996e368SLisandro Dalcin 
196f996e368SLisandro Dalcin   Collective
197f996e368SLisandro Dalcin 
198d8d19677SJose E. Roman   Input Parameters:
199811af0c4SBarry Smith +   comm - the processes that will share the options (usually `PETSC_COMM_WORLD`)
200f996e368SLisandro Dalcin .   options - options database, use NULL for default global database
201f996e368SLisandro Dalcin .   file - name of file
202811af0c4SBarry Smith -   require - if `PETSC_TRUE` will generate an error if the file does not exist
203f996e368SLisandro Dalcin 
204811af0c4SBarry Smith   Notes:
205f996e368SLisandro Dalcin   PETSc will generate an error condition that stops the program if a YAML error
206f996e368SLisandro Dalcin   is detected, hence the user should check that the YAML file is valid before
207f996e368SLisandro Dalcin   supplying it, for instance at http://www.yamllint.com/ .
208f996e368SLisandro Dalcin 
209811af0c4SBarry Smith   Uses `PetscOptionsInsertStringYAML()`.
210f996e368SLisandro Dalcin 
211f996e368SLisandro Dalcin   Level: intermediate
212f996e368SLisandro Dalcin 
213db781477SPatrick Sanan .seealso: `PetscOptionsSetValue()`, `PetscOptionsView()`, `PetscOptionsHasName()`, `PetscOptionsGetInt()`,
214db781477SPatrick Sanan           `PetscOptionsGetReal()`, `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`,
215db781477SPatrick Sanan           `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
216c2e3fba1SPatrick Sanan           `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
217db781477SPatrick Sanan           `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
218db781477SPatrick Sanan           `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsInsertFile()`, `PetscOptionsInsertStringYAML()`
219f996e368SLisandro Dalcin @*/
220*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsInsertFileYAML(MPI_Comm comm, PetscOptions options, const char file[], PetscBool require)
221*d71ae5a4SJacob Faibussowitsch {
222f996e368SLisandro Dalcin   int         yamlLength = -1;
223f996e368SLisandro Dalcin   char       *yamlString = NULL;
224f996e368SLisandro Dalcin   MPI_Comm    prev;
225f996e368SLisandro Dalcin   PetscMPIInt rank;
226f996e368SLisandro Dalcin 
227f996e368SLisandro Dalcin   PetscFunctionBegin;
2289566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
229dd400576SPatrick Sanan   if (rank == 0) {
230f996e368SLisandro Dalcin     char   fpath[PETSC_MAX_PATH_LEN];
231f996e368SLisandro Dalcin     char   fname[PETSC_MAX_PATH_LEN];
232f996e368SLisandro Dalcin     FILE  *fd;
233f996e368SLisandro Dalcin     size_t rd;
234f996e368SLisandro Dalcin 
2359566063dSJacob Faibussowitsch     PetscCall(PetscStrreplace(PETSC_COMM_SELF, file, fpath, sizeof(fpath)));
2369566063dSJacob Faibussowitsch     PetscCall(PetscFixFilename(fpath, fname));
237f996e368SLisandro Dalcin 
238f996e368SLisandro Dalcin     fd = fopen(fname, "r");
239f996e368SLisandro Dalcin     if (fd) {
240f996e368SLisandro Dalcin       fseek(fd, 0, SEEK_END);
241f996e368SLisandro Dalcin       yamlLength = (int)ftell(fd);
242f996e368SLisandro Dalcin       fseek(fd, 0, SEEK_SET);
24308401ef6SPierre Jolivet       PetscCheck(yamlLength >= 0, PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN, "Unable to query size of YAML file: %s", fname);
2449566063dSJacob Faibussowitsch       PetscCall(PetscMalloc1(yamlLength + 1, &yamlString));
245f996e368SLisandro Dalcin       rd = fread(yamlString, 1, (size_t)yamlLength, fd);
246cc73adaaSBarry Smith       PetscCheck(rd == (size_t)yamlLength, PETSC_COMM_SELF, PETSC_ERR_FILE_READ, "Unable to read entire YAML file: %s", fname);
247f996e368SLisandro Dalcin       yamlString[yamlLength] = 0;
248f996e368SLisandro Dalcin       fclose(fd);
249f996e368SLisandro Dalcin     }
250f996e368SLisandro Dalcin   }
251f996e368SLisandro Dalcin 
2529566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Bcast(&yamlLength, 1, MPI_INT, 0, comm));
253cc73adaaSBarry Smith   PetscCheck(!require || yamlLength >= 0, comm, PETSC_ERR_FILE_OPEN, "Unable to open YAML option file: %s", file);
254f996e368SLisandro Dalcin   if (yamlLength < 0) PetscFunctionReturn(0);
255f996e368SLisandro Dalcin 
2569566063dSJacob Faibussowitsch   if (rank) PetscCall(PetscMalloc1(yamlLength + 1, &yamlString));
2579566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Bcast(yamlString, yamlLength + 1, MPI_CHAR, 0, comm));
258f996e368SLisandro Dalcin 
259f996e368SLisandro Dalcin   prev = PetscYAMLSetComm(comm);
2609566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInsertStringYAML(options, yamlString));
261f996e368SLisandro Dalcin   (void)PetscYAMLSetComm(prev);
262f996e368SLisandro Dalcin 
2639566063dSJacob Faibussowitsch   PetscCall(PetscFree(yamlString));
264f996e368SLisandro Dalcin   PetscFunctionReturn(0);
265f996e368SLisandro Dalcin }
266951eb098SLisandro Dalcin 
267951eb098SLisandro Dalcin #if !defined(PETSC_HAVE_YAML)
268951eb098SLisandro Dalcin 
269951eb098SLisandro Dalcin   /*
270951eb098SLisandro Dalcin #if !defined(PETSC_HAVE_STRDUP)
271951eb098SLisandro Dalcin #define strdup(s) (char*)memcpy(malloc(strlen(s)+1),s,strlen(s)+1)
272951eb098SLisandro Dalcin #endif
273951eb098SLisandro Dalcin */
274951eb098SLisandro Dalcin 
275951eb098SLisandro Dalcin   /* Embed LibYAML in this compilation unit */
276951eb098SLisandro Dalcin   #include <../src/sys/yaml/src/api.c>
277951eb098SLisandro Dalcin   #include <../src/sys/yaml/src/loader.c>
278951eb098SLisandro Dalcin   #include <../src/sys/yaml/src/parser.c>
279951eb098SLisandro Dalcin   #include <../src/sys/yaml/src/reader.c>
2806d1d8577SJunchao Zhang 
2816d1d8577SJunchao Zhang   /*
2826d1d8577SJunchao Zhang   Avoid compiler warnings like
2836d1d8577SJunchao Zhang     scanner.c, line 3181: warning: integer conversion resulted in a change of sign
2846d1d8577SJunchao Zhang                           *(string.pointer++) = '\xC2';
2856d1d8577SJunchao Zhang 
2866d1d8577SJunchao Zhang   Once yaml fixes them, we can remove the pragmas
2876d1d8577SJunchao Zhang */
2886d1d8577SJunchao Zhang   #pragma GCC diagnostic push
2896d1d8577SJunchao Zhang   #pragma GCC diagnostic ignored "-Wsign-conversion"
290951eb098SLisandro Dalcin   #include <../src/sys/yaml/src/scanner.c>
2916d1d8577SJunchao Zhang   #pragma GCC diagnostic pop
292951eb098SLisandro Dalcin 
293951eb098SLisandro Dalcin /* Silence a few unused-function warnings */
294*d71ae5a4SJacob Faibussowitsch static PETSC_UNUSED void petsc_yaml_unused(void)
295*d71ae5a4SJacob Faibussowitsch {
296951eb098SLisandro Dalcin   (void)yaml_parser_scan;
297951eb098SLisandro Dalcin   (void)yaml_document_get_node;
298951eb098SLisandro Dalcin   (void)yaml_parser_set_encoding;
299951eb098SLisandro Dalcin   (void)yaml_parser_set_input;
300951eb098SLisandro Dalcin   (void)yaml_parser_set_input_file;
301951eb098SLisandro Dalcin }
302951eb098SLisandro Dalcin 
303951eb098SLisandro Dalcin #endif
304