xref: /petsc/src/sys/objects/optionsyaml.c (revision 811af0c4b09a35de4306c442f88bd09fdc09897d)
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 
129371c9d4SSatish Balay static inline MPI_Comm PetscYAMLGetComm(void) {
13f996e368SLisandro Dalcin   return PetscLikely(petsc_yaml_comm != MPI_COMM_NULL) ? petsc_yaml_comm : (petsc_yaml_comm = PETSC_COMM_SELF);
14f996e368SLisandro Dalcin }
15f996e368SLisandro Dalcin 
169371c9d4SSatish Balay static inline MPI_Comm PetscYAMLSetComm(MPI_Comm comm) {
179371c9d4SSatish Balay   MPI_Comm prev   = PetscYAMLGetComm();
189371c9d4SSatish Balay   petsc_yaml_comm = comm;
199371c9d4SSatish Balay   return prev;
20f996e368SLisandro Dalcin }
21f996e368SLisandro Dalcin 
22f996e368SLisandro Dalcin #define TAG(node) ((const char *)((node)->tag))
23f996e368SLisandro Dalcin #define STR(node) ((const char *)((node)->data.scalar.value))
24f996e368SLisandro Dalcin #define SEQ(node) ((node)->data.sequence.items)
25f996e368SLisandro Dalcin #define MAP(node) ((node)->data.mapping.pairs)
26f996e368SLisandro Dalcin 
279371c9d4SSatish Balay static PetscErrorCode PetscParseLayerYAML(PetscOptions options, yaml_document_t *doc, yaml_node_t *node) {
28f996e368SLisandro Dalcin   MPI_Comm comm                        = PetscYAMLGetComm();
29f996e368SLisandro Dalcin   char     name[PETSC_MAX_OPTION_NAME] = "", prefix[PETSC_MAX_OPTION_NAME] = "";
30f996e368SLisandro Dalcin 
31f996e368SLisandro Dalcin   PetscFunctionBegin;
322b8ac955SLisandro Dalcin   if (node->type == YAML_SCALAR_NODE && !STR(node)[0]) PetscFunctionReturn(0); /* empty */
3308401ef6SPierre Jolivet   PetscCheck(node->type == YAML_MAPPING_NODE, comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected mapping");
34f996e368SLisandro Dalcin   for (yaml_node_pair_t *pair = MAP(node).start; pair < MAP(node).top; pair++) {
35f996e368SLisandro Dalcin     yaml_node_t *keynode = yaml_document_get_node(doc, pair->key);
36f996e368SLisandro Dalcin     yaml_node_t *valnode = yaml_document_get_node(doc, pair->value);
37f996e368SLisandro Dalcin     PetscBool    isMergeKey, isDummyKey, isIncludeTag;
38f996e368SLisandro Dalcin 
3928b400f6SJacob Faibussowitsch     PetscCheck(keynode, comm, PETSC_ERR_LIB, "Corrupt YAML document");
4028b400f6SJacob Faibussowitsch     PetscCheck(valnode, comm, PETSC_ERR_LIB, "Corrupt YAML document");
4108401ef6SPierre Jolivet     PetscCheck(keynode->type == YAML_SCALAR_NODE, comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected scalar");
42f996e368SLisandro Dalcin 
43f996e368SLisandro Dalcin     /* "<<" is the merge key: don't increment the prefix */
449566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(STR(keynode), "<<", &isMergeKey));
45f996e368SLisandro Dalcin     if (isMergeKey) {
46f996e368SLisandro Dalcin       if (valnode->type == YAML_SEQUENCE_NODE) {
47f996e368SLisandro Dalcin         for (yaml_node_item_t *item = SEQ(valnode).start; item < SEQ(valnode).top; item++) {
48f996e368SLisandro Dalcin           yaml_node_t *itemnode = yaml_document_get_node(doc, *item);
4928b400f6SJacob Faibussowitsch           PetscCheck(itemnode, comm, PETSC_ERR_LIB, "Corrupt YAML document");
5008401ef6SPierre Jolivet           PetscCheck(itemnode->type == YAML_MAPPING_NODE, comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected mapping");
519566063dSJacob Faibussowitsch           PetscCall(PetscParseLayerYAML(options, doc, itemnode));
52f996e368SLisandro Dalcin         }
53f996e368SLisandro Dalcin       } else if (valnode->type == YAML_MAPPING_NODE) {
549566063dSJacob Faibussowitsch         PetscCall(PetscParseLayerYAML(options, doc, valnode));
55f996e368SLisandro Dalcin       } else SETERRQ(comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected sequence or mapping");
56f996e368SLisandro Dalcin       continue; /* to next pair */
57f996e368SLisandro Dalcin     }
58f996e368SLisandro Dalcin 
59f996e368SLisandro Dalcin     /* "$$*" are treated as dummy keys, we use them for !include tags and to define anchors */
609566063dSJacob Faibussowitsch     PetscCall(PetscStrbeginswith(STR(keynode), "$$", &isDummyKey));
61f996e368SLisandro Dalcin     if (isDummyKey) {
629566063dSJacob Faibussowitsch       PetscCall(PetscStrendswith(TAG(valnode), "!include", &isIncludeTag));
63f996e368SLisandro Dalcin       if (isIncludeTag) { /* TODO: add proper support relative paths */
649566063dSJacob Faibussowitsch         PetscCall(PetscOptionsInsertFileYAML(comm, options, STR(valnode), PETSC_TRUE));
65f996e368SLisandro Dalcin       }
66f996e368SLisandro Dalcin       continue; /* to next pair */
67f996e368SLisandro Dalcin     }
68f996e368SLisandro Dalcin 
69f996e368SLisandro Dalcin     if (valnode->type == YAML_SCALAR_NODE) {
709566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(name, sizeof(name), "-%s", STR(keynode)));
719566063dSJacob Faibussowitsch       PetscCall(PetscOptionsSetValue(options, name, STR(valnode)));
72f996e368SLisandro Dalcin 
73f996e368SLisandro Dalcin     } else if (valnode->type == YAML_SEQUENCE_NODE) {
74f996e368SLisandro Dalcin       PetscSegBuffer seg;
75f996e368SLisandro Dalcin       char          *buf, *strlist;
76f996e368SLisandro Dalcin       PetscBool      addSep = PETSC_FALSE;
77f996e368SLisandro Dalcin 
789566063dSJacob Faibussowitsch       PetscCall(PetscSegBufferCreate(sizeof(char), PETSC_MAX_PATH_LEN, &seg));
79f996e368SLisandro Dalcin       for (yaml_node_item_t *item = SEQ(valnode).start; item < SEQ(valnode).top; item++) {
80f996e368SLisandro Dalcin         yaml_node_t *itemnode = yaml_document_get_node(doc, *item);
81f996e368SLisandro Dalcin         const char  *itemstr  = NULL;
82f996e368SLisandro Dalcin         size_t       itemlen;
83f996e368SLisandro Dalcin 
8428b400f6SJacob Faibussowitsch         PetscCheck(itemnode, comm, PETSC_ERR_LIB, "Corrupt YAML document");
85f996e368SLisandro Dalcin 
86f996e368SLisandro Dalcin         if (itemnode->type == YAML_SCALAR_NODE) {
87f996e368SLisandro Dalcin           itemstr = STR(itemnode);
88f996e368SLisandro Dalcin 
89f996e368SLisandro Dalcin         } else if (itemnode->type == YAML_MAPPING_NODE) {
90f996e368SLisandro Dalcin           yaml_node_pair_t *kvn = itemnode->data.mapping.pairs.start;
91f996e368SLisandro Dalcin           yaml_node_pair_t *top = itemnode->data.mapping.pairs.top;
92f996e368SLisandro Dalcin 
93cc73adaaSBarry Smith           PetscCheck(top - kvn <= 1, comm, PETSC_ERR_SUP, "Unsupported YAML node value: expected a single key:value pair");
94f996e368SLisandro Dalcin           if (top - kvn > 0) {
95f996e368SLisandro Dalcin             yaml_node_t *kn = yaml_document_get_node(doc, kvn->key);
96f996e368SLisandro Dalcin             yaml_node_t *vn = yaml_document_get_node(doc, kvn->value);
97f996e368SLisandro Dalcin 
9828b400f6SJacob Faibussowitsch             PetscCheck(kn, comm, PETSC_ERR_LIB, "Corrupt YAML document");
9928b400f6SJacob Faibussowitsch             PetscCheck(vn, comm, PETSC_ERR_LIB, "Corrupt YAML document");
10008401ef6SPierre Jolivet             PetscCheck(kn->type == YAML_SCALAR_NODE, comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected scalar");
101f996e368SLisandro Dalcin 
1029566063dSJacob Faibussowitsch             PetscCall(PetscStrcmp(STR(kn), "<<", &isMergeKey));
10328b400f6SJacob Faibussowitsch             PetscCheck(!isMergeKey, comm, PETSC_ERR_SUP, "Unsupported YAML node value: merge key '<<' not supported here");
104f996e368SLisandro Dalcin 
1059566063dSJacob Faibussowitsch             PetscCall(PetscStrbeginswith(STR(kn), "$$", &isDummyKey));
106f996e368SLisandro Dalcin             if (isDummyKey) continue;
107f996e368SLisandro Dalcin             itemstr = STR(kn);
108f996e368SLisandro Dalcin           }
109f996e368SLisandro Dalcin 
1109566063dSJacob Faibussowitsch           PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "%s_", STR(keynode)));
1119566063dSJacob Faibussowitsch           PetscCall(PetscOptionsPrefixPush(options, prefix));
1129566063dSJacob Faibussowitsch           PetscCall(PetscParseLayerYAML(options, doc, itemnode));
1139566063dSJacob Faibussowitsch           PetscCall(PetscOptionsPrefixPop(options));
114f996e368SLisandro Dalcin 
115f996e368SLisandro Dalcin         } else SETERRQ(comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected scalar or mapping");
116f996e368SLisandro Dalcin 
1179566063dSJacob Faibussowitsch         PetscCall(PetscStrlen(itemstr, &itemlen));
118f996e368SLisandro Dalcin         if (itemlen) {
119f996e368SLisandro Dalcin           if (addSep) {
1209566063dSJacob Faibussowitsch             PetscCall(PetscSegBufferGet(seg, 1, &buf));
1219566063dSJacob Faibussowitsch             PetscCall(PetscArraycpy(buf, ",", 1));
122f996e368SLisandro Dalcin           }
1239566063dSJacob Faibussowitsch           PetscCall(PetscSegBufferGet(seg, itemlen, &buf));
1249566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(buf, itemstr, itemlen));
125f996e368SLisandro Dalcin           addSep = PETSC_TRUE;
126f996e368SLisandro Dalcin         }
127f996e368SLisandro Dalcin       }
1289566063dSJacob Faibussowitsch       PetscCall(PetscSegBufferGet(seg, 1, &buf));
1299566063dSJacob Faibussowitsch       PetscCall(PetscArrayzero(buf, 1));
1309566063dSJacob Faibussowitsch       PetscCall(PetscSegBufferExtractAlloc(seg, &strlist));
1319566063dSJacob Faibussowitsch       PetscCall(PetscSegBufferDestroy(&seg));
132f996e368SLisandro Dalcin 
1339566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(name, sizeof(name), "-%s", STR(keynode)));
1349566063dSJacob Faibussowitsch       PetscCall(PetscOptionsSetValue(options, name, strlist));
1359566063dSJacob Faibussowitsch       PetscCall(PetscFree(strlist));
136f996e368SLisandro Dalcin 
137f996e368SLisandro Dalcin     } else if (valnode->type == YAML_MAPPING_NODE) {
1389566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(prefix, sizeof(prefix), "%s_", STR(keynode)));
1399566063dSJacob Faibussowitsch       PetscCall(PetscOptionsPrefixPush(options, prefix));
1409566063dSJacob Faibussowitsch       PetscCall(PetscParseLayerYAML(options, doc, valnode));
1419566063dSJacob Faibussowitsch       PetscCall(PetscOptionsPrefixPop(options));
142f996e368SLisandro Dalcin 
143f996e368SLisandro Dalcin     } else SETERRQ(comm, PETSC_ERR_SUP, "Unsupported YAML node type: expected scalar, sequence or mapping");
144f996e368SLisandro Dalcin   }
145f996e368SLisandro Dalcin   PetscFunctionReturn(0);
146f996e368SLisandro Dalcin }
147f996e368SLisandro Dalcin 
148f996e368SLisandro Dalcin /*@C
149*811af0c4SBarry Smith    PetscOptionsInsertStringYAML - Inserts YAML-formatted options into the options database from a string
150f996e368SLisandro Dalcin 
151f996e368SLisandro Dalcin    Logically Collective
152f996e368SLisandro Dalcin 
153d8d19677SJose E. Roman    Input Parameters:
154f996e368SLisandro Dalcin +  options - options database, use NULL for default global database
155f996e368SLisandro Dalcin -  in_str - YAML-formatted string options
156f996e368SLisandro Dalcin 
157f996e368SLisandro Dalcin    Level: intermediate
158f996e368SLisandro Dalcin 
159db781477SPatrick Sanan .seealso: `PetscOptionsSetValue()`, `PetscOptionsView()`, `PetscOptionsHasName()`, `PetscOptionsGetInt()`,
160db781477SPatrick Sanan           `PetscOptionsGetReal()`, `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`,
161db781477SPatrick Sanan           `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
162c2e3fba1SPatrick Sanan           `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
163db781477SPatrick Sanan           `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
164db781477SPatrick Sanan           `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsInsertFile()`, `PetscOptionsInsertFileYAML()`
165f996e368SLisandro Dalcin @*/
1669371c9d4SSatish Balay PetscErrorCode PetscOptionsInsertStringYAML(PetscOptions options, const char in_str[]) {
167f996e368SLisandro Dalcin   MPI_Comm        comm = PetscYAMLGetComm();
168f996e368SLisandro Dalcin   yaml_parser_t   parser;
169f996e368SLisandro Dalcin   yaml_document_t doc;
170f996e368SLisandro Dalcin   yaml_node_t    *root;
171d0609cedSBarry Smith   int             err;
172f996e368SLisandro Dalcin 
173f996e368SLisandro Dalcin   PetscFunctionBegin;
174f996e368SLisandro Dalcin   if (!in_str) in_str = "";
1759371c9d4SSatish Balay   err = !yaml_parser_initialize(&parser);
1769371c9d4SSatish Balay   PetscCheck(!err, comm, PETSC_ERR_LIB, "YAML parser initialization error");
177f996e368SLisandro Dalcin   yaml_parser_set_input_string(&parser, (const unsigned char *)in_str, strlen(in_str));
178f996e368SLisandro Dalcin   do {
1799371c9d4SSatish Balay     err = !yaml_parser_load(&parser, &doc);
1809371c9d4SSatish Balay     PetscCheck(!err, comm, PETSC_ERR_LIB, "YAML parser loading error");
181f996e368SLisandro Dalcin     root = yaml_document_get_root_node(&doc);
18248a46eb9SPierre Jolivet     if (root) PetscCall(PetscParseLayerYAML(options, &doc, root));
183f996e368SLisandro Dalcin     yaml_document_delete(&doc);
184f996e368SLisandro Dalcin   } while (root);
185f996e368SLisandro Dalcin   yaml_parser_delete(&parser);
186f996e368SLisandro Dalcin   PetscFunctionReturn(0);
187f996e368SLisandro Dalcin }
188f996e368SLisandro Dalcin 
189f996e368SLisandro Dalcin /*@C
1907a30eb05SPatrick Sanan   PetscOptionsInsertFileYAML - Insert a YAML-formatted file in the options database
191f996e368SLisandro Dalcin 
192f996e368SLisandro Dalcin   Collective
193f996e368SLisandro Dalcin 
194d8d19677SJose E. Roman   Input Parameters:
195*811af0c4SBarry Smith +   comm - the processes that will share the options (usually `PETSC_COMM_WORLD`)
196f996e368SLisandro Dalcin .   options - options database, use NULL for default global database
197f996e368SLisandro Dalcin .   file - name of file
198*811af0c4SBarry Smith -   require - if `PETSC_TRUE` will generate an error if the file does not exist
199f996e368SLisandro Dalcin 
200*811af0c4SBarry Smith   Notes:
201f996e368SLisandro Dalcin   PETSc will generate an error condition that stops the program if a YAML error
202f996e368SLisandro Dalcin   is detected, hence the user should check that the YAML file is valid before
203f996e368SLisandro Dalcin   supplying it, for instance at http://www.yamllint.com/ .
204f996e368SLisandro Dalcin 
205*811af0c4SBarry Smith   Uses `PetscOptionsInsertStringYAML()`.
206f996e368SLisandro Dalcin 
207f996e368SLisandro Dalcin   Level: intermediate
208f996e368SLisandro Dalcin 
209db781477SPatrick Sanan .seealso: `PetscOptionsSetValue()`, `PetscOptionsView()`, `PetscOptionsHasName()`, `PetscOptionsGetInt()`,
210db781477SPatrick Sanan           `PetscOptionsGetReal()`, `PetscOptionsGetString()`, `PetscOptionsGetIntArray()`, `PetscOptionsBool()`,
211db781477SPatrick Sanan           `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
212c2e3fba1SPatrick Sanan           `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
213db781477SPatrick Sanan           `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
214db781477SPatrick Sanan           `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsInsertFile()`, `PetscOptionsInsertStringYAML()`
215f996e368SLisandro Dalcin @*/
2169371c9d4SSatish Balay PetscErrorCode PetscOptionsInsertFileYAML(MPI_Comm comm, PetscOptions options, const char file[], PetscBool require) {
217f996e368SLisandro Dalcin   int         yamlLength = -1;
218f996e368SLisandro Dalcin   char       *yamlString = NULL;
219f996e368SLisandro Dalcin   MPI_Comm    prev;
220f996e368SLisandro Dalcin   PetscMPIInt rank;
221f996e368SLisandro Dalcin 
222f996e368SLisandro Dalcin   PetscFunctionBegin;
2239566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
224dd400576SPatrick Sanan   if (rank == 0) {
225f996e368SLisandro Dalcin     char   fpath[PETSC_MAX_PATH_LEN];
226f996e368SLisandro Dalcin     char   fname[PETSC_MAX_PATH_LEN];
227f996e368SLisandro Dalcin     FILE  *fd;
228f996e368SLisandro Dalcin     size_t rd;
229f996e368SLisandro Dalcin 
2309566063dSJacob Faibussowitsch     PetscCall(PetscStrreplace(PETSC_COMM_SELF, file, fpath, sizeof(fpath)));
2319566063dSJacob Faibussowitsch     PetscCall(PetscFixFilename(fpath, fname));
232f996e368SLisandro Dalcin 
233f996e368SLisandro Dalcin     fd = fopen(fname, "r");
234f996e368SLisandro Dalcin     if (fd) {
235f996e368SLisandro Dalcin       fseek(fd, 0, SEEK_END);
236f996e368SLisandro Dalcin       yamlLength = (int)ftell(fd);
237f996e368SLisandro Dalcin       fseek(fd, 0, SEEK_SET);
23808401ef6SPierre Jolivet       PetscCheck(yamlLength >= 0, PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN, "Unable to query size of YAML file: %s", fname);
2399566063dSJacob Faibussowitsch       PetscCall(PetscMalloc1(yamlLength + 1, &yamlString));
240f996e368SLisandro Dalcin       rd = fread(yamlString, 1, (size_t)yamlLength, fd);
241cc73adaaSBarry Smith       PetscCheck(rd == (size_t)yamlLength, PETSC_COMM_SELF, PETSC_ERR_FILE_READ, "Unable to read entire YAML file: %s", fname);
242f996e368SLisandro Dalcin       yamlString[yamlLength] = 0;
243f996e368SLisandro Dalcin       fclose(fd);
244f996e368SLisandro Dalcin     }
245f996e368SLisandro Dalcin   }
246f996e368SLisandro Dalcin 
2479566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Bcast(&yamlLength, 1, MPI_INT, 0, comm));
248cc73adaaSBarry Smith   PetscCheck(!require || yamlLength >= 0, comm, PETSC_ERR_FILE_OPEN, "Unable to open YAML option file: %s", file);
249f996e368SLisandro Dalcin   if (yamlLength < 0) PetscFunctionReturn(0);
250f996e368SLisandro Dalcin 
2519566063dSJacob Faibussowitsch   if (rank) PetscCall(PetscMalloc1(yamlLength + 1, &yamlString));
2529566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Bcast(yamlString, yamlLength + 1, MPI_CHAR, 0, comm));
253f996e368SLisandro Dalcin 
254f996e368SLisandro Dalcin   prev = PetscYAMLSetComm(comm);
2559566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInsertStringYAML(options, yamlString));
256f996e368SLisandro Dalcin   (void)PetscYAMLSetComm(prev);
257f996e368SLisandro Dalcin 
2589566063dSJacob Faibussowitsch   PetscCall(PetscFree(yamlString));
259f996e368SLisandro Dalcin   PetscFunctionReturn(0);
260f996e368SLisandro Dalcin }
261951eb098SLisandro Dalcin 
262951eb098SLisandro Dalcin #if !defined(PETSC_HAVE_YAML)
263951eb098SLisandro Dalcin 
264951eb098SLisandro Dalcin /*
265951eb098SLisandro Dalcin #if !defined(PETSC_HAVE_STRDUP)
266951eb098SLisandro Dalcin #define strdup(s) (char*)memcpy(malloc(strlen(s)+1),s,strlen(s)+1)
267951eb098SLisandro Dalcin #endif
268951eb098SLisandro Dalcin */
269951eb098SLisandro Dalcin 
270951eb098SLisandro Dalcin /* Embed LibYAML in this compilation unit */
271951eb098SLisandro Dalcin #include <../src/sys/yaml/src/api.c>
272951eb098SLisandro Dalcin #include <../src/sys/yaml/src/loader.c>
273951eb098SLisandro Dalcin #include <../src/sys/yaml/src/parser.c>
274951eb098SLisandro Dalcin #include <../src/sys/yaml/src/reader.c>
2756d1d8577SJunchao Zhang 
2766d1d8577SJunchao Zhang /*
2776d1d8577SJunchao Zhang   Avoid compiler warnings like
2786d1d8577SJunchao Zhang     scanner.c, line 3181: warning: integer conversion resulted in a change of sign
2796d1d8577SJunchao Zhang                           *(string.pointer++) = '\xC2';
2806d1d8577SJunchao Zhang 
2816d1d8577SJunchao Zhang   Once yaml fixes them, we can remove the pragmas
2826d1d8577SJunchao Zhang */
2836d1d8577SJunchao Zhang #pragma GCC diagnostic push
2846d1d8577SJunchao Zhang #pragma GCC diagnostic ignored "-Wsign-conversion"
285951eb098SLisandro Dalcin #include <../src/sys/yaml/src/scanner.c>
2866d1d8577SJunchao Zhang #pragma GCC diagnostic pop
287951eb098SLisandro Dalcin 
288951eb098SLisandro Dalcin /* Silence a few unused-function warnings */
2899371c9d4SSatish Balay static PETSC_UNUSED void petsc_yaml_unused(void) {
290951eb098SLisandro Dalcin   (void)yaml_parser_scan;
291951eb098SLisandro Dalcin   (void)yaml_document_get_node;
292951eb098SLisandro Dalcin   (void)yaml_parser_set_encoding;
293951eb098SLisandro Dalcin   (void)yaml_parser_set_input;
294951eb098SLisandro Dalcin   (void)yaml_parser_set_input_file;
295951eb098SLisandro Dalcin }
296951eb098SLisandro Dalcin 
297951eb098SLisandro Dalcin #endif
298