⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nvparse.cpp

📁 使用stl技术,(还没看,是听说的)
💻 CPP
字号:
#ifdef _WIN32
# include <windows.h>
#else
#include <stdarg.h>
#define strnicmp strncasecmp
#endif

#include <stdio.h>

#ifdef MACOS
#include <OpenGL/glu.h>
#else
#include <GL/glu.h>
#endif

#include <string>
#include <vector>

#include "nvparse.h"
#include "nvparse_errors.h"

//void yyinit(char*);
//int yyparse(void);


// RC1.0  -- register combiners 1.0 configuration
bool rc10_init(char *);
int  rc10_parse();
bool is_rc10(const char *);

// TS1.0  -- texture shader 1.0 configuration
bool ts10_init(char *);
int  ts10_parse();
bool is_ts10(const char *);

// ARBvp1.0  -- ARB vertex program
bool avp10_init(char *);
int  avp10_parse();
bool is_avp10(const char *);

#ifndef MACOS
// VP1.0  -- vertex program
bool vp10_init(char *);
int  vp10_parse();
bool is_vp10(const char *);

// VSP1.0  -- vertex state program
bool vsp10_init(char *);
int  vsp10_parse(int vspid);
bool is_vsp10(const char *);

// VCP1.0  -- vertex constant program
bool vcp10_init(char *);
int  vcp10_parse();
bool is_vcp10(const char *);

// DX8 stuff

// PS1.0  -- DX8 Pixel Shader 1.0 configuration
bool ps10_init(char *);
int  ps10_parse();
bool ps10_set_map(const std::vector<int>& argv);
bool is_ps10(const char *);
const int* ps10_get_info(int* pcount);

// VS1.0  -- DX8 Vertex Shader 1.0
bool vs10_init(char *);
int  vs10_parse();
bool is_vs10(const char *);
void vs10_load_program();
#endif

nvparse_errors errors;
int line_number;
char * myin = 0;

void nvparse(const char * input_string, int argc /* = 0 */,...)
{
    if (NULL == input_string)
    {
        errors.set("NULL string passed to nvparse");
        return;
    }
    
    char * instring = strdup(input_string);

    // register combiners (1 and 2)
    if(is_rc10(instring))
    {
        if(rc10_init(instring))
        {
            rc10_parse();
        }
    }

    // texture shader
    else if(is_ts10(instring))
    {
        if(ts10_init(instring))
        {
            ts10_parse();
        }
    }

    // vertex program
    else if(is_avp10(instring))
    {
        if(avp10_init(instring))
        {
            avp10_parse();
        }
    }

#ifndef MACOS
    // vertex constant program
    else if(is_vcp10(instring))
    {
        if(vcp10_init(instring))
        {
            vcp10_parse();
        }
    }

    // vertex state program
    else if(is_vsp10(instring))
    {
        if(vsp10_init(instring))
        {
            vsp10_parse(argc);
        }
    }

    // vertex program
    else if(is_vp10(instring))
    {
        if(vp10_init(instring))
        {
            vp10_parse();
        }
    }

    // DX8 vertex shader
    else if ( is_vs10(instring) )
    {
        if(vs10_init(instring))
        {
            vs10_parse();
            vs10_load_program();
        }

    }
    else if (is_ps10(instring))
    {
        if(ps10_init(instring))
        {
            va_list ap;
            std::vector<int> argv;
            va_start(ap,argc);
            for (int i=0;i<argc;++i)
            {
                int arg = va_arg(ap,int);
                argv.push_back(arg);
            }
            va_end(ap);
            if (!ps10_set_map(argv))
                return;
            ps10_parse();
        }
    }
#endif
    else
    {
        errors.set("invalid string.\n \
                    first characters must be: !!ARBvp1.0 or !!VP1.0 or !!VSP1.0 or !!RC1.0 or !!TS1.0\n \
                    or it must be a valid DirectX 8.0 Vertex Shader");
    }
    free(instring);
}

char * const * const nvparse_get_errors()
{
    return errors.get_errors();
}

char * const * const nvparse_print_errors(FILE * errfp)
{
    for (char * const *  ep = nvparse_get_errors(); *ep; ep++)
    {
        const char * errstr = *ep;
        fprintf(errfp, "%s\n", errstr);
    }
    return nvparse_get_errors();
}


const int* nvparse_get_info(const char* input_string, int* pcount)
{
#ifndef MACOS
    if (NULL == input_string)
    {
        errors.set("NULL string passed to nvparse_get_info");
        return 0;
    }
    if (is_ps10(input_string))
    {
        return ps10_get_info(pcount);
    }
#endif
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -