1 %option nounput
2 %option noinput
3 %option yylineno
4 
5 %{ /* -*- C -*- */
6 /*
7  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
8  *                         University Research and Technology
9  *                         Corporation.  All rights reserved.
10  * Copyright (c) 2004-2006 The University of Tennessee and The University
11  *                         of Tennessee Research Foundation.  All rights
12  *                         reserved.
13  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
14  *                         University of Stuttgart.  All rights reserved.
15  * Copyright (c) 2004-2005 The Regents of the University of California.
16  *                         All rights reserved.
17  * Copyright (c) 2012      Los Alamos National Security, LLC. All rights
18  *                         reserved.
19  * $COPYRIGHT$
20  *
21  * Additional copyrights may follow
22  *
23  * $HEADER$
24  */
25 
26 #include "opal_config.h"
27 
28 #include <stdio.h>
29 #ifdef HAVE_UNISTD_H
30 #include <unistd.h>
31 #endif
32 
33 #include "opal/util/keyval/keyval_lex.h"
34 
35 /*
36  * local functions
37  */
38 
39 BEGIN_C_DECLS
40 
41 int opal_util_keyval_yywrap(void);
42 
43 END_C_DECLS
44 
45 /*
46  * global variables
47  */
48 int opal_util_keyval_yynewlines = 1;
49 bool opal_util_keyval_parse_done = false;
50 char *opal_util_keyval_string = NULL;
51 
52 %}
53 
54 WHITE       [\f\t\v ]
55 CHAR        [A-Za-z0-9_\-\.]
56 
57 %x VALUE
58 %x comment
59 %x MCA_VALUE
60 
61 %%
62 
63 {WHITE}*\n          { opal_util_keyval_yynewlines++; return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; }
64 #.*\n               { opal_util_keyval_yynewlines++; return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; }
65 "//".*\n            { opal_util_keyval_yynewlines++; return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; }
66 
67 "/*"                { BEGIN(comment);
68                       return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; }
69 <comment>[^*\n]*       ; /* Eat up non '*'s */
70 <comment>"*"+[^*/\n]*  ; /* Eat '*'s not followed by a '/' */
71 <comment>\n         { opal_util_keyval_yynewlines++;
72                       return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; }
73 <comment>"*"+"/"    { BEGIN(INITIAL); /* Done with Block Comment */
74                       return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; }
75 
76 {WHITE}*"="{WHITE}* { BEGIN(VALUE); return OPAL_UTIL_KEYVAL_PARSE_EQUAL; }
77 {WHITE}+            ; /* whitespace */
78 {CHAR}+             { return OPAL_UTIL_KEYVAL_PARSE_SINGLE_WORD; }
79 
80 <VALUE>{WHITE}*\n   { BEGIN(INITIAL); return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; }
81 <VALUE>[^\n]*[^\t \n]/[\t ]*      { return OPAL_UTIL_KEYVAL_PARSE_VALUE; }
82 
83 <MCA_VALUE>[^\n \t]+      { BEGIN(INITIAL); return OPAL_UTIL_KEYVAL_PARSE_VALUE; }
84 <MCA_VALUE>"'"[^\n]*"'"{WHITE}+      { BEGIN(INITIAL); return OPAL_UTIL_KEYVAL_PARSE_VALUE; }
85 <MCA_VALUE>"\""[^\n]*"\""{WHITE}+      { BEGIN(INITIAL); return OPAL_UTIL_KEYVAL_PARSE_VALUE; }
86 <MCA_VALUE>{WHITE}*\n   { BEGIN(INITIAL); BEGIN(INITIAL); return OPAL_UTIL_KEYVAL_PARSE_NEWLINE; }
87 
88 "-"?"-mca"{WHITE}+{CHAR}+{WHITE}+ {BEGIN(MCA_VALUE); return OPAL_UTIL_KEYVAL_PARSE_MCAVAR; }
89 "-"?"-x"{WHITE}+{CHAR}+{WHITE}*"="{WHITE}* {BEGIN(MCA_VALUE); return OPAL_UTIL_KEYVAL_PARSE_ENVEQL; }
90 "-"?"-x"{WHITE}+{CHAR}+{WHITE}*/[^=] { return OPAL_UTIL_KEYVAL_PARSE_ENVVAR; }
91 
92 .	            { return OPAL_UTIL_KEYVAL_PARSE_ERROR; }
93 
94 %%
95 
96 /* Old flex (2.5.4a? and older) does not define a destroy function */
97 #if !defined(YY_FLEX_SUBMINOR_VERSION)
98 #define YY_FLEX_SUBMINOR_VERSION 0
99 #endif
100 
101 #if (YY_FLEX_MAJOR_VERSION < 2) || (YY_FLEX_MAJOR_VERSION == 2 && (YY_FLEX_MINOR_VERSION < 5 || (YY_FLEX_MINOR_VERSION == 5 && YY_FLEX_SUBMINOR_VERSION < 5)))
102 int opal_util_keyval_yylex_destroy(void)
103 {
104     if (NULL != YY_CURRENT_BUFFER) {
105         yy_delete_buffer(YY_CURRENT_BUFFER);
106 #if defined(YY_CURRENT_BUFFER_LVALUE)
107         YY_CURRENT_BUFFER_LVALUE = NULL;
108 #else
109         YY_CURRENT_BUFFER = NULL;
110 #endif  /* YY_CURRENT_BUFFER_LVALUE */
111     }
112     return YY_NULL;
113 }
114 #endif
115 
opal_util_keyval_yywrap(void)116 int opal_util_keyval_yywrap(void)
117 {
118     opal_util_keyval_parse_done = true;
119     return 1;
120 }
121 
122 /*
123  * Ensure that we have a valid yybuffer to use.  Specifically, if this
124  * scanner is invoked a second time, finish_parsing() (above) will
125  * have been executed, and the current buffer will have been freed.
126  * Flex doesn't recognize this fact because as far as it's concerned,
127  * its internal state was already initialized, so it thinks it should
128  * have a valid buffer.  Hence, here we ensure to give it a valid
129  * buffer.
130  */
opal_util_keyval_init_buffer(FILE * file)131 int opal_util_keyval_init_buffer(FILE *file)
132 {
133     YY_BUFFER_STATE buf = yy_create_buffer(file, YY_BUF_SIZE);
134     yy_switch_to_buffer(buf);
135 
136     return 0;
137 }
138