From c460dbb8087837d029620bec4cf802e42f3ecd79 Mon Sep 17 00:00:00 2001 From: Luke Ceddia Date: Thu, 24 Jul 2014 19:24:00 +1000 Subject: [PATCH] Fix glut-calling commands, make IDE use _BLINEINPUT for '$includes (for Steve). Glut commands _SCREENX, _SCREENY, _SCREENMOVE, _DESKTOPHEIGHT, _DESKTOPWIDTH, _SCREENICON now wait for the screen to be created before trying to work. Change to QB64.bas source to use _BLINEINPUT instead of LINE INPUT for INCLUDE$. This should make the IDE much more responsive when Includes are used from now on. --- .../c/User Mods/Steve Stuff/file_access.cpp | 88 ++++++++++++++++--- .../c/User Mods/Steve Stuff/screeninfo.cpp | 8 ++ internal/c/libqb.cpp | 3 + source/ide/ide_methods.bas | 5 +- source/qb64.bas | 9 +- .../extensions/Steve Stuff-ID_Includes.bas | 16 +--- source/subs_functions/subs_functions.bas | 3 +- 7 files changed, 98 insertions(+), 34 deletions(-) diff --git a/internal/c/User Mods/Steve Stuff/file_access.cpp b/internal/c/User Mods/Steve Stuff/file_access.cpp index ba8abaa38..f46dfef33 100644 --- a/internal/c/User Mods/Steve Stuff/file_access.cpp +++ b/internal/c/User Mods/Steve Stuff/file_access.cpp @@ -14,28 +14,90 @@ void sub__getinput(int32 filehandle, qbs *deststr) { eol = qbs_new_txt_len("\n", 1); int64 start_byte = func_seek(filehandle); - if (start_byte + filebuf_size > func_lof(filehandle)) filebuf_size = func_lof(filehandle) - start_byte; - if (start_byte > func_lof(filehandle)) { + int64 filelength = func_lof(filehandle); + if (start_byte > filelength) { error(62);//input past end of file return; } qbs *buffer = qbs_new(filebuf_size, 0); qbs_set(deststr, qbs_new_txt_len("", 0)); do { - - sub_get2(filehandle, start_byte, buffer, 1); + if (start_byte + filebuf_size > filelength) filebuf_size = filelength - start_byte + 1; + qbs_set(buffer,func_space(qbr(filebuf_size))); + + sub_get2(filehandle, start_byte, buffer, 1); int32 eol_pos = func_instr(0, buffer, eol, 0); if (eol_pos == 0) { - start_byte += filebuf_size; - qbs_set(deststr, qbs_add(deststr, buffer)); - } + if ((start_byte + filebuf_size)>=filelength) { + qbs_set(deststr, buffer); + gfs_setpos(fileno,filelength); //set the position right before the EOF marker + gfs_file[fileno].eof_passed=1;//also set EOF flag; + qbs_free(buffer); + return; + } + filebuf_size += 512; + } else { - start_byte += eol_pos - 1; - qbs_set(deststr, qbs_add(deststr, qbs_left(buffer, eol_pos - 1))); - break; + qbs_set(deststr, qbs_add(deststr, qbs_left(buffer, eol_pos - 1))); + break; } } while (!func_eof(filehandle)); - if (deststr->chr[deststr->len - 1] == '\r') qbs_set(deststr, qbs_left(deststr, deststr->len-1)); - sub_seek(filehandle, start_byte + eol->len); qbs_free(buffer); -} \ No newline at end of file + if (start_byte + deststr->len + 2 >= filelength) { //if we've read to the end of the line + gfs_setpos(fileno,filelength); //set the position right before the EOF marker + gfs_file[fileno].eof_passed=1;//also set EOF flag; + if (deststr->chr[deststr->len - 1] == '\r') qbs_set(deststr, qbs_left(deststr, deststr->len-1)); + return; + } + gfs_setpos(fileno,start_byte + deststr->len); //set the position at the end of the text + if (deststr->chr[deststr->len - 1] == '\r') qbs_set(deststr, qbs_left(deststr, deststr->len-1)); +} + + + +/* +OPEN "test.txt" FOR OUTPUT AS #1 +FOR i = 0 TO 9 + t$ = t$ + "This is a test #" + STR$(i) + PRINT #1, t$; +NEXT +CLOSE + +OPEN "test.txt" FOR BINARY AS #1 +DO + z = z + 1 + _BLINEINPUT 1, x$ + 'GetInput 1, x$ <-- This should be the BASIC equivelant of our routine. (I hope.) + PRINT x$, LEN(x$), ASC(x$, LEN(x$)) +LOOP UNTIL EOF(1) +CLOSE + +SUB GetInput (filehandle AS LONG, text AS STRING) + +FileBuffer = 512 ' Set this number to match the sector size of your hard drive. +' Then we can read as much data as possible each spin of the disk head, +' and not need extra reads in the future. +DIM CRLF AS STRING +CRLF = CHR$(10) +StartByte = SEEK(filehandle) +DO + IF StartByte + FileBuffer >= LOF(filehandle) THEN FileBuffer = LOF(filehandle) - StartByte + 1 + temp$ = SPACE$(FileBuffer) + GET #filehandle, StartByte, temp$ + x = INSTR(temp$, CRLF) + IF x = 0 THEN + IF StartByte + FileBuffer = LOF(1) THEN text = temp$: EXIT DO 'Our while file is one line with NO CRLF + FileBuffer = FileBuffer + 512 + ELSE + text = LEFT$(temp$, x - 1) + EXIT DO + END IF + PRINT StartByte, FileBuffer, LEN(text), LOF(1) + SLEEP +LOOP UNTIL EOF(filehandle) + +SEEK filehandle, StartByte + LEN(text) + 1 +IF StartByte + LEN(text) + 1 >= LOF(1) THEN GET #1, , temp$ 'if we're at the eol be certain to trigger the eol flag +IF RIGHT$(text, 1) = CHR$(13) THEN text = LEFT$(text$, LEN(text$) - 1) +END SUB +*/ \ No newline at end of file diff --git a/internal/c/User Mods/Steve Stuff/screeninfo.cpp b/internal/c/User Mods/Steve Stuff/screeninfo.cpp index ede865afa..3b5aed657 100644 --- a/internal/c/User Mods/Steve Stuff/screeninfo.cpp +++ b/internal/c/User Mods/Steve Stuff/screeninfo.cpp @@ -1,7 +1,15 @@ int32 func_screenwidth () { + while (!window_exists){Sleep(100);} return glutGet(GLUT_SCREEN_WIDTH); } int32 func_screenheight () { + while (!window_exists){Sleep(100);} return glutGet(GLUT_SCREEN_HEIGHT); +} + +void sub_screenicon () { + while (!window_exists){Sleep(100);} + glutIconifyWindow; + return; } \ No newline at end of file diff --git a/internal/c/libqb.cpp b/internal/c/libqb.cpp index cc55f8e53..15802eb17 100644 --- a/internal/c/libqb.cpp +++ b/internal/c/libqb.cpp @@ -26889,6 +26889,7 @@ int32 func__printwidth(qbs* text, int32 screenhandle, int32 passed){ int32 func__screenx(){ #ifdef QB64_WINDOWS + while (!window_exists){Sleep(100);} //Wait for window to be created before checking position return glutGet(GLUT_WINDOW_X) - glutGet(GLUT_WINDOW_BORDER_WIDTH); #endif return 0; //if not windows then return 0 @@ -26896,6 +26897,7 @@ int32 func__printwidth(qbs* text, int32 screenhandle, int32 passed){ int32 func__screeny(){ #ifdef QB64_WINDOWS + while (!window_exists){Sleep(100);} //Wait for window to be created before checking position return glutGet(GLUT_WINDOW_Y) - glutGet(GLUT_WINDOW_BORDER_WIDTH) - glutGet(GLUT_WINDOW_HEADER_HEIGHT); #endif return 0; //if not windows then return 0 @@ -26907,6 +26909,7 @@ int32 func__printwidth(qbs* text, int32 screenhandle, int32 passed){ if (passed==3) goto error; if (full_screen) return; + while (!window_exists){Sleep(100);} //wait for window to be created before moving it. if (passed==2){ glutPositionWindow (x,y);} else{ diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index 9539e3fc2..87a0a8abf 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -6210,14 +6210,15 @@ FOR y = 0 TO (idewy - 9) CASE CHR$(34) inquote = NOT inquote CASE "'" - IF inquote = 0 AND MID$(a$, k, 2) = "'$" THEN metacommand = -1 ELSE comment = -1 + IF inquote = 0 AND MID$(a$, k, 2) = "'$" THEN comment = -1 END SELECT NEXT k FOR m = 1 TO LEN(a2$) 'continue checking, while printing to the screen SELECT CASE MID$(a$, m + idesx - 1, 1) CASE CHR$(34): inquote = NOT inquote - CASE "'": IF inquote = 0 AND metacommand = 0 THEN comment = -1 + CASE "'": IF inquote = 0 THEN comment = -1 END SELECT + IF left$(ltrim$(a$),2) = "'$" THEN metacommand = -1 : comment = 0 COLOR 15 IF comment THEN COLOR 11 diff --git a/source/qb64.bas b/source/qb64.bas index c64a1b7a2..f9c9caf00 100644 --- a/source/qb64.bas +++ b/source/qb64.bas @@ -2488,7 +2488,11 @@ DO IF try = 2 THEN f$ = a$ IF _FILEEXISTS(f$) THEN qberrorhappened = -3 - OPEN f$ FOR INPUT AS #fh + 'EDIT on 07-23-2014 to take advantage of the speed difference between _BLINEINPUT and LINEINPUT + 'This should reduce the lag generated by using INCLUDE files considerably + 'OPEN f$ FOR INPUT AS #fh + OPEN f$ FOR BINARY AS #fh + 'And another line below edited qberrorhappened3: IF qberrorhappened = -3 THEN EXIT FOR END IF @@ -2503,7 +2507,8 @@ DO fh = 99 + inclevel '2. Feed next line IF EOF(fh) = 0 THEN - LINE INPUT #fh, x$ + 'LINE INPUT #fh, x$ + _BLINEINPUT #fh, x$ wholeline$ = x$ inclinenumber(inclevel) = inclinenumber(inclevel) + 1 'create extended error string 'incerror$' diff --git a/source/subs_functions/extensions/Steve Stuff-ID_Includes.bas b/source/subs_functions/extensions/Steve Stuff-ID_Includes.bas index 45dfb7191..11f0197ce 100644 --- a/source/subs_functions/extensions/Steve Stuff-ID_Includes.bas +++ b/source/subs_functions/extensions/Steve Stuff-ID_Includes.bas @@ -175,24 +175,10 @@ id.args = 0 id.ret = LONGTYPE - ISPOINTER regid -'Removed for command redundancy. Galleon has these already as _SCREENSHOW and _SCREENHIDE -'I just forgot about them. :P At least they're easy to remove! ;) -'clearid -'id.n = "_SHOWWINDOW" -'id.subfunc = 2 -'id.callname = "glutShowWindow" -'regid - -'clearid -'id.n = "_HIDEWINDOW" -'id.subfunc = 2 -'id.callname = "glutHideWindow" -'regid - clearid id.n = "_SCREENICON" 'name change to from _ICONIFYWINDOW to _SCREENICON to match the screenshow and screenhide id.subfunc = 2 -id.callname = "glutIconifyWindow" +id.callname = "sub_screenicon" regid clearid diff --git a/source/subs_functions/subs_functions.bas b/source/subs_functions/subs_functions.bas index 2a0714787..0f58a2276 100644 --- a/source/subs_functions/subs_functions.bas +++ b/source/subs_functions/subs_functions.bas @@ -2446,8 +2446,7 @@ id.n = "LINE" id.subfunc = 2 id.callname = "sub_line" id.args = 7 -id.arg = MKL$(FLOATTYPE - ISPOINTER) + MKL$(FLOATTYPE - ISPOINTER) + MKL$(FLOATTYPE - ISPOINTER) + MKL$(FLOATTYPE - ISPOINTER) + MKL$(LONGTYPE - ISPOINTER) + MKL$(LONGTYPE - ISPOINTER) + MKL$ _ -(LONGTYPE - ISPOINTER) +id.arg = MKL$(FLOATTYPE - ISPOINTER) + MKL$(FLOATTYPE - ISPOINTER) + MKL$(FLOATTYPE - ISPOINTER) + MKL$(FLOATTYPE - ISPOINTER) + MKL$(LONGTYPE - ISPOINTER) + MKL$(LONGTYPE - ISPOINTER) + MKL$(LONGTYPE - ISPOINTER) id.specialformat = "[[{STEP}](?,?)]-[{STEP}](?,?)[,[?][,[{B|BF}][,?]]]" regid