| /** |
| * projectM -- Milkdrop-esque visualisation SDK |
| * Copyright (C)2003-2007 projectM Team |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| * See 'LICENSE.txt' included within this release |
| * |
| */ |
| /** |
| * $Id$ |
| * |
| * MilkdropPreset parser |
| * |
| * $Log$ |
| */ |
| #ifndef _PARSER_H |
| #define _PARSER_H |
| |
| //#define PARSE_DEBUG 2 |
| #define PARSE_DEBUG 0 |
| |
| #include <stdio.h> |
| |
| #include "Expr.hpp" |
| #include "PerFrameEqn.hpp" |
| #include "InitCond.hpp" |
| #include "MilkdropPreset.hpp" |
| |
| |
| /* Strings that prefix (and denote the type of) equations */ |
| #define PER_FRAME_STRING "per_frame_" |
| #define PER_FRAME_STRING_LENGTH 10 |
| |
| #define PER_PIXEL_STRING "per_pixel_" |
| #define PER_PIXEL_STRING_LENGTH 10 |
| |
| #define PER_FRAME_INIT_STRING "per_frame_init_" |
| #define PER_FRAME_INIT_STRING_LENGTH 15 |
| |
| #define WAVECODE_STRING "wavecode_" |
| #define WAVECODE_STRING_LENGTH 9 |
| |
| #define WAVE_STRING "wave_" |
| #define WAVE_STRING_LENGTH 5 |
| |
| #define PER_POINT_STRING "per_point" |
| #define PER_POINT_STRING_LENGTH 9 |
| |
| #define PER_FRAME_STRING_NO_UNDERSCORE "per_frame" |
| #define PER_FRAME_STRING_NO_UNDERSCORE_LENGTH 9 |
| |
| #define SHAPECODE_STRING "shapecode_" |
| #define SHAPECODE_STRING_LENGTH 10 |
| |
| |
| #define WARP_STRING "warp_" |
| #define WARP_STRING_LENGTH 5 |
| |
| #define COMPOSITE_STRING "comp_" |
| #define COMPOSITE_STRING_LENGTH 5 |
| |
| #define SHAPE_STRING "shape_" |
| #define SHAPE_STRING_LENGTH 6 |
| |
| #define SHAPE_INIT_STRING "init" |
| #define SHAPE_INIT_STRING_LENGTH 4 |
| |
| #define WAVE_INIT_STRING "init" |
| #define WAVE_INIT_STRING_LENGTH 4 |
| |
| #include <set> |
| |
| typedef enum { |
| UNSET_LINE_MODE, |
| PER_FRAME_LINE_MODE, |
| PER_PIXEL_LINE_MODE, |
| PER_FRAME_INIT_LINE_MODE, |
| INIT_COND_LINE_MODE, |
| CUSTOM_WAVE_PER_POINT_LINE_MODE, |
| CUSTOM_WAVE_PER_FRAME_LINE_MODE, |
| CUSTOM_WAVE_WAVECODE_LINE_MODE, |
| CUSTOM_SHAPE_SHAPECODE_LINE_MODE, |
| CUSTOM_SHAPE_PER_FRAME_LINE_MODE, |
| CUSTOM_SHAPE_PER_FRAME_INIT_LINE_MODE, |
| CUSTOM_WAVE_PER_FRAME_INIT_LINE_MODE |
| } line_mode_t; |
| |
| /** Token enumeration type */ |
| typedef enum { |
| tEOL, /* end of a line, usually a '/n' or '/r' */ |
| tEOF, /* end of file */ |
| tLPr, /* ( */ |
| tRPr, /* ) */ |
| tLBr, /* [ */ |
| tRBr, /* ] */ |
| tEq, /* = */ |
| tPlus, /* + */ |
| tMinus, /* - */ |
| tMult, /* * */ |
| tMod, /* % */ |
| tDiv, /* / */ |
| tOr, /* | */ |
| tAnd, /* & */ |
| tComma, /* , */ |
| tPositive, /* + as a prefix operator */ |
| tNegative, /* - as a prefix operator */ |
| tSemiColon, /* ; */ |
| tStringTooLong, /* special token to indicate an invalid string length */ |
| tStringBufferFilled /* the string buffer for this line is maxed out */ |
| } token_t; |
| |
| class CustomShape; |
| class CustomWave; |
| class GenExpr; |
| class InfixOp; |
| class PerFrameEqn; |
| class MilkdropPreset; |
| class TreeExpr; |
| |
| class Parser { |
| public: |
| static std::string lastLinePrefix; |
| static line_mode_t line_mode; |
| static CustomWave *current_wave; |
| static CustomShape *current_shape; |
| static int string_line_buffer_index; |
| static char string_line_buffer[STRING_LINE_SIZE]; |
| static unsigned int line_count; |
| static int per_frame_eqn_count; |
| static int per_frame_init_eqn_count; |
| static int last_custom_wave_id; |
| static int last_custom_shape_id; |
| static char last_eqn_type[MAX_TOKEN_SIZE]; |
| static int last_token_size; |
| static bool tokenWrapAroundEnabled; |
| |
| static PerFrameEqn *parse_per_frame_eqn( std::istream & fs, int index, |
| MilkdropPreset * preset); |
| static int parse_per_pixel_eqn( std::istream & fs, MilkdropPreset * preset, |
| char * init_string); |
| static InitCond *parse_init_cond( std::istream & fs, char * name, MilkdropPreset * preset ); |
| static int parse_preset_name( std::istream & fs, char * name ); |
| static int parse_top_comment( std::istream & fs ); |
| static int parse_line( std::istream & fs, MilkdropPreset * preset ); |
| |
| static int get_string_prefix_len(char * string); |
| static TreeExpr * insert_gen_expr(GenExpr * gen_expr, TreeExpr ** root); |
| static TreeExpr * insert_infix_op(InfixOp * infix_op, TreeExpr ** root); |
| static token_t parseToken(std::istream & fs, char * string); |
| static GenExpr ** parse_prefix_args(std::istream & fs, int num_args, MilkdropPreset * preset); |
| static GenExpr * parse_infix_op(std::istream & fs, token_t token, TreeExpr * tree_expr, MilkdropPreset * preset); |
| static GenExpr * parse_sign_arg(std::istream & fs); |
| static int parse_float(std::istream & fs, float * float_ptr); |
| static int parse_int(std::istream & fs, int * int_ptr); |
| static int insert_gen_rec(GenExpr * gen_expr, TreeExpr * root); |
| static int insert_infix_rec(InfixOp * infix_op, TreeExpr * root); |
| static GenExpr * parse_gen_expr(std::istream & fs, TreeExpr * tree_expr, MilkdropPreset * preset); |
| static PerFrameEqn * parse_implicit_per_frame_eqn(std::istream & fs, char * param_string, int index, MilkdropPreset * preset); |
| static InitCond * parse_per_frame_init_eqn(std::istream & fs, MilkdropPreset * preset, std::map<std::string,Param*> * database); |
| static int parse_wavecode_prefix(char * token, int * id, char ** var_string); |
| static int parse_wavecode(char * token, std::istream & fs, MilkdropPreset * preset); |
| static int parse_wave_prefix(char * token, int * id, char ** eqn_string); |
| static int parse_wave_helper(std::istream & fs, MilkdropPreset * preset, int id, char * eqn_type, char * init_string); |
| static int parse_shapecode(char * eqn_string, std::istream & fs, MilkdropPreset * preset); |
| static int parse_shapecode_prefix(char * token, int * id, char ** var_string); |
| static void parse_string_block(std::istream & fs, std::string * out_string); |
| static bool scanForComment(std::istream & fs); |
| static int parse_wave(char * eqn_string, std::istream & fs, MilkdropPreset * preset); |
| static int parse_shape(char * eqn_string, std::istream & fs, MilkdropPreset * preset); |
| static int parse_shape_prefix(char * token, int * id, char ** eqn_string); |
| static void readStringUntil(std::istream & fs, std::string * out_buffer, bool wrapAround = true, const std::set<char> & skipList = std::set<char>()) ; |
| |
| static int string_to_float(char * string, float * float_ptr); |
| static int parse_shape_per_frame_init_eqn(std::istream & fs, CustomShape * custom_shape, MilkdropPreset * preset); |
| static int parse_shape_per_frame_eqn(std::istream & fs, CustomShape * custom_shape, MilkdropPreset * preset); |
| static int parse_wave_per_frame_eqn(std::istream & fs, CustomWave * custom_wave, MilkdropPreset * preset); |
| static bool wrapsToNextLine(const std::string & str); |
| }; |
| |
| #endif /** !_PARSER_H */ |