c.st - enscript - GNU Enscript
 (HTM) git clone git://thinkerwim.org/enscript.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       c.st (4278B)
       ---
            1 /**
            2  * Name: c
            3  * Description: C programming language.
            4  * Author: Markku Rossi <mtr@iki.fi>
            5  */
            6 
            7 c_type_re =
            8 /* Types.
            9    (build-re '(auto char const double enum extern float int long
           10    register short signed static struct typedef union unsigned void
           11    volatile))
           12  */
           13   /\b(auto|c(har|onst)|double|e(num|xtern)|float|int|long|register\
           14 |s(hort|igned|t(atic|ruct))|typedef|un(ion|signed)|vo(id|latile))\b/;
           15 
           16 /* The super state of all C highlightings. */
           17 state CHighlight extends Highlight
           18 {
           19   BEGIN {
           20     if (verbose_highlighting)
           21       verbose_re = /(->|<=|>=|==|!=|\&\&|\|\||!)/;
           22     else
           23       verbose_re = 0;
           24   }
           25 
           26   verbose_re {
           27     match = $0;
           28     if (strcmp (match, "->") == 0)
           29       str = "rightarrow";
           30     else if (strcmp (match, "<=") == 0)
           31       str = "le";
           32     else if (strcmp (match, ">=") == 0)
           33       str = "ge";
           34     else if (strcmp (match, "==") == 0)
           35       str = "equiv";
           36     else if (strcmp (match, "&&") == 0)
           37       str = "land";
           38     else if (strcmp (match, "||") == 0)
           39       str = "lor";
           40     else if (strcmp (match, "!") == 0)
           41       str = "lnot";
           42     else if (strcmp (match, "!=") == 0)
           43       str = "ne";
           44     else
           45       str = 0;
           46 
           47     if (!str || !language_symbol (str))
           48       language_print ($0);
           49   }
           50 }
           51 
           52 /*
           53  * The highlight entry for C highlightings.  It is a bit ugly to
           54  * re-implement the BEGIN and END because they must be kept in sync
           55  * with the code in the `HighlightEntry'.  But, since we don't support
           56  * multiple heritance, we have no choice.
           57  */
           58 state CHighlightEntry extends CHighlight
           59 {
           60   BEGIN {
           61     if (highlight_entry_nesting++ == 0)
           62       header ();
           63   }
           64   END {
           65     if (--highlight_entry_nesting == 0)
           66       trailer ();
           67   }
           68 }
           69 
           70 state c extends CHighlightEntry
           71 {
           72   BEGIN {
           73     /*
           74      * Set the regular expression that is used to highlight types from
           75      * the beginning of the on-line function definition.  This
           76      * variable should be overwritten by each state that extends the
           77      * `c' state.
           78      */
           79     type_re = c_type_re;
           80   }
           81 
           82   /* Comments. */
           83   /\/\*/ {
           84     comment_face (true);
           85     language_print ($0);
           86     call (c_comment);
           87     comment_face (false);
           88   }
           89   /\/\// {
           90     comment_face (true);
           91     language_print ($0);
           92     call (eat_one_line);
           93     comment_face (false);
           94   }
           95 
           96   /* String constants. */
           97   /\"/ {
           98     string_face (true);
           99     language_print ($0);
          100     call (c_string);
          101     string_face (false);
          102   }
          103 
          104   /* Pre-processor lines. */
          105   /^#/ {
          106     language_print ($0);
          107     call (c_ppline);
          108   }
          109 
          110   /* Character constants. */
          111   /'.'|'\\\\.'/ {
          112     string_face (true);
          113     language_print ($0);
          114     string_face (false);
          115   }
          116 
          117   /* Keywords, but not types, goto, or case.
          118      (build-re '(break continue default do else for if return sizeof
          119      switch while))
          120   */
          121   /\b(break|continue|d(efault|o)|else|for|if|return|s(izeof|witch)|while)\b/ {
          122     keyword_face (true);
          123     language_print ($0);
          124     keyword_face (false);
          125   }
          126 
          127   /* Types. */
          128   c_type_re {
          129     type_face (true);
          130     language_print ($0);
          131     type_face (false);
          132   }
          133 
          134   /* Labels.  Emacs accepts also bare numbers. */
          135   /^([ \t]*)([a-zA-Z0-9_]+)(:)/ {
          136     language_print ($1);
          137 
          138     reference_face (true);
          139     language_print ($2);
          140     reference_face (false);
          141 
          142     language_print ($3);
          143   }
          144 
          145   /* Goto, case and the target. */
          146   /\<(goto|case)\>([ \t]+)(-?[A-Za-z_0-9]+)?/ {
          147     keyword_face (true);
          148     language_print ($1);
          149     keyword_face (false);
          150 
          151     language_print ($2);
          152 
          153     if (length ($3) > 0)
          154       {
          155         reference_face (true);
          156         language_print ($3);
          157         reference_face (false);
          158       }
          159   }
          160 
          161   /*
          162    * Function definitions, but only if you code with the one and only
          163    * usable indentation style (GNU).
          164    */
          165   /^([a-zA-Z_][a-zA-Z_0-9]*)([ \t]*\()/ {
          166     function_name_face (true);
          167     language_print ($1);
          168     function_name_face (false);
          169 
          170     language_print ($2);
          171   }
          172 
          173   /* Function definitions and prototypes for other (loser) coding styles. */
          174   /^([A-Za-z][a-zA-Z0-9_\* ]+)([ \*])([a-zA-Z_][a-zA-Z_0-9]*)([ \t]*\()/ {
          175     garbage = $1;
          176     middle_garbage = $2;
          177     function_name = $3;
          178     tail_garbage = $4;
          179 
          180     highlight_types (garbage, type_re);
          181 
          182     language_print (middle_garbage);
          183 
          184     function_name_face (true);
          185     language_print (function_name);
          186     function_name_face (false);
          187 
          188     language_print (tail_garbage);
          189   }
          190 }
          191 
          192 
          193 /*
          194 Local variables:
          195 mode: c
          196 End:
          197 */