Basic Hypertext Preprocessor

User projects written in or related to FreeBASIC.
Posts: 3
Joined: Apr 03, 2007 16:01

Basic Hypertext Preprocessor

Postby fishhf » Apr 03, 2007 16:22

I've just wrote a preprocessor for freebasic to allow making dynamic sites in freebasic.
The preprocessor compiles bhp files(html+freebasic) to a dll. The edited webserver calls the preprocessor when the corresponding dll doesn't exist for the bhp file when the browser requests the page, then the webserver loads the dll and calls the entry function which will return the response.

It currently supports <% %> and <%= %> tags to escape from html to freebasic codes.

To try it:
1.Get CVS freebasic (windows, modifications needed for linux)
2.Compile the sources to exe
3.put freebasic in a FreeBASIC folder with the exes, so bhp can call "FreeBASIC\fbc.exe"
4.put the test.bhp with the exes webserver

Let's get form posting handling ready and replace php lol

bhp.bas compile to bhp.exe

Code: Select all

'Copyright (c) 2007 Lung Wing Kiu aka fishhf
'This software is provided 'as-is', without any express or implied
'warranty. In no event will the authors be held liable for any damages
'arising from the use of this software.
'Permission is granted to anyone to use this software for any purpose,
'including commercial applications, and to alter it and redistribute it
'freely, subject to the following restrictions:
'    1. The origin of this software must not be misrepresented; you must not
'    claim that you wrote the original software. If you use this software
'    in a product, an acknowledgment in the product documentation would be
'    appreciated but is not required.
'    2. Altered source versions must be plainly marked as such, and must not be
'    misrepresented as being the original software.
'    3. This notice may not be removed or altered from any source
'    distribution.

Sub replaceString(ByRef s As String,f As String,r As string)
   Dim As Integer st=InStr(s,f)
   Dim As Integer lenf=Len(f)
   Dim As Integer lenr=Len(r)
   Do While st<>0
      Dim As String l=Mid(s,1,st-1)
      Dim As String ri=Mid(s,st+lenf)
End Sub

sub splitString(ByRef s As String,l As Integer,arr() As String)
   Dim As Integer parts=Len(s)/l
   'if float s/l > integer s/l then parts++
   If (Cast(Single,Len(s))/Cast(Single,l))>Cast(Single,parts) Then parts+=1
   ReDim As String arr(0 To parts-1)
   Dim As Integer ind=0
   For i As Integer=1 To l*parts Step l
End Sub

Sub translate(ByRef i As String,ByRef translated As string)
   Dim As Integer s=InStr(i,"<%")
   Dim As String arr()
   Do While s<>0
      Dim As String lhtml=Mid(i,1,s-1)
      For ind As Integer=LBound(arr) To UBound(arr)
         Dim As String chunk=arr(ind)
         replaceString(chunk,"\","\\") ' \ to \\
         replaceString(chunk,!"\"",!"\\\"")' " to \"
         replaceString(chunk,!"\r","\r")' cr to \r
         replaceString(chunk,!"\n","\n")' lf to \n
      Dim As Integer e=InStr(i,"%>")
      If Mid(i,s+2,1)="=" Then
         'if <%=
         Dim As String inside=Mid(i,s+3,e-(s+3)) 'inside <%= and %>
         replaceString(inside,!"\r","")' remove cr
         replaceString(inside,!"\n","")' remove lf
   For ind As Integer=LBound(arr) To UBound(arr)
      Dim As String chunk=arr(ind)
      replaceString(chunk,"\","\\") ' \ to \\
      replaceString(chunk,!"\"",!"\\\"")' " to \"
      replaceString(chunk,!"\r","\r")' cr to \r
      replaceString(chunk,!"\n","\n")' lf to \n
End Sub

Sub startTranslate(ByRef translated As string)
   translated+=!"Function entry cdecl alias \"entry\" () As String export\r\n"
   translated+=!"Dim As String response=\"\"\r\n"
   translated+=!"Return response\r\n"
   translated+=!"End Function\r\n"
End Sub

Sub main()
   Print "Basic Hypertext Preprocessor build:"+__DATE__+" "+__TIME__
   Print "Copyright(c) 2007 Lung Wing Kiu"
   Dim As String filename=Command(1)
   If Open( filename For Binary Access Read Shared As 1 ) = 0 Then
      Print "processing:"+filename
      Dim As String translated=""
      Print "translated:"
      Print translated
      Open filename For Output As #2
         put #2,,translated
      Close #2
      Close #1
      shell !"FreeBASIC\\fbc.exe -mt -dll \""+filename+!"\">out.txt"
      Open "out.txt" For Input As #3
      Dim As String compileResult
      Close #3
      Kill filename
      Print compileResult
      Print "Done!"
      Print "Error reading file:"+filename+"."
End Sub



webserver.bas compile to exe

Code: Select all

'Simple Web Server, (c) Anselme Dewavrin 2006 -
'Feel free to use it, provided you mention my name.

'based on the example provided with freebasic.

'edited to run with BHP by fishhf

'Option Explicit

#include once ""
#Include Once ""
#Include once "win/"
#Include once "win/"

Const ID_RUN          = 1001
Const ID_PAUSE        = 1002
Const ID_EXIT         = 1003
Const SERVER_ADDR     = "localhost"
Const HOMEDIR              = "."
Const DEFAULT_PORT    = 8080

Dim Shared TB_CREATED As Integer
Dim Shared szAppName As String
Dim Shared As Integer ServerPort = DEFAULT_PORT


        socket                        As SOCKET
        ip                        As Integer
        port                        As Integer
        recvthread                As Integer
        prev                        As CLIENT Ptr
        Next                        As CLIENT Ptr
End Type

        socket                        As SOCKET
        acceptthread                As Integer
        isrunning                As Integer
        globmutex                As Integer
        filemutex                As Integer
        clientlisthead  As CLIENT Ptr
End Type

Dim Shared ctx As SERVERCTX

'multithreaded socket handling

Sub serverDel( Byval client As CLIENT Ptr )
        Dim s As SOCKET

        '' not already removed?
        If( client->socket <> NULL ) Then
                s = NULL
                Swap s, client->socket        ' this should be atomic..

                '' close connection
        shutdown( s, 2 )
        closesocket( s )

                '' recv thread stills running?
                If( client->recvthread <> NULL ) Then
                        threadwait( client->recvthread )
                End If

                '' remove from list
                If( client->next ) Then
                        client->next->prev = client->prev
                End If
                If( client->prev ) Then
                        client->prev->next = client->next
                        ctx.clientlisthead = client->next
                End If
        End If

End Sub

Function serverEnd( ) As Integer
        Dim client As CLIENT Ptr

        ctx.isrunning = FALSE

        '' close the listening socket
        If( ctx.socket <> 0 ) Then
        shutdown(ctx.socket, 2 )
        closesocket( ctx.socket )
                ctx.socket = 0
        End If

        '' remove all clients yet running
        Dim i As Integer

                client = ctx.clientlisthead
                If( client = NULL ) Then
                        Exit Do
                End If
                serverDel( client )

        '' shutdown winsock
        Function = WSACleanup( )

End Function

Sub replaceString(ByRef s As String,f As String,r As string)
   Dim As Integer st=InStr(s,f)
   Dim As Integer lenf=Len(f)
   Dim As Integer lenr=Len(r)
   Do While st<>0
      Dim As String l=Mid(s,1,st-1)
      Dim As String ri=Mid(s,st+lenf)
End Sub

'thread waiting for data to arrive, parsing HTTP GET requests and sending responses
Sub serverReceive( Byval client As CLIENT Ptr )

    Dim PacketBuffer(SERVER_BUFFSIZE) As Byte
    Dim As Integer  ReceivedLen = 0
    Dim As Byte Ptr ReceivedBuffer = 0
    Dim As String   stNL   = Chr(13) & Chr(10)
    Dim As String   stNLNL = stNL & stNL

   Dim FileBuffer() As Byte 'fix for fb0.16beta, thx v1ctor
   Dim SendBuffer() As Byte 'fix for fb0.16beta, thx v1ctor
   Dim FileHandle As Ubyte

        'receive loop
        Do While( ctx.isrunning And (client->socket <> NULL) )

                ' block until some data
        Dim bytes As Integer
                bytes = recv( client->socket, @PacketBuffer(0), SERVER_BUFFSIZE, 0 )

                ' connection closed?
                If( bytes <= 0 ) Then
                        Exit Do
                End If

        ' accumulate received data
        ReceivedBuffer = reallocate(ReceivedBuffer, bytes + ReceivedLen)
        Dim i As Integer
        For i=0 To bytes-1
            ReceivedBuffer[ReceivedLen+i] = PacketBuffer(i)
        Next i
        ReceivedLen += bytes
      Dim As String strecv=""
              For i = 0 To ReceivedLen-1
            Print strecv   
        'CRLF found twice ?
        If (ReceivedLen >= 4)                   And _
           (ReceivedBuffer[ReceivedLen-4] = 13) And _
           (ReceivedBuffer[ReceivedLen-3] = 10) And _
           (ReceivedBuffer[ReceivedLen-2] = 13) And _
           (ReceivedBuffer[ReceivedLen-1] = 10) Then
            'extract get path + url decoding (special chars are coded %XY)
            Dim As String stPath = HOMEDIR
            Dim As Integer iAcc = 0, iHex = 0
            For i = 4 To ReceivedLen-1
                Dim c As Byte
                c = ReceivedBuffer[i]
                If c = Asc(" ") Then Exit For
                If iHex <> 0 Then
                    iHex += 1   'decode hex code
                    iAcc *= 16
                    iAcc += (c-48)
                    If iHex = 3 Then
                        c = iAcc
                        iAcc = 0
                        iHex = 0
                If c=Asc("%") Then 'hex code coming ?
                    iHex = 1
                    iAcc = 0
                If iHex = 0 Then stPath += Chr(c)
            Next i
            If (stPath = HOMEDIR + "/") Or _  'default page and
               (Instr(stPath,"..") <> 0) Then 'restrict to wwwroot
                stPath = HOMEDIR + "/index.html"
            End If
            'get rid of received data
            ReceivedLen = 0

            'prepare response
            Dim As String  stReponseHeader
            Dim As Integer FileLength = 0

            'read requested file from disk (no mutex, thanx to Zerospeed)
            If dir(stPath) = "" Then
                stReponseHeader = "HTTP/1.1 404 Not Found" & stNL & stNL
                stReponseHeader += "HTTP/1.1 404 Not Found"
                FileHandle = Freefile
                If Open( stPath For Binary Access Read Shared As #FileHandle ) <> 0 Then
                    stReponseHeader = "HTTP/1.1 403 Forbbiden" & stNL & stNL
                    stReponseHeader += "HTTP/1.1 403 Forbbiden"
                   If Right(stpath,4)=".bhp" Or Right(stpath,4)=".jsp" Then
                      Close #FileHandle
                      Dim As HMODULE hmod=LoadLibrary(stpath+".dll")
                      Dim As Boolean compileError=false
                      If hmod=0 Then
                         'library doesn't exist, so compile it
                         Shell !"bhp \""+stpath+!"\""
                         If Not compileError Then hmod=LoadLibrary(stpath+".dll")
                      If hmod<>0 Then 'if hmod is library
                         Dim As Function Cdecl () As String entry
                         entry=Cast(Function Cdecl () As String,GetProcAddress(hmod,"entry"))
                         Dim As String htmlresult=entry()
                         Dim FileBuffer(FileLength) As Byte
                         For i As Integer=1 To FileLength
                      Else 'else hmod is not valid
                         If compileError then
                            'compile error
                            Dim As String htmlresult="<html><body>Compile error!<br><br>"
                            Open "out.txt" For Input As #2
                            Close #2
                            Dim FileBuffer(FileLength) As Byte
                            For i As Integer=1 To FileLength
                         End If
                      End if
                   Else 'else request is not bhp
                      FileLength = Lof(FileHandle)    'file len
                       If FileLength <> 0 Then
                           Dim FileBuffer(FileLength) As Byte
                           Get #FileHandle, , FileBuffer()
                       End If
                       Close #FileHandle

                    stReponseHeader = "HTTP/1.1 200 OK" & stNL
                    stReponseHeader += "Cache-Control: private" & stNL
                    stReponseHeader += "Content-Type: text/html" & stNL
                    stReponseHeader += "content-length : " & Str(FileLength) & stNL & stNL
                End If
            End If

            'copy response header to sendbuffer
            Dim HeaderLength As Integer
            HeaderLength = Len(stReponseHeader)

            Dim As Integer SendBufferLen = HeaderLength + FileLength
            Dim SendBuffer(SendBufferLen) As Byte

            'copy loop (thx v1ctor for this simplified version)
            For i = 0 To HeaderLength-1
                SendBuffer(i) = stReponseHeader[i]
            Next i

            'copy response data to sendbuffer
            If FileLength <> 0 Then
                For i = 0 To FileLength-1
                    SendBuffer(i+HeaderLength) = FileBuffer(i)
                Next i
            End If

            'send response
            Dim As Byte Ptr sendptr
            sendptr = @sendBuffer(0)
            Do While (ctx.isrunning And (client->socket <> NULL) And (SendBufferLen > 0))

                ' loop until the whole buffer is sent
                bytes = send( client->socket, sendptr, SendBufferLen, 0 )

                '' connection closed?
                If( bytes <= 0 ) Then
                    Exit Do
                End If

                sendptr       += bytes
                SendBufferLen -= bytes
            Loop 'send loop

            ' remove client
            client->recvthread = NULL
            serverDel( client )

        End If 'bFound

    Loop 'receive loop

        ' remove client
        client->recvthread = NULL
        serverDel( client )

End Sub

Sub serverAccept( Byval unused As Integer )
        Dim sa As sockaddr_in
        Dim s As SOCKET

        Do While( ctx.isrunning )

        Dim salen As Integer
        salen = Len( sockaddr_in )
                s = accept( ctx.socket, cptr( PSOCKADDR, @sa ), @salen )
                If( s = INVALID_SOCKET ) Then
                        Exit Do
                End If

        Dim client As CLIENT Ptr
        '' access global data, lock it
        mutexlock( ctx.globmutex )
        '' allocate node
        client = allocate( Len( CLIENT ) )
        '' add to head of list
        client->next = ctx.clientlisthead
        ctx.clientlisthead = client
        If client->next Then client->next->prev = client
        client->prev = NULL

        mutexunlock( ctx.globmutex )
        '' setup the client
        client->socket                                 = s
        client->ip                                        = (@sa)->sin_addr.S_addr
        client->port                                = (@sa)->sin_port
        '' start new recv and send threads
        client->recvthread                         = threadcreate( @serverReceive, Cint( client ) )


        ctx.isrunning = FALSE
End Sub

Function serverRun( ) As Integer
        ' start winsock
        Dim wsaData As WSAData
        If( WSAStartup( MAKEWORD( 2, 0 ), @wsaData ) <> 0 ) Then
                'print "error calling WSAStartup: "; WSAGetLastError( )
                Return FALSE
        End If

        If( wsaData.wVersion <> MAKEWORD( 2, 0 ) ) Then
                WSACleanup( )       
                Return FALSE
        End If

        ' create a socket for listening
        ctx.socket = opensocket( AF_INET, SOCK_STREAM, IPPROTO_TCP )
        If( ctx.socket = NULL ) Then
                'print "error calling opensocket: "; WSAGetLastError( )
                Return FALSE
        End If

        ' bind it to the server port
        Dim sa As sockaddr_in
    sa.sin_port                        = htons( ServerPort )
        sa.sin_family                = AF_INET
        sa.sin_addr.S_addr        = INADDR_ANY
    If(bind( ctx.socket, cptr( PSOCKADDR, @sa ), Len( sa ) ) = SOCKET_ERROR ) Then
                'print "error calling bind: "; WSAGetLastError( )
                Return FALSE
        End If       

    If( listen( ctx.socket, SOMAXCONN ) = SOCKET_ERROR ) Then
                Return FALSE
        End If

        ctx.clientlisthead = NULL
        ctx.isrunning = TRUE

        ctx.globmutex = mutexcreate( )
        ctx.filemutex = mutexcreate( )

        ctx.acceptthread = threadcreate( @serverAccept ) 'launch accept thread
        Function = TRUE
End Function

'----------- TRAY ICON HANDLING --------------

Function WndProc ( Byval hWnd As HWND, Byval message As UINT, Byval wParam As WPARAM, Byval lParam As LPARAM ) As LRESULT

   Static pt As Point
   Function = 0

   Select Case (message)
      TB_CREATED = RegisterWindowMessage ("TaskbarCreated")
      Exit Function

      UnregisterClass (szAppName, GetModuleHandle( null ))
      Shell_NotifyIcon (NIM_DELETE, @note)
      PostQuitMessage( 0 )
      Exit Function

      If LOWORD (wParam)= ID_RUN Then
           If ctx.isrunning = FALSE Then serverRun( ) 'Listenning on 80
      End If
      If LOWORD (wParam)= ID_PAUSE Then
            If         ctx.isrunning = TRUE Then serverEnd( ) 'pause
      End If
      If LOWORD (wParam) = ID_EXIT Then
         DestroyWindow (hWnd)
      End If

      If (lParam = WM_RBUTTONDOWN) Or (lParam = WM_LBUTTONDOWN) Then
         GetCursorPos (@pt)
         SetForegroundWindow (hWnd)
         Dim MainMenu As HANDLE
         Dim FileMenu As HANDLE
         MainMenu = CreateMenu ()
         FileMenu = CreateMenu ()
         If ctx.isrunning = TRUE Then
            AppendMenu (FileMenu, MF_STRING Or MF_CHECKED Or MF_GRAYED, ID_RUN, "&Run")
            AppendMenu (FileMenu, MF_STRING, ID_PAUSE, "&Pause")
            AppendMenu (FileMenu, MF_STRING, ID_RUN, "&Run")
            AppendMenu (FileMenu, MF_STRING Or MF_CHECKED Or MF_GRAYED, ID_PAUSE, "&Pause")
         End If
         AppendMenu (FileMenu, MF_STRING, ID_EXIT, "E&xit")
         InsertMenu (MainMenu, 0, MF_POPUP, cuint(FileMenu), "invisible menu")

         TrackPopupMenuEx (FileMenu, TPM_LEFTALIGN Or TPM_RIGHTBUTTON, pt.x, pt.y, hWnd, NULL)

         PostMessage (hWnd, WM_NULL, 0, 0)
      End If

      Shell_NotifyIcon (NIM_ADD, @note)

   End Select

   Function = DefWindowProc( hWnd, message, wParam, lParam )
End Function

'---------------- SIMILI-WINMAIN ----------------

Dim hInstance As HINSTANCE
hInstance = GetModuleHandle( null )

If Command$ <> "" Then
    ServerPort = Val(Command$)

If( FALSE = serverRun( ) ) Then End

Dim wMsg As MSG
Dim wcls As WNDCLASS
Dim hWnd As HWND

szAppName = "SWS"

'already running ?
If hWnd <> 0 Then
end If

With wcls
  .lpfnWndProc = @WndProc
  .cbClsExtra = 0
  .cbWndExtra = 0
  .hInstance  = hInstance
  .hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (1))
  .hCursor = LoadCursor( NULL, IDC_ARROW )
  .hbrBackground = GetStockObject( WHITE_BRUSH )
  .lpszMenuName = NULL
  .lpszClassName = Strptr( szAppName )
End With

If( RegisterClass( @wcls ) = FALSE ) Then
end If

'' Create the window and _BUT DONT_ show it
hWnd = CreateWindowEx( 0, szAppName, "", 0, 0, 0, 0, 0, NULL, NULL, hInstance, NULL )

note.cbSize = sizeof (NOTIFYICONDATA)
note.hWnd = hWnd
note.hIcon = 0'LoadIcon (hInstance, MAKEINTRESOURCE (1))
note.uCallbackMessage = WM_SHELLNOTIFY
note.szTip= szAppName
Shell_NotifyIcon (NIM_ADD, @note)

Print "Listening on port "+Str(DEFAULT_PORT)
Print "Webserver initialized!"

'wait for quit message
While GetMessage( @wMsg, NULL, 0, 0 ) <> FALSE
    TranslateMessage( @wMsg )
    DispatchMessage( @wMsg )

'eventually stop server
If ctx.isrunning = TRUE Then
    serverEnd( )
End If

test.bhp put it with the exes

Code: Select all

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">
<html xmlns="">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<style type="text/css">
.table {
   border: 1px solid #0033FF;
.style1 {border: 1px solid #0033FF; color: #0000FF; }
<table width="32%" class="table">
    <td class="style1">name</td>
   <% randomize timer
      dim as integer upper=rnd()*1000 %>
    <td class="style1">number 1 to <%=upper%></td>
  <% for i as integer=1 to upper %>
    <td class="style1">apple<%=i%></td>
    <td class="style1"><%=i%></td>
  <% next %>
<form action="test.jsp" method="post" enctype="multipart/form-data" name="form1" id="form1">
  <input name="name" type="text" id="name" />
  <br />
  <input type="submit" name="Submit" value="Submit" />

edit:6.try http://127.0.01:8080/test.jsp typo
Last edited by fishhf on Feb 04, 2008 14:55, edited 1 time in total.
Posts: 215
Joined: Jun 10, 2006 12:15

Postby HD_ » May 03, 2007 23:55

This is pretty cool actually ;) I'm suprised no one else replied yet, this could be really useful. I like that it is quite easy to set up- that's always a bonus with lazy people like me :)

I haven't tested it any further than the example you posted just yet, but I would definetely like to see this going further ;)
Site Admin
Posts: 5317
Joined: May 27, 2005 6:42
Location: Illinois

Postby cha0s » May 04, 2007 1:35

Wow, it's nice of you to bump this, I don't remember ever seeing it.. and it's like a month old!

Looks coool...
Posts: 5477
Joined: Sep 12, 2005 20:06
Location: Ohio, USA

Postby Pritchard » Jun 28, 2007 3:17

Very cool looking. I'll be adding this to the code directory under web, although it appears to be windows only?
Posts: 91
Joined: Jul 15, 2005 15:58

Postby Torahteen » Jun 29, 2007 14:21

This is cool! Any way to make this work with something like Apache?
Posts: 72
Joined: Sep 13, 2006 19:01
Location: Argentina

Postby KaraK » Jul 08, 2007 6:41

awesome !
really great fishhf
Posts: 1393
Joined: May 27, 2005 15:40
Location: Barcelona, Spain

Postby Antoni » Sep 24, 2007 19:13

What I had to do to have this demo working:
1.- Parakeet's webserver will compile if you substitute
Dim Filebuffer to ReDim Filebbuffer
DimSendBuffer to ReDim SendBuffer

2.-Both the executables and the test.bhp must be put at FB's PARENT folder.

3.-The URL to get the demo working is http://127-0.0.1/test.bhp, the URL in the first post is wrong.
Posts: 10
Joined: Jul 26, 2006 0:39

Postby mlw4428 » Jan 11, 2008 6:46

I'm curious as to what happened to this project? What are the apparent limitations? How good would BASIC be as a web programming language?
Site Admin
Posts: 5317
Joined: May 27, 2005 6:42
Location: Illinois

Postby cha0s » Jan 11, 2008 17:03

imo, PHP will own BASIC as a web dev language. Dynamic typing and the *huge* library of code written already are some contributing factors. Not saying it wouldn't be fun to use FB :)
Posts: 260
Joined: May 27, 2005 6:02

Postby fsw » Jan 11, 2008 18:25

EDIT: post deleted myself after reading the L******B**** Forum rules!
Last edited by fsw on Jan 12, 2008 3:08, edited 1 time in total.
Carl Gundel
Posts: 3
Joined: Mar 01, 2007 20:53

Postby Carl Gundel » Jan 11, 2008 20:27

fsw wrote:
mlw4428 wrote:How good would BASIC be as a web programming language?

The makers of Liberty Basic recently released such a commercial web language: Run BASIC.

The future will show if there will be a market for it...

Thanks for mentioning Run BASIC.

Run BASIC is designed to be different than other web programming systems. It emphasizes BASIC-ness over web-ness, though it has both. It comes with everything you need including a web server, a programming interface, and a runtime system.

You program in your web browser. When you click the run button you see exactly how your program will work in a browser because that's where you already are. When you want to deploy the app you just click on the Publish tab and check a box next to the desired project.

Web programming systems have too many moving parts. Run BASIC brings back the simplicity of programming in BASIC and applies it to web programming.

BTW we also have a forum at

-Carl Gundel
Site Admin
Posts: 3795
Joined: May 27, 2005 8:08
Location: SP / Bra[s]il

Postby v1ctor » Jan 11, 2008 22:38

I hope you will from now be as open as we are being, when people mention 'FreeBASIC' in your Liberty Basic forum (i've seen the contrary there, and your FAQ shows that you are very restrict about any mention of other languages: Forum rules), or else i will start removing the links like in the above message and take them as spam (as you do in your forum).
Posts: 1401
Joined: Jul 29, 2006 3:00
Location: US

Postby sir_mud » Jan 12, 2008 0:32

back on topic, we have a great deal of string processing functions in the Extended Library that operate very similiarly to php's equivalents. I'm pretty interested in this project, i'll try and take look sometime to see about an apache module for this.
Posts: 260
Joined: May 27, 2005 6:02

Postby fsw » Jan 12, 2008 3:05

Sorry Victor,
didn't want to make any trouble.
I'm not a L******B**** user and didn't know about their special forum rules.
Site Admin
Posts: 3795
Joined: May 27, 2005 8:08
Location: SP / Bra[s]il

Postby v1ctor » Jan 12, 2008 18:39

No problem, fsw, i'm only asking for a fair game, if they don't want FB to be cited in their forums (every time there's a referer in Cpanel from the LB forum, trying to check what was linking to will give no results whe doing a search in their forum, meaning the URL was removed or the message deleted), don't come here promoting their stuff (paid or not).

Return to “Projects”

Who is online

Users browsing this forum: Exabot [Bot] and 2 guests