Author Topic: Example Function converted PowB->PurB  (Read 5119 times)

0 Members and 1 Guest are viewing this topic.

Offline Theo Gottwald

  • Administrator
  • Hero Member
  • *****
  • Posts: 919
  • User-Rate: +30/-4
    • it-berater
Example Function converted PowB->PurB
« on: October 29, 2013, 07:45:49 AM »
This is the original PowerBasic Function:

Code: [Select]
' WaitForInputIdle(PID,opt MaxTime in ms)
' If Maxtime was reached, function returns 1 Else 0 * Default mxt=5000
FUNCTION X_CS(BYVAL h As LONG,OPT BYVAL mxt As DWORD) As LONG
LOCAL r,ProcID As LONG
If (mxt=0) THEN mxt=5000
GetWindowThreadProcessId(h,ProcID)
H = OpenProcess(%PROCESS_ALL_ACCESS,1,ProcID)
r = WaitForInputIdle(H,BYVAL mxt)
CloseHandle H
If (r<>0) THEN r=1
FUNCTION=r
End FUNCTION 

1. The first thing to do is, to replace the comment-sign ' against the ;
2. Second change the Variable declarations from "AS LONG" etc. to ".l"
3. Change the API-Constants from "%PROCESS*" to "#PROCESS*"
4. Change the API Names and add a "_" at their end.
5. Remove the "THEN" from all IF .. THEN and make them Multi-Liners
6. Change all "END IF" to "Endif" and also "END SELECT" to "EndSelect"
7. SUB and Function becomes "Procedure" with the appropriate ".x" Datatype
8. "LOCAL" becomes "Protected"
9. There is no "BYREF" or "BYVAL" available. Also there is no DWORD Datatype.
    Also there is not the WSTRING Datatype. In PureBasic you compile either with ANSI OR with Unicode. You can't easily mix.

Now in PureBasic it looks somehow like this:

Code: [Select]
; WaitForInputIdle(PID,opt MaxTime in ms)
; If Maxtime was reached, function returns 1 Else 0 * Default mxt=5000
;
Procedure.l X_CS(h.l,mxt.l=5000)
Protected r.l,ProcID.l
GetWindowThreadProcessId_(h,ProcID)
H = OpenProcess_(#PROCESS_ALL_ACCESS,1,ProcID)
r = WaitForInputIdle_(H,mxt)
CloseHandle_(H)
If (r<>0)
  r=1
EndIf 
ProcedureReturn r
EndProcedure

Offline Patrice Terrier

  • ROMs
  • Hero Member
  • *****
  • Posts: 936
  • User-Rate: +62/-1
    • www.zapsolution.com
Re: Example Function converted PowB->PurB
« Reply #1 on: October 29, 2013, 09:39:41 AM »
And the funny thing is that it is called PURE Basic, i would rather call it ObscureBasic  :P

What about this syntax:
// WaitForInputIdle(PID, opt MaxTime in ms)
// If Maxtime was reached, function returns 1 Else 0 * Default mxt=5000
FUNCTION X_CS(LOCAL h is int, LOCAL mxt is unsigned int)
r, ProcID is int
IF (mxt = 0) THEN mxt = 5000
GetWindowThreadProcessId(h, ProcID)
h = OpenProcess(PROCESS_ALL_ACCESS, 1, ProcID)
r = WaitForInputIdle(h, mxt)
CloseHandle(h)
IF (r<>0) THEN r = 1
RESULT r


Is not that closer to the original  ::)

Theo--
Fill free to remove this post from your PureBasic thread, but i couldn't resist.

« Last Edit: October 29, 2013, 09:42:47 AM by Patrice Terrier »
Patrice Terrier
GDImage (advanced graphic addon)
http://www.zapsolution.com

Offline Mike Stefanik

  • Full Member
  • ***
  • Posts: 104
  • User-Rate: +10/-6
    • Catalyst Development
Re: Example Function converted PowB->PurB
« Reply #2 on: October 29, 2013, 05:18:24 PM »
And the funny thing is that it is called PURE Basic, i would rather call it ObscureBasic  :P

That's always been my issue with PureBasic. The technical foundation for the language is great, but the syntax of the language is just bizarre. Particularly the use of "." to designate type when virtually every other implementation of Basic out there uses it in an object-oriented context. It's one of the least "Basic-like" languages out there that claims to be in the Basic family (at least by name).
Mike Stefanik
sockettools.com

Offline Daniel Corbier

  • Newbie
  • *
  • Posts: 7
  • User-Rate: +0/-0
    • uCalc Software
Re: Example Function converted PowB->PurB
« Reply #3 on: October 29, 2013, 06:00:43 PM »
Here's a transform based on Theo's steps.  It's not complete, plus there are several ways of doing it, but it gives an idea of how you might translate with uCalc Transform:



Notice how each line consists simply of listing the changes you want to make, without requiring a lot of extra code to actually do it.  You would simply load your file, then click Transform.
Daniel Corbier
uCalc Software

Offline Patrice Terrier

  • ROMs
  • Hero Member
  • *****
  • Posts: 936
  • User-Rate: +62/-1
    • www.zapsolution.com
Re: Example Function converted PowB->PurB
« Reply #4 on: October 29, 2013, 06:22:19 PM »
Daniel--

Just out of curiosity, did you have done one already to translate from PowerBASIC to C++ ?
Patrice Terrier
GDImage (advanced graphic addon)
http://www.zapsolution.com

Offline James C. Fuller

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 595
  • User-Rate: +11/-8
Re: Example Function converted PowB->PurB
« Reply #5 on: October 29, 2013, 06:47:48 PM »
Just as Patrice I could not resist.
bc9Basic and C++ are quite fussy about data types so I added hh.
It takes a bit to get used to after PowerBASIC and MASM32.

Note: GetWindowThreadProcessId returns a value

The translated c++ code compiled without complaints with VS12 Express.

James




Function X_CS( h As HWND,  mxt=0 As DWORD) As long
    Dim AS DWORD r,ProcID,dwrv
    Dim As HANDLE hh
    If mxt= 0 Then mxt = 5000
    GetWindowThreadProcessId(h,&ProcID)
    hh = OpenProcess(PROCESS_ALL_ACCESS,1,ProcID)
    r = WaitForInputIdle(hh, mxt)
    CloseHandle(hh)
    If r<> 0 Then r = 1
    Function = r
End Function



Offline Daniel Corbier

  • Newbie
  • *
  • Posts: 7
  • User-Rate: +0/-0
    • uCalc Software
Re: Example Function converted PowB->PurB
« Reply #6 on: October 29, 2013, 11:35:34 PM »
Patrice,

It's not done.  The PowerBASIC to C++ open source project using uCalc Transform started just 2 months ago, and I've been the only one contributing so far.  I think it can be completed much more quickly if more people join.  The project is hosted at:

https://github.com/uCalc/powerbasic-to-cpp

Everyone is invited to join.  Various levels of experience in C++ and PB is welcome.  In fact even PB programmers with no C++ experience have a lot they can contribute.  For instance, some of it involves refactoring PB code even before it gets converted to C++.

Yesterday's update involved a transform that replaces type specifiers with type names, and adds type names to arguments with neither specifier or type name based on DefType, etc.

So it would change this code:

Code: [Select]
DefLng a-z
DefByt b
DefInt i
DefStr s
DefQud q
DefSng n-p, x-z

Global MyValue!, Label$, Price@, ExtVal##, qNum&&

Function Test(a, b, c, i, s, n)
   Print MyValue!, Label$, Price@
End Function

Function Report$(LastName$, ByVal x&, ByRef NewPrice@, n, ByVal i, nValue, qValue)
   Dim FirstName$, Age?, Total@
   Static Index&

   Print LastName$, x&, NewPrice@, n, i, nValue, qValue
   Report$ = FirstName$ + LastName$
End Function

Function Hello(txt$) As String
   Print txt$
   Function = txt$ + " friend!"
End Function

Function Bye()
   Print "Bye"
End Function

to this:
Code: [Select]
Global MyValue As Single, Label As String, Price As Currency, ExtVal As Extended, qNum As Quad

Function Test(ByRef a As Long, ByRef b As Byte, ByRef c As Long, ByRef i As Integer, ByRef s As String, ByRef n As Single) As Long
   Print MyValue, Label, Price
End Function

Function Report(ByRef LastName As String, ByVal x As Long, ByRef NewPrice As Currency, ByRef n As Single, ByVal i As Integer, ByRef nValue As Single, ByRef qValue As Quad) As String
   Dim FirstName As String, Age As Byte, Total As Currency
   Static Index As Long

   Print LastName, x, NewPrice, n, i, nValue, qValue
   Report = FirstName + LastName
End Function

Function Hello(ByRef txt As String) As String
   Print txt
   Function = txt + " friend!"
End Function

Function Bye() As Byte
   Print "Bye"
End Function

The transform for this is at https://github.com/uCalc/powerbasic-to-cpp/blob/master/convert/typespecifiers.uc (note this is a plain text file in raw form; it's meant to be loaded into uCalc Transform).

I had considered BCX, but the syntax is just too different from PowerBASIC.  I want something that works with my existing PB code as-is; hence this project.
Daniel Corbier
uCalc Software

Offline Brice Manuel

  • Full Member
  • ***
  • Posts: 154
  • User-Rate: +0/-0
Re: Example Function converted PowB->PurB
« Reply #7 on: October 30, 2013, 06:45:59 PM »
but the syntax of the language is just bizarre.
Bizarre and wordy.  Sometimes I feel like I am typing complete sentences for commands.