Trans Extension
Monkey Targets Forums/Desktop/Trans Extension| 
 | ||
| Hi ALL, here is version 0.3 of monkey Ext. included source code. http://bcxdx.spoilerspace.com/Monkey/TransExt0.3.zip Enjoy it. | 
| 
 | ||
| What's this? | 
| 
 | ||
| A clone of Monkey Ext? https://code.google.com/p/monkey-ext/ [edit] I guess not... | 
| 
 | ||
| It's transcc with an extendend preprocessor. | 
| 
 | ||
| What I can see is that you can do "inline" C... but I don't really see any benefit over the extern system... is there anything else it does? | 
| 
 | ||
| Hi all, actually TRANS EXTENSION is the original transcc with some added new features. 1- adding Cpp code with Monkey code by using inlineC-endC keyword or by ! symbol Example 
!DWORD put( String a ) {
!  bbPrint( a );
!}
inlineC
 // Inline c in declration area
endC
Extern
   Function put:Int(a:String)
Public
 
Function Main:Int()
    Local kiro:Int = 20
     
    Print kiro
       
    inlineC 
       // Inline c source code
          t_kiro=200;
    endC
         
    ! /* Inline Sym C */
    ! bbPrint(String(t_kiro));
    
    put("Monkey Ext is very good")
    
    Return 0
End
BTW , inline , is a reserved word and i do not know it will be for. 2-added Enum keyword to monkey Example 
Enum 
   ONE,TWO,THREE
EndEnum
Enum
   AA,BB=10+4,CC,PP=60,ZZ
   ENUM_1 = 1  ' restart at 1
   ENUM_2 = CC ' 15
   ENUM_3      ' Err should print 16 
End
Enum 20
   ENUM_4 ' will start at 20
   ENUM_5 ' will be 21
End Enum
Enum 50*10 Step 5*10
       ENUM_6 ' will start at 500
       ENUM_7 ' will be 550
       ENUM_8 ' will be 600
EndEnum
Enum
   ENUM_10 = 1 Shl 0
   ENUM_11 = 1 Shl 1
   ENUM_12 = 1 Shl 2
   ENUM_13 = 1 Shl 3
EndEnum
Class ABC ' enum in class
    Enum 50 Step 5
       ENUM_14 ' will start at 50
       ENUM_15 ' will be 55
       ENUM_16 ' will be 60
    End
 
   Enum DEF 
       ENUM_17  
       ENUM_18 
       ENUM_19 
  End  
End
Enum POINT
   TA,TB,TC
EndEnum
Enum Option
  INVALID = -1
  NONE = 0
  A = 1
  B = 2
  C = 4
  D = 8
End Enum
Function Main:Int()
    Print ONE
    Print TWO
    Print THREE
    
    Print AA
    Print BB
    Print CC
    Print PP
    Print ZZ
       
    Print ENUM_1
    Print ENUM_2
    Print ENUM_3
    
    Print ENUM_4
    Print ENUM_5
    
    Print ENUM_6
    Print ENUM_7
    Print ENUM_8
    
    Print ENUM_10
    Print ENUM_11
    Print ENUM_12
    Print ENUM_13
    
    Print POINT.TA
    Print POINT.TB
    Print POINT.TC
    
    Print ( Option.A | Option.B )  'Prints 3
    Local everything:Int = Option.A | Option.B | Option.C | Option.D
    Print ( everything )  'Prints 15
    
    If HasFlag(everything, Option.D) Then Print "True" Else Print "False"  'Prints True
       
    Print ABC.ENUM_14 ' Enum in class 
    
    Print ABC.ENUM_19 ' Err must be  ABC.DEF.ENUM_19 
    
    Local currentOption:Option  'Declares as an Enum type
   ' currentOption = Option.C   ' Err connot convert from Int to Option 
   ' Print currentOption  'Prints 4
               
    Return 0
End
Function HasFlag?(value:Int, flag:Int)
  Return (value & flag = flag)
End Function
3- extend import keyword to accept a library that to be linked with ore code Example 
Import -lcomdlg32
inlineC
        
    //' Returns an empty String If dialog is cancelled
	static String openfilename() {
		const char *filter = "All Files (*.*)\0*.*\0";
		HWND owner = NULL;
		OPENFILENAME ofn;
		char fileName[MAX_PATH] = "";
		ZeroMemory(&ofn, sizeof(ofn));
		ofn.lStructSize = sizeof(OPENFILENAME);
		ofn.hwndOwner = owner;
		ofn.lpstrFilter = filter;
		ofn.lpstrFile = fileName;
		ofn.nMaxFile = MAX_PATH;
		ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
		ofn.lpstrDefExt = "";
		String fileNameStr;
		if ( GetOpenFileName(&ofn) )
			fileNameStr = fileName;
		return fileNameStr;
	}
 
endC
Extern
   Function OpenFileName:String() = "openfilename"
Public
Function Main:Int()
    Print OpenFileName()    
    Return 0
End
BTW , for MSVC using #LIBS will make it. 4- allow using #CC_OPTS with desktop target to accept g++ option that will pass while building monkey code. 5- allow import keyword to accept header files .h and c files , with c file it will automatically enclosed it with Extren "C"{} trem. those are what i have done till now , more will be coming. thanks | 
| 
 | ||
| Hi all, this time i bring to you my new features that added to Trans_ext. extend "Import" keyword so that it accept header files [zlib.h] to main.cpp file, also accept's c files [Myfile.c]. add keyword "PrjImport" that accepts many file format to the project , not well , the file that import with PrjImport will not insert into mai.cpp but will compile with it's compiler then linked with the main obj file. here is the file formats and it's corresponding compiler. 1- c/c++ -----------> compile with g++. 2-o(obj file) ----------> added to the link obj files table. 3-asm -----------> compile with Fasm assembler. 4- S(gas asm)--------> compile as gas assembler. 5 zir(High Level asm) -----> compile with Ziron assembler. her is an example that demonstrate the new features 
// this is the main file
Import Archive 
Function Main:Int() 
    Print MySquare(10) 'test fasm routin
    
    Local dststr:String="welcome"
    Local srcstr:String="1234567"
    H_strcpy(STRPTR(dststr),STRPTR(srcstr))    
    Print  dststr
    Return 0
End
// this is Archive.monkey file
Import os
#CC_OPTS+="-ID:\MonkeyX\MagicPro\zlib"
#CC_OPTS+="-ID:\MonkeyX\MagicPro\Encrpt"
Import -lwininet
PrjImport "zlib/adler32.c"
PrjImport "zlib/compress.c"
PrjImport "zlib/crc32.c"
PrjImport "zlib/deflate.c"
PrjImport "zlib/infback.c"
PrjImport "zlib/inffast.c"
PrjImport "zlib/inflate.c"
PrjImport "zlib/inftrees.c"
PrjImport "zlib/ioapi.c"
PrjImport "zlib/trees.c"
PrjImport "zlib/uncompr.c"
PrjImport "zlib/unzip.c"
PrjImport "zlib/zip.c"
PrjImport "zlib/zutil.c"
PrjImport "Resource/resource.cpp"
PrjImport "Encrpt/Encryptor.cpp"
PrjImport "asm/test.asm"
PrjImport "S/as_test.s"
PrjImport "zir/z_test.zir"
Import "zlib/zlib.h"
Import "Encrpt/Encryptor.h"
! CEncryptor Encrpt(0xFFDDCCAA);
! Extern "C" Int MySquare ( Int val);
! Extern "C" Void __stdcall H_strcpy  (DWORD dst,DWORD src);
Extern
     Function MySquare:Int(Val:Int) = "MySquare"
     Function H_strcpy:Void(dest:CHARPtr,source:CHARPtr) = "H_strcpy"
Public
// here is z_test.zir file
program MSCOFF  'test';
#define APPTYPE_LIB;
#include 'win_def.zir';
#Include 'console.zir';
function  H_strcpy(Dword dst, src)
{ 
  uses edx ebx;
  Eax = dst; 
  Edx = src; 
  push Eax;
  BX = word[Edx];
  while ( BX != 0)  
   {
      word[Eax] = BX; 
      Eax++; Edx++; 
      BX =  word[Edx]; 
   }
  word[Eax] = 0;
  pop Eax;
}
exports H_strcpy;
// this is test.asm file
    format	 COFF
    public	_MySquare
    section	"code" code
_MySquare:
   push	ebp
    mov	ebp,esp
    mov	eax, dword [ebp+8]
    imul	eax,eax
    mov	esp, ebp
    pop	ebp
    ret
//this is as_test.s file
        .text
LC0:
        .ascii "Hello, world!\12\0"
.globl s_test
s_test:
        pushl %ebp
        movl %esp, %ebp
        subl $4, %esp        
        movl $LC0, (%esp)
        call _printf
        movl $0, %eax
        leave
        ret
   
   .intel_syntax noprefix
.globl inteltest
inteltest:
        push ebp
        mov ebp, esp
        mov	eax, dword [ebp+8]
        imul eax,2
        leave
        ret
   .att_syntax noprefix
i have add fasm.exe and ziron.exe and it's stuff with the mingw folder for easy access of those compilers and assemblers. i will post then new trans with it's depended sooner. this will work only with gcc. Enjoy with extended monkey. | 
| 
 | ||
| Sounds like an awesome extension and very handful for some here. | 
| 
 | ||
| thanks Mike for your nice word. | 
| 
 | ||
| Nice, could be very useful in the future, well done Emil! |