diff --git a/data/Tupfile.lua b/data/Tupfile.lua index e196179935..d268bc136c 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -604,8 +604,9 @@ tup.append_table(extra_files, { {"kolibrios/drivers/drvinst.kex", PROGS .. "/cmm/drvinst/drvinst.com"}, {"kolibrios/games/pig/pigex", PROGS .. "/cmm/examples/pigex.com"}, {"kolibrios/games/the_bus/the_bus", PROGS .. "/cmm/the_bus/the_bus.com"}, - {"kolibrios/utils/dicty.kex", PROGS .. "/cmm/dicty/dicty.com"}, {"kolibrios/utils/appearance", PROGS .. "/cmm/appearance/appearance.com"}, + {"kolibrios/utils/codeview", PROGS .. "/cmm/codeview/codeview.com"}, + {"kolibrios/utils/dicty.kex", PROGS .. "/cmm/dicty/dicty.com"}, {"kolibrios/utils/netcheck", PROGS .. "/cmm/examples/netcheck.com"}, }) end -- tup.getconfig('NO_CMM') ~= 'full' diff --git a/programs/cmm/codeview/Tupfile.lua b/programs/cmm/codeview/Tupfile.lua new file mode 100644 index 0000000000..c39061bc4c --- /dev/null +++ b/programs/cmm/codeview/Tupfile.lua @@ -0,0 +1,6 @@ +if tup.getconfig("NO_CMM") ~= "" then return end +if tup.getconfig("LANG") == "ru" +then C_LANG = "LANG_RUS" +else C_LANG = "LANG_ENG" -- this includes default case without config +end +tup.rule("codeview.c", "c-- /D=AUTOBUILD /D=$(C_LANG) %f" .. tup.getconfig("KPACK_CMD"), "codeview.com") diff --git a/programs/cmm/codeview/codeview.c b/programs/cmm/codeview/codeview.c new file mode 100644 index 0000000000..ddf5a515ba --- /dev/null +++ b/programs/cmm/codeview/codeview.c @@ -0,0 +1,250 @@ + +#define MEMSIZE 4096 * 200 + +//libraries +#include "..\lib\gui.h" +#include "..\lib\draw_buf.h" +#include "..\lib\list_box.h" +#include "..\lib\cursor.h" +#include "..\lib\collection.h" +#include "..\lib\random.h" +#include "..\lib\clipboard.h" + +// *.obj libraries +#include "..\lib\obj\box_lib.h" +#include "..\lib\obj\libio.h" +#include "..\lib\obj\libimg.h" +#include "..\lib\obj\http.h" +#include "..\lib\obj\iconv.h" + +#include "..\lib\patterns\history.h" +#include "..\lib\patterns\http_downloader.h" + +_http http = {0, 0, 0, 0, 0, 0, 0}; + +char homepage[] = FROM "html\\homepage.htm""\0"; +char page_not_found[] = FROM "html\\page_not_found_en.htm""\0"; + +char version[]="C-- Code View"; +char accept_language[]= "Accept-Language: en\n"; + +#define URL_SERVICE_HOME "CodeView://home" + +proc_info Form; + + +dword TOOLBAR_H = 40; +dword STATUSBAR_H = 0; + +dword col_bg = 0xE3E2E2; +dword panel_color = 0xE3E2E2; +dword border_color = 0x8C8C8C; + +bool debug_mode = false; +bool old_tag_parser_mode = false; + +bool open_in_a_new_window = false; + +enum { + REFRESH_BUTTON, + EDIT_SOURCE, +}; + +#include "..\TWB\TWB.c" +#include "show_src.h" + +char editURL[sizeof(URL)]; +int mouse_twb; +edit_box address_box = {250,60,30,0xffffff,0x94AECE,0xffffff,0xffffff,0x10000000,sizeof(URL),#editURL,#mouse_twb,2,19,19}; + +#define SKIN_Y 24 + +void main() +{ + int i; + int id; + load_dll(boxlib, #box_lib_init,0); + load_dll(libio, #libio_init,1); + load_dll(libimg, #libimg_init,1); + load_dll(iconv_lib, #iconv_open,0); + if (param) strcpy(#URL, #param); else strcpy(#URL, URL_SERVICE_HOME); + WB1.list.SetFont(8, 14, 10011000b); + WB1.list.no_selection = true; + SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER); + loop() switch(WaitEvent()) + { + case evMouse: + edit_box_mouse stdcall (#address_box); + mouse.get(); + if (WB1.list.MouseScroll(mouse.vert)) WB1.DrawPage(); + scrollbar_v_mouse (#scroll_wv); + if (WB1.list.first != scroll_wv.position) + { + WB1.list.first = scroll_wv.position; + WB1.DrawPage(); + break; + } + break; + + case evButton: + id=GetButtonID(); + if (1==id) ExitProcess(); + break; + + case evKey: + GetKeys(); + + if (SCAN_CODE_F5 == key_scancode) { + OpenPage(); + } + if (SCAN_CODE_F3 == key_scancode) { + RunProgram("/rd/1/tinypad", #URL); + } + + if (address_box.flags & 0b10) + { + if (key_ascii == ASCII_KEY_ENTER) EventGoToPage(); + else { + EAX = key_editbox; + edit_box_key stdcall(#address_box); + } + } + else + { + #define KEY_SCROLL_N 11 + if (SCAN_CODE_UP == key_scancode) for (i=0;i2) { DrawTitle(#header); break; } + if (Form.height<120) { MoveSize(OLD,OLD,OLD,120); break; } + if (Form.width<280) { MoveSize(OLD,OLD,280,OLD); break; } + Draw_Window(); + break; + } +} + +void SetElementSizes() +{ + address_box.top = TOOLBAR_H/2-10; + basic_line_h = calc(WB1.list.font_h * 130) / 100; + address_box.left = address_box.top; + address_box.width = Form.cwidth - address_box.left - address_box.left -14; + WB1.list.SetSizes(0, TOOLBAR_H, Form.width - 10 - scroll_wv.size_x, + Form.cheight - TOOLBAR_H - STATUSBAR_H, basic_line_h); + WB1.list.wheel_size = 7 * basic_line_h; + WB1.list.column_max = WB1.list.w - scroll_wv.size_x / WB1.list.font_w; + WB1.list.visible = WB1.list.h; + if (WB1.list.w!=WB1.DrawBuf.bufw) { + WB1.DrawBuf.Init(WB1.list.x, WB1.list.y, WB1.list.w, 32700); + OpenPage(); + } +} + +void Draw_Window() +{ + DrawBar(0,0, Form.cwidth,TOOLBAR_H-2, panel_color); + DrawBar(0,TOOLBAR_H-2, Form.cwidth,1, 0xD7D0D3); + DrawBar(0,TOOLBAR_H-1, Form.cwidth,1, border_color); + SetElementSizes(); + DrawRectangle(address_box.left-3, address_box.top-3, address_box.width+4, 25,border_color); + DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,STATUSBAR_H, col_bg); + DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,1, border_color); + DrawEditBoxWebView(); + if (!header) + OpenPage(); + else { + WB1.DrawPage(); + DrawEditBoxWebView(); + } + DrawRectangle(scroll_wv.start_x, scroll_wv.start_y, scroll_wv.size_x, scroll_wv.size_y-1, scroll_wv.bckg_col); +} + +void EventGoToPage() +{ + if (!editURL[0]) { + strcpy(#URL, URL_SERVICE_HOME); + } + else + { + strcpy(#URL, #editURL); + } + OpenPage(); +} + + +void SetPageDefaults() +{ + strcpy(#header, #version); + WB1.list.count = WB1.list.first = 0; + cur_encoding = CH_NULL; + if (o_bufpointer) o_bufpointer = free(o_bufpointer); +} + +void OpenPage() +{ + char getUrl[sizeof(URL)]; + strcpy(#editURL, #URL); + history.add(#URL); + if (!strncmp(#URL,"CodeView:",8)) + { + SetPageDefaults(); + if (!strcmp(#URL, URL_SERVICE_HOME)) WB1.LoadInternalPage(#homepage, sizeof(homepage)); + DrawEditBoxWebView(); + return; + } + else + { + file_size stdcall (#URL); + bufsize = EBX; + if (bufsize) + { + free(bufpointer); + bufpointer = malloc(bufsize); + SetPageDefaults(); + ReadFile(0, bufsize, bufpointer, #URL); + ShowCodeSource(); + WB1.LoadInternalPage(bufpointer, bufsize); + } + ShowPage(); + } +} + +DrawEditBoxWebView() +{ + int skin_x_offset; + DrawBar(address_box.left-2, address_box.top-2, address_box.width+3, 2, address_box.color); + DrawBar(address_box.left-2, address_box.top, 2, 22, address_box.color); + address_box.size = address_box.pos = address_box.shift = address_box.shift_old = strlen(#editURL); + address_box.offset = 0; + edit_box_draw stdcall(#address_box); + skin_x_offset = 51; + img_draw stdcall(skin.image, address_box.left+address_box.width+1, address_box.top-3, 17, skin.h, skin_x_offset, SKIN_Y); +} + + +void ShowPage() +{ + DrawEditBoxWebView(); + if (!bufsize) + { + WB1.LoadInternalPage(#page_not_found, sizeof(page_not_found)); + } + else + { + WB1.Prepare(); + } +} + +void DrawStatusBar() {return;}; +void ClickLink() {return;}; +void EventShowLinkMenu() {return;}; + +char anchor[256]; + +stop: \ No newline at end of file diff --git a/programs/cmm/codeview/compile_en.bat b/programs/cmm/codeview/compile_en.bat new file mode 100644 index 0000000000..4dd246dfc4 --- /dev/null +++ b/programs/cmm/codeview/compile_en.bat @@ -0,0 +1,5 @@ +@c-- CodeView.c +@del CodeView +@rename CodeView.com CodeView +@del warning.txt +@pause \ No newline at end of file diff --git a/programs/cmm/codeview/html/homepage.htm b/programs/cmm/codeview/html/homepage.htm new file mode 100644 index 0000000000..9ef5ec6b41 --- /dev/null +++ b/programs/cmm/codeview/html/homepage.htm @@ -0,0 +1,12 @@ + + +Homepage + + + +
+CodeView is a sipmle C--/C/C++ code viewer based on TWB component. + + + + \ No newline at end of file diff --git a/programs/cmm/codeview/html/page_not_found_en.htm b/programs/cmm/codeview/html/page_not_found_en.htm new file mode 100644 index 0000000000..89a0ccede3 --- /dev/null +++ b/programs/cmm/codeview/html/page_not_found_en.htm @@ -0,0 +1,14 @@ + + + +File not found + + +

 File not found

+ + + \ No newline at end of file diff --git a/programs/cmm/codeview/show_src.h b/programs/cmm/codeview/show_src.h new file mode 100644 index 0000000000..a913bbb3b0 --- /dev/null +++ b/programs/cmm/codeview/show_src.h @@ -0,0 +1,122 @@ +enum { TAG, OPTION_VALUE, TEXT, COMMENT, INLINE_COMMENT, CODE }; + + + +char* C_HL_keywords[] = { + "switch", "if", "while", "for", "break", "continue", "return", "else", + "union", "typedef", "static", "class", "case", "#include", + "volatile", "register", "sizeof", "typedef", "union", "goto", "const", "auto", + "#define", "#endif", "#error", "#ifdef", "#ifndef", "#undef", "#if", "#else", + "inline", + + "int ", "dword ", "long ", "double ", "float ", "char ", "unsigned ", "signed ", + "void ", "bool ", "enum ", "byte ", "word ", "struct ", "NULL", "loop", "stdcall ", + ":void ", ":int ", ":bool ", ":dword ", NULL +}; + +dword ShowCodeSource() +{ + dword new_buf, new_buf_start, i; + int mode = CODE; + + char spstr[64]; + dword keylen; + dword keyn; + dword keycolor; + + new_buf = malloc(bufsize*10); + new_buf_start = new_buf; + sprintf(new_buf,"
",#URL);
+	new_buf += strlen(new_buf);
+	for (i=bufpointer; i' == ESBYTE[i]) {
+			strcpy(new_buf, ">");
+			new_buf+=4;
+			continue;
+		}
+		if (ESBYTE[i] >= '0') && (ESBYTE[i] <= '9') && (CODE == mode) {
+			strcpy(new_buf, "?");
+			ESBYTE[new_buf+20] = ESBYTE[i];
+			new_buf+=28;
+			if (ESBYTE[i+1] == 'x') {
+				strcpy(new_buf, "x");
+				new_buf+=28;
+				i++;
+			}
+			continue;
+		}
+
+		if (CODE == mode) && ('\"' == ESBYTE[i]) {
+			mode = TEXT;
+			strcpy(new_buf, "\"");
+			new_buf+=18;
+			continue;
+		}
+		if (TEXT == mode) && ('\"' == ESBYTE[i]) {
+			mode = CODE;
+			strcpy(new_buf, "\"");
+			new_buf+=8;
+			continue;		
+		}
+
+		if (! strncmp(i, "//", 2) ) && (mode == CODE) {
+			mode = INLINE_COMMENT;
+			strcpy(new_buf, "//");
+			new_buf+=19;
+			i++;
+			continue;
+		}
+
+		if (INLINE_COMMENT == mode) {
+			if (13 == ESBYTE[i]) {
+				mode = CODE;
+				strcpy(new_buf, "\13");
+				new_buf+=8;
+				continue;				
+			}
+		}
+
+		if (! strncmp(i, "/*", 2) ) {
+			mode = COMMENT;
+			strcpy(new_buf, "/*");
+			new_buf+=19;
+			i++;
+			continue;
+		}
+		if (! strncmp(i, "*/", 2) ) {
+			mode = CODE;
+			strcpy(new_buf, "*/");
+			new_buf+=9;
+			i++;
+			continue;
+		}
+
+		if (CODE == mode) for (keyn=0; C_HL_keywords[keyn]!=NULL; keyn++) 
+		{
+			keylen = strlen(C_HL_keywords[keyn]);
+			if (! strncmp(i, C_HL_keywords[keyn], keylen) ) {
+
+				if (keyn<31) keycolor="#f00"; else keycolor="#00f";
+				sprintf(#spstr, "%s", keycolor, C_HL_keywords[keyn]);
+				strcpy(new_buf, #spstr);
+
+				new_buf += keylen + 24;
+				i += keylen-1;
+				goto _CONTINUE;
+			}
+		}
+		ESBYTE[new_buf] = ESBYTE[i];
+		new_buf++;
+		_CONTINUE:		
+	}
+	ESBYTE[new_buf] = 0;
+	bufsize = new_buf - new_buf_start;
+	free(bufpointer);
+	bufpointer = new_buf_start;
+}
\ No newline at end of file