用HTML+JavaScript构建C++类(Class)代码转换为MASM32代码的平台

news2024/12/24 8:51:33

一、需求分析

在使用MASM32编写Windows应用程序时,经常要调用Windows API接口函数 和 相应的数据结构,这些数据结构中有很多是类(Class),对于那些在MASM32没有定义的类,我们需要自己来转换。比如:

[Dynamic, Provider("CIMWin32"), UUID("{8502C4E0-5FBB-11D2-AAC1-006008C78BC7}"), SupportsCreate, CreateBy("Create"), SupportsDelete, DeleteBy("Delete"), AMENDMENT]
class Win32_ScheduledJob : CIM_Job
{
  string   Caption;
  string   Description;
  datetime InstallDate;
  string   Name;
  string   Status;
  datetime ElapsedTime;
  string   Notify;
  string   Owner;
  uint32   Priority;
  datetime TimeSubmitted;
  datetime UntilTime;
  string   Command;
  uint32   DaysOfMonth;
  uint32   DaysOfWeek;
  boolean  InteractWithDesktop;
  uint32   JobId;
  string   JobStatus;
  boolean  RunRepeatedly;
  datetime StartTime;
};

要转换成MASM32中的定义:

Win32_ScheduledJob STRUCT
  Caption	db	?
  Description	db	?
  InstallDate	datetime	?
  Name	db	?
  Status	db	?
  ElapsedTime	datetime	?
  Notify	db	?
  Owner	db	?
  Priority	DWORD	?
  TimeSubmitted	datetime	?
  UntilTime	datetime	?
  Command	db	?
  DaysOfMonth	DWORD	?
  DaysOfWeek	DWORD	?
  InteractWithDesktop	boolean	?
  JobId	DWORD	?
  JobStatus	db	?
  RunRepeatedly	boolean	?
  StartTime	datetime	?
Win32_ScheduledJob ENDS

手工转换效率太低,我们可以用HTML+JavaScript来构建一个转换平台。

二、页面设计

首先我们来定义转换平台的页面:

左边的文本框用来粘贴要转换的C++ 类代码,右边的文本框用来显示转换后的 MASM32代码,点击右上角的“转换”按钮进行转换。

相应的代码如下:

<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="PurpleEndurer">
  <meta name="Keywords" content="C++,MASM32,Class,Struct">
  <meta name="Description" content="C++ Class 2 MASM32 Struct">
  <title>C++ Class code 2 MASM32 Struct code</title>
 </head>
 <body>
 
<table style="backgound:#ccccff;">
<caption style="background: #ccccff; color:yellow;border-top:1px solid purple;border-left:1px solid purple;">
	<P><span style=" font:18pt bold;">C++ Class code 2 MASM32 Struct code</span>&nbsp;&nbsp;<span style=" font:14pt bold;color:purple;">by&nbsp;PurpleEndurer</span>&nbsp;&nbsp;<input type="button" value="转换" onclick="tran()"></P>
</caption>
<tr>
	<td style="border:1px solid black;background:#ccffff;">
		<P align="center">C++ class code</P>
 	<textarea id="taCppClass" rows="50" cols="40">
[Dynamic, Provider("CIMWin32"), UUID("{8502C4E0-5FBB-11D2-AAC1-006008C78BC7}"), SupportsCreate, CreateBy("Create"), SupportsDelete, DeleteBy("Delete"), AMENDMENT]
class Win32_ScheduledJob : CIM_Job
{
  string   Caption;
  string   Description;
  datetime InstallDate;
  string   Name;
  string   Status;
  datetime ElapsedTime;
  string   Notify;
  string   Owner;
  uint32   Priority;
  datetime TimeSubmitted;
  datetime UntilTime;
  string   Command;
  uint32   DaysOfMonth;
  uint32   DaysOfWeek;
  boolean  InteractWithDesktop;
  uint32   JobId;
  string   JobStatus;
  boolean  RunRepeatedly;
  datetime StartTime;
};
</textarea>     		
	</td>
	<td style="border:1px solid black;background:#ffffcc;">
		<P align="center">MASM32 Struct code</P>
		<textarea id="taMASM32" rows="50" cols="90"></textarea>
	</td>
</tr>
</table>
 

 </body>
</html>

三、对C++类代码的检测

当我们点击右上角的“转换”按钮进行转换时,我们首先要检测一下左边文本框里内容是否为C++类 代码,检测思路是:

首先用正则表达式的search()方法 检测文本中是否包含关键字class,如果不包含 class,文本就不是C++类 代码;

然后我们分别用字符串的indexOf()和lastIndexOf()方法 来查文本中是否包含'{'和'}'两个字符,如果文本不包含这两个字符,就不是C++类 代码,反之我们可以认为文本是C++类 代码。

代码如下:

//功能:判断是否为c++ class定义代码
//输入:c=code
//输出:true=是,false=否
//记录:20230812创建
function isCppClass(c)
{
	//taMASM32.value += 'isCppClass : c.search(/\bclass\b/i =' + c.search(/\bclass\b/i) + '\n';
	if (c.search(/\bclass\b/i))
	{
		if ( -1 != c.indexOf('{') )
		{
			if ( -1 != c.lastIndexOf('}'))
			{
				return true;
			}//if
		}//if
	}//if
	return false;
}//isCppClass(c)

四、生成MASM32注释

由于类的定义在MASM32中和C++不同,有时我们需要参考类在C++中的原始定义,我们一般会将

类在C++中的原始定义代码以注释的形式放在MASM32中,这里我们用字符串的replace()方法 来实现:

	//生成masm32注释
	taMASM32.value += ';' + v.replace(/\n/g, '\n;') + '\n';	

五、获取类名

接下来我们来获取类名。在C++中,类名一般位于关键字class后面。

思路是首先用正则表达式的search()方法获取关键字class的位置,然后用substring()方法截取它后面的文本c,用indexOf()方法 获取文本c中第一个空格的位置p,再用substring()方法截取文本c从开头到p的文本a,这个文本a就是类名。代码如下:

//功能:获取为c++ class的名称
//输入:c=code
//输出:class的名称(可能为'')
//记录:20230812创建
function getClassName(c)
{
	var r = c.substring(c.search(/\bclass\b/i) + 5).ltrim();
	return r.substring(0, r.indexOf(' '));
}//getClassName(c)

为了确保获取文本c中第一个空格的位置p位于类名的后面,我们用ltrim()删除文本c开头的空格。

在MASM32中,类的定义是用Struct来实现的。

取得类名后,我们就可以生成MASM32中定义的第一行:

	taMASM32.value += '\n' + clsName + ' STRUCT\n';

六、将C++类成员定义转换MASM32格式

C++类成员定义在{}中,顺序是成员类型、成员名称,两者中间用空格或制表符间隔。

MASM32中Struct成员定义顺序是成员名称, 成员类型,值,前两项的顺序与c++相反,两者中间也是用空格或制表符间隔。

我们的思路是:首先获取{}中的文本,用replace(';'.'')把文本中位于行末的所有分号去掉。

然后用split('\n')把文本按行转换为数组逐行处理。

我们用replace()方法,获取C++中的成员类型$1和成员名称$2,并替换成"$2\t$1\t?\n"

//功能:将c++ class中的成员定义转换为MASM32结构体成员定义
//输入:c=code
//输出:MASM32结构体成员定义字符串
//记录:20230812创建
function tranStructMem(c)
{
	//获取关键字class后的文本
	var r = c.substring(c.search(/\bclass\b/i) + 5);
	//获取{}之间的文本
	r = r.substring(r.indexOf('{')+1, r.lastIndexOf('}'));
	r = r.replace(/;/g,''); //去除所有行末的分号
	var a = r.split('\n');//按行转换为数组
	r = '';
	for (var i = 0; i < a.length; i++)
	{
		r += a[i].replace( /(\w+)\s+(\w+)/, "$2\t$1\t?\n");
	}
	//r = r.substring(0, r.length-1);//删除最后一个换行符
	return tranCppType2Masm32Type(r);
}//tranStructMem(c)

由于c++中的数据类型与MASM32中的并不完全对应,比如c++中的uint32,在MASM32中没有定义,可以用DWORD来对应,所以我们还增加了一个函数tranCppType2Masm32Type来进行类型转换:

//功能:将c++ class中的数据类型转换为MASM32的数据类型
//输入:v=string
//输出:MASM32的数据类型
//记录:20230812创建
function tranCppType2Masm32Type(v)
{
	var aType = [
  			[/string/gi, "db"],
 			[/uint32/gi, "DWORD"]
		];

	var r = v;
	for (var i = 0; i < aType.length; i++)
	{
		r = r.replace(aType[i][0], aType[i][1]);
	}
	return r;
}//tranCppType2Masm32Type(v)

七、运行效果

八、完整代码

如下:

<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="PurpleEndurer">
  <meta name="Keywords" content="C++,MASM32,Class,Struct">
  <meta name="Description" content="C++ Class 2 MASM32 Struct">
  <title>C++ Class code 2 MASM32 Struct code</title>
 </head>
 <body>
 
<table style="backgound:#ccccff;">
<caption style="background: #ccccff; color:yellow;border-top:1px solid purple;border-left:1px solid purple;">
	<P><span style=" font:18pt bold;">C++ Class code 2 MASM32 Struct code</span>&nbsp;&nbsp;<span style=" font:14pt bold;color:purple;">by&nbsp;PurpleEndurer</span>&nbsp;&nbsp;<input type="button" value="转换" onclick="tran()"></P>
</caption>
<tr>
	<td style="border:1px solid black;background:#ccffff;">
		<P align="center">C++ class code</P>
 	<textarea id="taCppClass" rows="50" cols="40">
[Dynamic, Provider("CIMWin32"), UUID("{8502C4E0-5FBB-11D2-AAC1-006008C78BC7}"), SupportsCreate, CreateBy("Create"), SupportsDelete, DeleteBy("Delete"), AMENDMENT]
class Win32_ScheduledJob : CIM_Job
{
  string   Caption;
  string   Description;
  datetime InstallDate;
  string   Name;
  string   Status;
  datetime ElapsedTime;
  string   Notify;
  string   Owner;
  uint32   Priority;
  datetime TimeSubmitted;
  datetime UntilTime;
  string   Command;
  uint32   DaysOfMonth;
  uint32   DaysOfWeek;
  boolean  InteractWithDesktop;
  uint32   JobId;
  string   JobStatus;
  boolean  RunRepeatedly;
  datetime StartTime;
};
</textarea>     		
	</td>
	<td style="border:1px solid black;background:#ffffcc;">
		<P align="center">MASM32 Struct code</P>
		<textarea id="taMASM32" rows="50" cols="90"></textarea>
	</td>
</tr>
</table>
 
<script>
//功能:删除字符串中的所有空格
//记录:20230726创建
String.prototype.eliminateSpace = function()
{
	return this.replace(/\s*/g,"");
}

//去除字符串首部空格
String.prototype.ltrim = function() 
{ 
	return this.replace(/(^\s*)/g, ""); 
} 

//去除字符串尾部空格 
String.prototype.rtrim = function() 
{ 
	return this.replace(/(\s*$)/g, ""); 
}


//去除字符串首尾空格
String.prototype.trim = function() 
{
	return this.replace(/(^\s*)|(\s*$)/g, ""); 
	/*var t = this.replace(/(^\s*)|(\s*$)/g, ""); 
	return t =t.replace(/(^&nbsp;*)|(&nbsp*$)/g, ""); */
}


//功能:判断是否为c++ class定义代码
//输入:c=code
//输出:true=是,false=否
//记录:20230812创建
function isCppClass(c)
{
	//taMASM32.value += 'isCppClass : c.search(/\bclass\b/i =' + c.search(/\bclass\b/i) + '\n';
	if (c.search(/\bclass\b/i))
	{
		if ( -1 != c.indexOf('{') )
		{
			if ( -1 != c.lastIndexOf('}'))
			{
				return true;
			}//if
		}//if
	}//if
	return false;
}//isCppClass(c)


//功能:获取为c++ class的名称
//输入:c=code
//输出:class的名称(可能为'')
//记录:20230812创建
function getClassName(c)
{
	var r = c.substring(c.search(/\bclass\b/i) + 5).ltrim();
	return r.substring(0, r.indexOf(' '));
}//getClassName(c)


//功能:将c++ class中的数据类型转换为MASM32的数据类型
//输入:v=string
//输出:MASM32的数据类型
//记录:20230812创建
function tranCppType2Masm32Type(v)
{
	var aType = [
  			[/string/gi, "db"],
 			[/uint32/gi, "DWORD"]
		];

	var r = v;
	for (var i = 0; i < aType.length; i++)
	{
		r = r.replace(aType[i][0], aType[i][1]);
	}
	return r;
}//tranCppType2Masm32Type(v)


//功能:将c++ class中的成员定义转换为MASM32结构体成员定义
//输入:c=code
//输出:MASM32结构体成员定义字符串
//记录:20230812创建
function tranStructMem(c)
{
	//获取关键字class后的文本
	var r = c.substring(c.search(/\bclass\b/i) + 5);
	//获取{}之间的文本
	r = r.substring(r.indexOf('{')+1, r.lastIndexOf('}'));
	r = r.replace(/;/g,''); //去除所有行末的分号
	var a = r.split('\n');//按行转换为数组
	r = '';
	for (var i = 0; i < a.length; i++)
	{
		r += a[i].replace( /(\w+)\s+(\w+)/, "$2\t$1\t?\n");
	}
	//r = r.substring(0, r.length-1);//删除最后一个换行符
	return tranCppType2Masm32Type(r);
}//tranStructMem(c)


var taCppClass = document.getElementById('taCppClass');
var taMASM32 = document.getElementById('taMASM32');

function tran()
{
	var v = taCppClass.value;
	if (""==v.trim())
	{
		taCppClass.value = "请先将C++代码输入或粘贴到这里";
		return;
	}

	//taMASM32.value = v;
	if (!isCppClass(v))
	{
		taMASM32.value = '不是C++ Class定义';
		return;
	}

	//生成masm32注释
	taMASM32.value += ';' + v.replace(/\n/g, '\n;') + '\n';	

	var clsName = getClassName(v);
	if (''==clsName)
	{
		taMASM32.value += '未能获取类名';
		return;
	}

	taMASM32.value += '\n' + clsName + ' STRUCT\n';
	//v = v.replace(/[\t\s]+/g,' ');
	//var m = extractMember(v);
	taMASM32.value += tranStructMem(v);

}//tran()
</script>
 </body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis 初识

目录 1. MyBatis入门 1.1 MyBatis的定义 1.2 MyBatis的核心 MyBatis的核心 JDBC 的操作回顾 1.3 MyBatis的执行流程 MyBatis基本工作原理 2. MyBatis的使用 2.1 MyBatis环境搭建 2.1.1 创建数据库和表 2.1.2 添加MyBatis框架支持 老项目添加MyBatis 新项目添加MyBatis 2.1.3 设…

第一份工作要怎么找呀

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

LeetCode150道面试经典题--赎金信(简单)

1.题目 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 2.示例 3.思路 统计字…

JVM 中一次完整的 GC 流程和对象如何晋升到老年代?

前言 今天来分享一道比较好的面试题&#xff0c;JVM 中一次完整的 GC 流程是怎样的以及对象如何晋升到老年代&#xff1f;对于这个问题&#xff0c;我们一起看看考察点和比较好的回答吧。 考察点 Java 虚拟机能够替我们回收内存空间&#xff0c;清除垃圾对象&#xff0c;因此…

《嵌入式 - 嵌入式大杂烩》SVC和PendSV异常详解

1 操作模式 在讨论PendSV和SVC异常前,需要先了解Cortex-M的模式和两个特权等级。 Figure 1 1 操作模式和特权等级 两种模式为handler模式和线程(thread)模式,这两种模式是为了区别正在执行代码的类型;handler模式为异常处理例程的代码;线程模式为普通应用程序的代码。 两…

【云原生】Kubernetes 概述

Kubernetes 概述 1.Kubernetes 简介 Kubernetes 是一个可移植的、可扩展的、用于管理容器化工作负载和服务的开源平台&#xff0c;它简化&#xff08;促进&#xff09;了声明式配置和自动化。它有一个庞大的、快速增长的生态系统。Kubernetes 的服务、支持和工具随处可见。 K…

计算机视觉中的Transformer

几十年来&#xff0c;理论物理学家一直在努力提出一个宏大的统一理论。通过统一&#xff0c;指的是将被认为是完全不同的两个或多个想法结合起来&#xff0c;将它们的不同方面证明为同一基础现象。一个例子是在19世纪之前&#xff0c;电和磁被看作是无关的现象&#xff0c;但电…

HCIP-linux和kvm

1、linux linux安装教程参考&#xff0c;https://blog.51cto.com/cloudcs/5245337 yum源配置 本地yum源配置&#xff1a; 8版本配置&#xff1a;将光盘iso挂载到某个目录&#xff0c;/dev/cdrom是/dev/sr0软链接&#xff0c;# mount /dev/cdrom /mnt&#xff0c;# ls /mnt Ap…

项目知识点记录

1.使用druid连接池 使用properties配置文件&#xff1a; driverClassName com.mysql.cj.jdbc.Driver url jdbc:mysql://localhost:3306/book?useSSLtrue&setUnicodetrue&charsetEncodingUTF-8&serverTimezoneGMT%2B8 username root password 123456 #初始化链接数…

Python-OpenCV中的图像处理-霍夫变换

Python-OpenCV中的图像处理-霍夫变换 霍夫变换霍夫直线变换霍夫圆环变换 霍夫变换 霍夫(Hough)变换在检测各种形状的技术中非常流行&#xff0c;如果要检测的形状可以用数学表达式描述&#xff0c;就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也是可以使…

《人月神话》:我所遇见的“焦油坑”

最近在读《人月神话》这本书。 发现大部分task延期和研发关系不是很大&#xff0c;技术为业务服务&#xff0c;但是偿还不了业务债。 焦油坑的概念源自于挖掘坑井时的一种不幸状况。当挖掘坑井时&#xff0c;首先会进入表土层&#xff0c;进展颇快。但接下来遇到了沥青或泥浆…

Highcharts引入

Highcharts是和jQuery一起使用的&#xff0c;所以需要下载好jQuery jQuery下载方式&#xff1a;访问&#xff1a;http://cdn.staticfile.org/jquery/2.1.4/jquery.min.js&#xff0c;然后全选复制到自己新建的txt文档中&#xff0c;最后把扩展名改为js。 Highcharts下载方式&…

红帽8.5 ansible 安装和部署 |(简单版)

安装 配置yum仓库&#xff1a; vim /etc/yun.repo.d/aliyun.repo [AppStream] nameApp baseurlhttps://mirrors.aliyun.com/centos/8-stream/AppStream/x86_64/os gpgcheck0[BaseOS] namebase baseurlhttps://mirrors.aliyun.com/centos/8-stream/BaseOS/x86_64/os gpgcheck…

安装PaddleOCR-2.7.0版本-笔记

安装PaddleOCR-2.7.0版本-笔记 先安装conda和python版本 本机安装的conda 22.9.0 python2.9.12 paddle2.4.2 paddlepaddle-gpu2.4.2 cuda10.2 安装完后&#xff0c;测试生成的结果如下所示&#xff1a; 一、第一步先激活环境 conda activate base conda activate base二、第…

线程介绍,线程与进程区别,如何使用多线程,Thread类,Runnable接口,补充知识(方法重载,方法重写)

引言&#xff1a;搞进程是为了什么呢&#xff1f; 满足并发编程&#xff0c;这样的需求&#xff0c;cpu多个核心&#xff0c;应用程序做出对应调整&#xff0c;让代码可以把多个核心充分利用起来&#xff5e;&#xff0c;当需要支持多个任务的时候——进程就十分关键了&#x…

8月9日上课内容 nginx反向代理与负载均衡

负载均衡工作当中用的很多的&#xff0c;也是面试会问的很重要的一个点 负载均衡&#xff1a;通过反向代理来实现&#xff08;nginx只有反向代理才能做负载均衡&#xff09; 正向代理的配置方法&#xff08;用的较少&#xff09; 反向代理的方式&#xff1a;四层代理与七层代…

Golang 函数定义及使用

文章目录 一、函数定义格式二、函数定义及使用 一、函数定义格式 //func: 函数定义关键字 //function_name&#xff1a;函数名称 //parameter_List: 函数参数列表&#xff0c;多个时使用逗号拆分 //return_types&#xff1a;函数返回类型&#xff0c;返回多个值时使用逗号拆分…

2023河南萌新联赛第(五)场:郑州轻工业大学-F 布鲁特佛斯

2023河南萌新联赛第&#xff08;五&#xff09;场&#xff1a;郑州轻工业大学-F 布鲁特佛斯 https://ac.nowcoder.com/acm/contest/62977/F 文章目录 2023河南萌新联赛第&#xff08;五&#xff09;场&#xff1a;郑州轻工业大学-F 布鲁特佛斯题意解题思路代码 题意 给定一个…

前后端分离------后端创建笔记(02)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

《甲午》观后感——GPT-3.5所写

《甲午》是一部令人深思的纪录片&#xff0c;通过生动的画面和真实的故事&#xff0c;向观众展示了中国历史上的一段重要时期。观看这部纪录片&#xff0c;我深受触动&#xff0c;对历史的认识也得到了深化。 首先&#xff0c;这部纪录片通过精心搜集的历史资料和珍贵的影像资料…