C++自定义脚本文件执行


FunctionCall.h:
    
    #include <sstream>
    #include <string>
    #include <vector>
    // 函数调用
    class FunctionCall
    {
    public:
        FunctionCall();
        ~FunctionCall();
        std::string call(const std::string &line);

    private:
        void parse(const std::string &line);

    private:
        void call0();
        void call1();
        void call2();
        void call3();
        void call4();
        void call5();
    private:
        std::string              funcname;
        std::vector<std::string> args;
        std::string result;
    };

FunctionCall.cpp:
    #include "FunctionCall.h"
    #include <fstream>
    #include <iostream>
    #include <sstream>
    #include <vector>

    FunctionCall::FunctionCall() {}
    FunctionCall::~FunctionCall() {}

    void  FunctionCall::parse(const std::string &line)
    {
        std::istringstream iss(line);
        std::string        tmp;
        while (std::getline(iss, tmp, ',')) {
            if (funcname.empty())
                funcname = tmp;
            else
                args.emplace_back(tmp);
        }
    }

    // 执行外部脚本
    std::string FunctionCall::call(const std::string &line)
    {
        parse(line);
        if(funcname.empty())
            return "invalid function";

        switch (args.size()) {
        case 0: {
            call0();
        } break;
        case 1: {
            call1();
        } break;
        case 2: {
            call2();
        } break;
        case 3: {
            call3();
        } break;
        case 4: {
            call4();
        } break;
        case 5: {
            call5();
        } break;
        default: {
        } break;
        }
        return result;
    }

    void FunctionCall::call0()
    {
        if("test" == funcname)
            std::cout << "run test" << std::endl;
    }

    void FunctionCall::call1() {
    }

    void FunctionCall::call2() {
    }

    void FunctionCall::call3() {
    }

    void FunctionCall::call4() {
    }

    void FunctionCall::call5() {
    }

LocalScriptFile.h:

    #include <string>

    class LocalScriptFile
    {
    public:
        bool doFile(const char *path);

    private:
        bool jumpComment(const std::string &line);
        void doScript(const std::string &line);

    private:
        bool m_isComment = false;
    };

LocalScriptFile.cpp:

    #include "LocalScriptFile.h"

    #include "FunctionCall.h"
    #include <fstream>
    #include <iostream>
    #include <sstream>
    #include <vector>

    bool LocalScriptFile::jumpComment(const std::string &line) {
        if(m_isComment) {
            if (-1 != line.find("**/"))
                m_isComment = false;
            return true;
        } else{
            if (-1 != line.find("/**"))
                m_isComment = true;
            return m_isComment;
        }
    }

    bool LocalScriptFile::doFile(const char *path)
    {
        if (-1 != std::string(path).rfind(".lua")) {
            std::ifstream file(path);
            if (!file.is_open()) {
                std::cerr << "Failed to open the file." << std::endl;
                return false;
            }

            bool        isComment = false;
            std::string line;
            while (std::getline(file, line)) {
                //            std::cout << "Read line: " << line << std::endl;
                if(jumpComment(line))
                    continue;
                doScript(line);
            }
            file.close();
            return true;
        }
        return false;
    }

    // 执行外部脚本
    void LocalScriptFile::doScript(const std::string &line)
    {
        FunctionCall call;
        std::stringstream logStream;
        logStream << call.call(line) << " = " << line;
    }

test.lua
    /*
        测试脚本文件
    */
    test
    
使用示例:
    void main() {
        PxxLocalScriptFile scriptFile;
        if(scriptFile.doFile("test.lua"))
            std::cout << "success" << std::endl;
    }


创作不易,小小的支持一下吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/702570.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

失误删除也能救回,推荐前10款手机数据恢复软件!

在手机的日常使用中&#xff0c;不可避免的会误删数据&#xff0c;这些数据可能包括照片、视频、联系人、短信等重要信息。不过好在市面上有很多优秀的手机数据恢复软件&#xff0c;可以帮助我们从各种情况下恢复丢失的数据。 本文将为您推荐十大手机数据恢复软件&#xff0c;…

Xxl-job实现定时任务视频转码

搭建XXL-JOB 调度中心 首先下载xxl-job GitHub&#xff1a;GitHub - xuxueli/xxl-job: A distributed task scheduling framework.&#xff08;分布式任务调度平台XXL-JOB&#xff09; 码云&#xff1a;xxl-job: 一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速…

三大国密浏览器简单介绍-行云管家

国密浏览器是指支持国密算法SM2/SM3&#xff0c;支持基于国密算法的SSL协议&#xff0c;支持采用国密SSL证书实现HTTPS加密的网站正常访问的浏览器。今天我们行云管家小编就给大家简单介绍一下三大国密浏览器&#xff0c;以便大家了解。 三大国密浏览器简单介绍-行云管家 1、密…

快速上手六步教你如何进行跨境电商ERP开发

跨境电商平台开发是当前电商行业的热门话题&#xff0c;一套高效的ERP系统对跨境电商平台的发展至关重要。在本文中&#xff0c;我将为你介绍六个简单而关键的步骤&#xff0c;帮助你快速上手进行跨境电商ERP开发。 步骤一&#xff1a;需求分析 在跨境电商平台开发之初&#…

C++笔试强训day22

目录 1.添加字符 2.数组变换 3.装箱问题 常规一维优化&#xff1a; 1.添加字符 链接 因为lenA < lenB < 50&#xff0c;因此可以无脑暴力解题&#xff1a; 遍历所有符合条件的匹配方法&#xff0c;找出最小的不同的数量&#xff0c;即最大的相同的数量 #include &…

需要无广告、结构化信息的搜索引擎?秘塔AI搜索,你的新选择

工欲善其事&#xff0c;必先利其器。 随着AI技术与各个行业或细分场景的深度融合&#xff0c;日常工作可使用的AI工具呈现出井喷式发展的趋势&#xff0c;AI工具的类别也从最初的AI文本生成、AI绘画工具&#xff0c;逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…

蓝桥杯备战22.k倍区间——前缀和

目录 题目 分析 暴力求解 优化思路 AC代码 题目链接&#xff1a; P8649 [蓝桥杯 2017 省 B] k 倍区间 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目 分析 很明显这题是一道前缀和的题 暴力求解 只得了28分 #include<iostream> using namespace std; co…

地平线旭日X3开发板编译USB网卡驱动 AX88772B

由于使用的激光雷达是网口输出的&#xff0c; 为了不占用X3派已有的网口&#xff0c;接上去了一个绿联的usb网卡&#xff0c; 发现系统没有驱动&#xff0c;所以动手看看能不能自己编译一个 首先lsusb查看一下网卡型号 发现型号是AX88772B&#xff0c;去官网看了一下&#x…

JVM运行时内存:程序计数器

文章目录 1. 程序计数器的作用2. 程序计数器的基本特征3. 程序计数器的问题 运行时内存整体结构如下图所示: 1. 程序计数器的作用 为了保证程序(在操作系统中理解为进程)能够连续地执行下去&#xff0c;CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作…

力扣HOT100 - 300. 最长递增子序列

解题思路&#xff1a; 动态规划 class Solution {public int lengthOfLIS(int[] nums) {if (nums.length 0) return 0;int[] dp new int[nums.length];int max 0;Arrays.fill(dp, 1);for (int i 0; i < nums.length; i) {for (int j 0; j < i; j) {if (nums[j] <…

论文解读:Matching Feature Sets for Few-Shot Image Classification

文章汇总 动机 将表示分解为独立的组件应该允许捕获图像的几个不同方面&#xff0c;然后可以有效地使用这些方面来表示新类别的图像。 解决办法 从卷积主干连接多尺度特征映射。在网络中以各种尺度嵌入浅层自关注模块(称为“映射器”)。 流程解读 (a)图中右边的灰色小正方…

5G技术相关部分图解

1、面向5G商用网络的全系列解决方案 面向5G商用网络的全系列解决方案涵盖了从核心网到接入网的各个方面&#xff0c;确保网络的高性能、高可靠性和高安全性 2、2\3\4\5G带宽图解 G带宽的提升将推动许多新型应用的发展&#xff0c;并提供更快速、更可靠的移动通信体验。然而…