reformat comments for 80-column viewing
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 21 Nov 2003 16:50:03 +0000 (16:50 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 21 Nov 2003 16:50:03 +0000 (16:50 +0000)
src/mesa/main/arbparse.c

index 2071835049e78984923dbc955b2b881597eff044..e8a87aeba10e2c151cba67294595ebfb490b6961 100644 (file)
@@ -46,7 +46,8 @@
 /* TODO:
  *    Fragment Program Stuff:
  *    -----------------------------------------------------
- *    - How does negating on SWZ work?? If any of the components have a -, negate?
+ *    - How does negating on SWZ work?? If any of the components have a -,
+ *      negate?
  *    - how does thing like 'foo[N]' work in src registers?
  *
  *    - things from Michal's email
@@ -56,7 +57,8 @@
  *       + fix multiple cases in switches, that might change 
  *          (these are things that are #defined to the same value, but occur 
  *           only on fp or vp's, which funkifies the switch statements)
- *          - STATE_TEX_* STATE_CLIP_PLANE, etc and PRECISION_HINT_FASTEST/PositionInvariant
+ *          - STATE_TEX_* STATE_CLIP_PLANE, etc and PRECISION_HINT_FASTEST/
+ *            PositionInvariant
  *          
  *    - check all limits of number of various variables
  *      + parameters
@@ -93,8 +95,9 @@
  *    Outstanding Questions:
  *    -----------------------------------------------------
  *    - palette matrix?  do we support this extension? what is the extention?
- *    - When can we fetch env/local params from their own register files, and when
- *        to we have to fetch them into the main state register file? (think arrays)
+ *    - When can we fetch env/local params from their own register files, and
+ *      when to we have to fetch them into the main state register file?
+ *      (think arrays)
  *
  *    Grammar Changes:
  *    -----------------------------------------------------
@@ -116,83 +119,104 @@ typedef byte *production;
 /* VERSION: 0.3 */
 
 /*
-       INTRODUCTION
-       ------------
-
-       The task is to check the syntax of an input string. Input string is a stream of ASCII
-       characters terminated with null-character ('\0'). Checking it using C language is
-       difficult and hard to implement without bugs. It is hard to maintain and change prior
-       to further syntax changes.
-
-       This is because of high redundancy of the C code. Large blocks of code are duplicated with
-       only small changes. Even using macros does not solve the problem, because macros cannot
-       erase the complexity of the code.
-
-       The resolution is to create a new language that will be highly oriented to our task. Once
-       we describe particular syntax, we are done. We can then focus on the code that implements
-       the language. The size and complexity of it is relatively small than the code that directly
-       checks the syntax.
-
-       First, we must implement our new language. Here, the language is implemented in C, but it
-       could also be implemented in any other language. The code is listed below. We must take
-       a good care that it is bug free. This is simple because the code is simple and clean.
-
-       Next, we must describe the syntax of our new language in itself. Once created and checked
-       manually that it is correct, we can use it to check another scripts.
-
-       Note that our new language loading code does not have to check the syntax. It is because we
-       assume that the script describing itself is correct, and other scripts can be syntactically
-       checked by the former script. The loading code must only do semantic checking which leads us to
-       simple resolving references.
-
-       THE LANGUAGE
-       ------------
-
-       Here I will describe the syntax of the new language (further called "Synek"). It is mainly a
-       sequence of declarations terminated by a semicolon. The declaration consists of a symbol,
-       which is an identifier, and its definition. A definition is in turn a sequence of specifiers
-       connected with ".and" or ".or" operator. These operators cannot be mixed together in a one
-       definition. Specifier can be a symbol, string, character, character range or a special
-       keyword ".true" or ".false".
-
-       On the very beginning of the script there is a declaration of a root symbol and is in the form:
+INTRODUCTION
+------------
+
+The task is to check the syntax of an input string. Input string is a
+stream of ASCII characters terminated with null-character
+('\0'). Checking it using C language is difficult and hard to
+implement without bugs. It is hard to maintain and change prior to
+further syntax changes.
+
+This is because of high redundancy of the C code. Large blocks of code
+are duplicated with only small changes. Even using macros does not
+solve the problem, because macros cannot erase the complexity of the
+code.
+
+The resolution is to create a new language that will be highly
+oriented to our task. Once we describe particular syntax, we are
+done. We can then focus on the code that implements the language. The
+size and complexity of it is relatively small than the code that
+directly checks the syntax.
+
+First, we must implement our new language. Here, the language is
+implemented in C, but it could also be implemented in any other
+language. The code is listed below. We must take a good care that it
+is bug free. This is simple because the code is simple and clean.
+
+Next, we must describe the syntax of our new language in itself. Once
+created and checked manually that it is correct, we can use it to
+check another scripts.
+
+Note that our new language loading code does not have to check the
+syntax. It is because we assume that the script describing itself is
+correct, and other scripts can be syntactically checked by the former
+script. The loading code must only do semantic checking which leads us
+to simple resolving references.
+
+THE LANGUAGE
+------------
+
+Here I will describe the syntax of the new language (further called
+"Synek"). It is mainly a sequence of declarations terminated by a
+semicolon. The declaration consists of a symbol, which is an
+identifier, and its definition. A definition is in turn a sequence of
+specifiers connected with ".and" or ".or" operator. These operators
+cannot be mixed together in a one definition. Specifier can be a
+symbol, string, character, character range or a special keyword
+".true" or ".false".
+
+On the very beginning of the script there is a declaration of a root
+symbol and is in the form:
                .syntax <root_symbol>;
-       The <root_symbol> must be on of the symbols in declaration sequence. The syntax is correct if
-       the root symbol evaluates to true. A symbol evaluates to true if the definition associated with
-       the symbol evaluates to true. Definition evaluation depends on the operator used to connect
-       specifiers in the definition. If ".and" operator is used, definition evaluates to true if and
-       only if all the specifiers evaluate to true. If ".or" operator is used, definition evalutes to
-       true if any of the specifiers evaluates to true. If definition contains only one specifier,
-       it is evaluated as if it was connected with ".true" keyword by ".and" operator.
-
-       If specifier is a ".true" keyword, it always evaluates to true.
-
-       If specifier is a ".false" keyword, it always evaluates to false. Specifier evaluates to false
-       when it does not evaluate to true.
-
-       Character range specifier is in the form:
-               '<first_character>' - '<second_character>'
-       If specifier is a character range, it evaluates to true if character in the stream is greater
-       or equal to <first_character> and less or equal to <second_character>. In that situation 
-       the stream pointer is advanced to point to next character in the stream. All C-style escape
-       sequences are supported although trigraph sequences are not. The comparisions are performed
-       on 8-bit unsigned integers.
-
-       Character specifier is in the form:
-               '<single_character>'
-       It evaluates to true if the following character range specifier evaluates to true:
-               '<single_character>' - '<single_character>'
-
-       String specifier is in the form:
+
+The <root_symbol> must be on of the symbols in declaration
+sequence. The syntax is correct if the root symbol evaluates to
+true. A symbol evaluates to true if the definition associated with the
+symbol evaluates to true. Definition evaluation depends on the
+operator used to connect specifiers in the definition. If ".and"
+operator is used, definition evaluates to true if and only if all the
+specifiers evaluate to true. If ".or" operator is used, definition
+evalutes to true if any of the specifiers evaluates to true. If
+definition contains only one specifier, it is evaluated as if it was
+connected with ".true" keyword by ".and" operator.
+
+If specifier is a ".true" keyword, it always evaluates to true.
+
+If specifier is a ".false" keyword, it always evaluates to
+false. Specifier evaluates to false when it does not evaluate to true.
+
+Character range specifier is in the form:
+       '<first_character>' - '<second_character>'
+
+If specifier is a character range, it evaluates to true if character
+in the stream is greater or equal to <first_character> and less or
+equal to <second_character>. In that situation the stream pointer is
+advanced to point to next character in the stream. All C-style escape
+sequences are supported although trigraph sequences are not. The
+comparisions are performed on 8-bit unsigned integers.
+
+Character specifier is in the form:
+       '<single_character>'
+
+It evaluates to true if the following character range specifier evaluates to
+true:
+       '<single_character>' - '<single_character>'
+
+String specifier is in the form:
                "<string>"
-       Let N be the number of characters in <string>. Let <string>[i] designate i-th character in
-       <string>. Then the string specifier evaluates to true if and only if for i in the range [0, N)
-       the following character specifier evaluates to true:
-               '<string>[i]'
-       If <string>[i] is a quotation mark, '<string>[i]' is replaced with '\<string>[i]'.
-
-       Symbol specifier can be optionally preceded by a ".loop" keyword in the form:
-               .loop <symbol>                                  (1)
+
+Let N be the number of characters in <string>. Let <string>[i]
+designate i-th character in <string>. Then the string specifier
+evaluates to true if and only if for i in the range [0, N) the
+following character specifier evaluates to true:
+       '<string>[i]'
+
+If <string>[i] is a quotation mark, '<string>[i]' is replaced with
+'\<string>[i]'.
+
+Symbol specifier can be optionally preceded by a ".loop" keyword in the form:
+       .loop <symbol>                                  (1)
        where <symbol> is defined as follows:
                <symbol> <definition>;                  (2)
        Construction (1) is replaced by the following code:
@@ -202,134 +226,148 @@ typedef byte *production;
                <symbol$2> <symbol> .and <symbol$1>;
                <symbol> <definition>;
 
-       ESCAPE SEQUENCES
-       ----------------
-
-       Synek supports all escape sequences in character specifiers. The mapping table is listed below.
-       All occurences of the characters in the first column are replaced with the corresponding
-       character in the second column.
-
-               Escape sequence                 Represents
-       ------------------------------------------------------------------------------------------------
-               \a                                              Bell (alert)
-               \b                                              Backspace
-               \f                                              Formfeed
-               \n                                              New line
-               \r                                              Carriage return
-               \t                                              Horizontal tab
-               \v                                              Vertical tab
-               \'                                              Single quotation mark
-               \"                                              Double quotation mark
-               \\                                              Backslash
-               \?                                              Literal question mark
-               \ooo                                    ASCII character in octal notation
-               \xhhh                                   ASCII character in hexadecimal notation
-       ------------------------------------------------------------------------------------------------
-
-       RAISING ERRORS
-       --------------
-
-       Any specifier can be followed by a special construction that is executed when the specifier
-       evaluates to false. The construction is in the form:
-               .error <ERROR_TEXT>
-       <ERROR_TEXT> is an identifier declared earlier by error text declaration. The declaration is
-       in the form:
-               .errtext <ERROR_TEXT> "<error_desc>"
-       When specifier evaluates to false and this construction is present, parsing is stopped
-       immediately and <error_desc> is returned as a result of parsing. The error position is also
-       returned and it is meant as an offset from the beggining of the stream to the character that
-       was valid so far. Example:
-
-               (**** syntax script ****)
-
-               .syntax program;
-               .errtext MISSING_SEMICOLON              "missing ';'"
-               program                 declaration .and .loop space .and ';' .error MISSING_SEMICOLON .and
-                                               .loop space .and '\0';
-               declaration             "declare" .and .loop space .and identifier;
-               space                   ' ';
 
+ESCAPE SEQUENCES
+----------------
+
+Synek supports all escape sequences in character specifiers. The
+mapping table is listed below.  All occurences of the characters in
+the first column are replaced with the corresponding character in the
+second column.
+
+       Escape sequence                 Represents
+       -----------------------------------------------------------------------
+       \a                              Bell (alert)
+       \b                              Backspace
+       \f                              Formfeed
+       \n                              New line
+       \r                              Carriage return
+       \t                              Horizontal tab
+       \v                              Vertical tab
+       \'                              Single quotation mark
+       \"                              Double quotation mark
+       \\                              Backslash
+       \?                              Literal question mark
+       \ooo                            ASCII character in octal notation
+       \xhhh                           ASCII character in hexadecimal notation
+       -----------------------------------------------------------------------
+
+
+RAISING ERRORS
+--------------
+
+Any specifier can be followed by a special construction that is
+executed when the specifier evaluates to false. The construction is in
+the form:
+       .error <ERROR_TEXT>
+
+<ERROR_TEXT> is an identifier declared earlier by error text
+declaration. The declaration is in the form:
+
+       .errtext <ERROR_TEXT> "<error_desc>"
+
+When specifier evaluates to false and this construction is present,
+parsing is stopped immediately and <error_desc> is returned as a
+result of parsing. The error position is also returned and it is meant
+as an offset from the beggining of the stream to the character that
+was valid so far. Example:
+
+       (**** syntax script ****)
+
+       .syntax program;
+       .errtext MISSING_SEMICOLON              "missing ';'"
+       program                 declaration .and .loop space .and ';'
+                                .error MISSING_SEMICOLON .and
+                                       .loop space .and '\0';
+       declaration             "declare" .and .loop space .and identifier;
+       space                   ' ';
                (**** sample code ****)
-
-               declare foo ,
-
-       In the example above checking the sample code will result in error message "missing ';'" and
-       error position 12. The sample code is not correct. Note the presence of '\0' specifier to
-       assure that there is no code after semicolon - only spaces.
-       <error_desc> can optionally contain identifier surrounded by dollar signs $. In such a case,
-       the identifier and dollar signs are replaced by a string retrieved by invoking symbol with
-       the identifier name. The starting position is the error position. The lenght of the resulting
-       string is the position after invoking the symbol.
-
-       PRODUCTION
-       ----------
-
-       Synek not only checks the syntax but it can also produce (emit) bytes associated with specifiers
-       that evaluate to true. That is, every specifier and optional error construction can be followed
-       by a number of emit constructions that are in the form:
-               .emit <parameter>
-       <paramater> can be a HEX number, identifier, a star * or a dollar $. HEX number is preceded by
-    0x or 0X. If <parameter> is an identifier, it must be earlier declared by emit code declaration
-    in the form:
+       declare foo ,
+
+In the example above checking the sample code will result in error
+message "missing ';'" and error position 12. The sample code is not
+correct. Note the presence of '\0' specifier to assure that there is
+no code after semicolon - only spaces.  <error_desc> can optionally
+contain identifier surrounded by dollar signs $. In such a case, the
+identifier and dollar signs are replaced by a string retrieved by
+invoking symbol with the identifier name. The starting position is the
+error position. The lenght of the resulting string is the position
+after invoking the symbol.
+
+
+PRODUCTION
+----------
+
+Synek not only checks the syntax but it can also produce (emit) bytes
+associated with specifiers that evaluate to true. That is, every
+specifier and optional error construction can be followed by a number
+of emit constructions that are in the form:
+       .emit <parameter>
+
+<paramater> can be a HEX number, identifier, a star * or a dollar
+$. HEX number is preceded by 0x or 0X. If <parameter> is an
+identifier, it must be earlier declared by emit code declaration in
+the form:
                .emtcode <identifier> <hex_number>
 
-       When given specifier evaluates to true, all emits associated with the specifier are output
-       in order they were declared. A star means that last-read character should be output instead
-       of constant value. Example:
-
-               (**** syntax script ****)
+When given specifier evaluates to true, all emits associated with the
+specifier are output in order they were declared. A star means that
+last-read character should be output instead of constant
+value. Example:
 
-               .syntax foobar;
-               .emtcode WORD_FOO               0x01
-               .emtcode WORD_BAR               0x02
-               foobar          FOO .emit WORD_FOO .or BAR .emit WORD_BAR .or .true .emit 0x00;
-               FOO                     "foo" .and SPACE;
-               BAR                     "bar" .and SPACE;
-               SPACE           ' ' .or '\0';
+       (**** syntax script ****)
 
-               (**** sample text 1 ****)
+       .syntax foobar;
+       .emtcode WORD_FOO               0x01
+       .emtcode WORD_BAR               0x02
+       foobar          FOO .emit WORD_FOO .or BAR .emit WORD_BAR .or .true .emit 0x00;
+       FOO                     "foo" .and SPACE;
+       BAR                     "bar" .and SPACE;
+       SPACE           ' ' .or '\0';
 
-               foo
+       (**** sample text 1 ****)
 
-               (**** sample text 2 ****)
+       foo
 
-               foobar
+       (**** sample text 2 ****)
 
-       For both samples the result will be one-element array. For first sample text it will be
-       value 1, for second - 0. Note that every text will be accepted because of presence of
-       .true as an alternative.
+       foobar
 
-       Another example:
+For both samples the result will be one-element array. For first
+sample text it will be value 1, for second - 0. Note that every text
+will be accepted because of presence of .true as an alternative.
 
-               (**** syntax script ****)
+Another example:
 
-               .syntax declaration;
-               .emtcode VARIABLE               0x01
-               declaration             "declare" .and .loop space .and
-                                               identifier .emit VARIABLE .and                  (1)
-                                               .true .emit 0x00 .and                                   (2)
-                                               .loop space .and ';';
-               space                   ' ' .or '\t';
-               identifier              .loop id_char .emit *;                                  (3)
-               id_char                 'a'-'z' .or 'A'-'Z' .or '_';
+       (**** syntax script ****)
 
+       .syntax declaration;
+       .emtcode VARIABLE               0x01
+       declaration             "declare" .and .loop space .and
+                               identifier .emit VARIABLE .and          (1)
+                                       .true .emit 0x00 .and           (2)
+                                       .loop space .and ';';
+       space                   ' ' .or '\t';
+       identifier              .loop id_char .emit *;                  (3)
+       id_char                 'a'-'z' .or 'A'-'Z' .or '_';
                (**** sample code ****)
-
-               declare    fubar;
-
-       In specifier (1) symbol <identifier> is followed by .emit VARIABLE. If it evaluates to
-       true, VARIABLE constant and then production of the symbol is output. Specifier (2) is used
-       to terminate the string with null to signal when the string ends. Specifier (3) outputs
-       all characters that make declared identifier. The result of sample code will be the
-       following array:
+       declare    fubar;
+
+In specifier (1) symbol <identifier> is followed by .emit VARIABLE. If
+it evaluates to true, VARIABLE constant and then production of the
+symbol is output. Specifier (2) is used to terminate the string with
+null to signal when the string ends. Specifier (3) outputs all
+characters that make declared identifier. The result of sample code
+will be the following array:
                { 1, 'f', 'u', 'b', 'a', 'r', 0 }
 
-    If .emit is followed by dollar $, it means that current position should be output. Current
-    position is a 32-bit unsigned integer distance from the very beginning of the parsed string to
-    first character consumed by the specifier associated with the .emit instruction. Current
-    position is stored in the output buffer in Little-Endian convention (the lowest byte comes
-    first).
-*/
+If .emit is followed by dollar $, it means that current position
+should be output. Current position is a 32-bit unsigned integer
+distance from the very beginning of the parsed string to first
+character consumed by the specifier associated with the .emit
+instruction. Current position is stored in the output buffer in
+Little-Endian convention (the lowest byte comes first).  */
+
 
 /**
  * This is the text describing the rules to parse the grammar 
@@ -707,8 +745,8 @@ set_last_error (const byte * msg, byte * param, GLint pos)
 }
 
 /*
      memory management routines
-*/
* memory management routines
+ */
 static GLvoid *
 mem_alloc (GLsizei size)
 {
@@ -741,8 +779,8 @@ str_duplicate (const byte * str)
 }
 
 /*
      emit type typedef
-*/
* emit type typedef
+ */
 typedef enum emit_type_
 {
    et_byte,                     /* explicit number */
@@ -752,8 +790,8 @@ typedef enum emit_type_
 emit_type;
 
 /*
      emit typedef
-*/
* emit typedef
+ */
 typedef struct emit_
 {
    emit_type m_emit_type;
@@ -1067,10 +1105,10 @@ barray_append (barray ** ba, barray ** nb)
    return 0;
 }
 
-/*
- * adds emit chain pointed by em to the end of array pointed by *ba,
- * returns 0 on success,
- * returns 1 otherwise
+
+/**
+ * Adds emit chain pointed by em to the end of array pointed by *ba.
+ * \return 0 on success, 1 otherwise.
  */
 static GLint
 barray_push (barray ** ba, emit * em, byte c, GLuint pos)
@@ -1117,7 +1155,7 @@ barray_push (barray ** ba, emit * em, byte c, GLuint pos)
    return 0;
 }
 
-/*
+/**
  * string to string map typedef
  */
 typedef struct map_str_
@@ -1159,11 +1197,10 @@ map_str_append (map_str ** ma, map_str ** nm)
       *ma = *nm;
 }
 
-/*
+/**
  * searches the map for specified key,
  * if the key is matched, *data is filled with data associated with the key,
- * returns 0 if the key is matched,
- * returns 1 otherwise
+ * \return 0 if the key is matched, 1 otherwise
  */
 static GLint
 map_str_find (map_str ** ma, const byte * key, byte ** data)
@@ -1184,7 +1221,7 @@ map_str_find (map_str ** ma, const byte * key, byte ** data)
    return 1;
 }
 
-/*
+/**
  * string to byte map typedef
  */
 typedef struct map_byte_
@@ -1224,11 +1261,10 @@ map_byte_append (map_byte ** ma, map_byte ** nm)
       *ma = *nm;
 }
 
-/*
- * searches the map for specified key,
- * if the key is matched, *data is filled with data associated with the key,
- * returns 0 if the is matched,
- * returns 1 otherwise
+/**
+ * Searches the map for specified key,
+ * If the key is matched, *data is filled with data associated with the key,
+ * \return 0 if the is matched, 1 otherwise
  */
 static GLint
 map_byte_find (map_byte ** ma, const byte * key, byte * data)
@@ -1286,11 +1322,10 @@ map_def_append (map_def ** ma, map_def ** nm)
       *ma = *nm;
 }
 
-/*
+/**
  * searches the map for specified key,
  * if the key is matched, *data is filled with data associated with the key,
- * returns 0 if the is matched,
- * returns 1 otherwise
+ * \return 0 if the is matched, 1 otherwise
  */
 static GLint
 map_def_find (map_def ** ma, const byte * key, defntn ** data)