September 18, 2021, 11:44:49 PM

News:

Juju thinks he's so clever by putting funny stuff here


+-Discord Shoutbox


Alternatively, join us on Discord directly.
You can help CodeWalrus stay online by donating here.

[ti-83+/84+]Finding missing ends in tibasic [web][ti-basic] [javascript]

Started by c4ooo, October 26, 2015, 02:33:15 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

c4ooo

On par with @123outerme 's request, i wrote a small program in JS to count up the ends in and indent ti-basic source code, and say something if there are too many, or an extra one is needed. You can try/use it at https://jsfiddle.net/th4hnpmh/ (Changed to latest version)
All the code is here:
Spoiler: ShowHide


<!DOCTYPE html>
<head>
    <script>
        function test() {
            var text = document.getElementById('text').value;
            var i = 0;
            var line = 0;
            for (var x = 0; x < text.length; x++) {
   var substring = text.substring(x).toLowerCase();
                if (text.charAt(x) == "\n") {
                    line++;
                    while(text.charAt(x+1) == ' '){
                     text = text.slice(0,x+1) + text.slice(x+2);
                    }
                substring = text.substring(x).toLowerCase();
                    if(substring.substring(1).startsWith("end")) {i--;}
var count=i;
if(substring.substring (1).startsWith("else")) {count--;}
                    for (var insert = 0; insert < count; insert++) {
                      text=text.slice(0,x+1)+" "+text.slice(x+1);
                    }
                   document.getElementById('text').value = text;
                }
                if (substring.startsWith("for")) {
                    i++;
                }
                if (substring.startsWith("then")) {
                    i++;
                }
                if (substring.startsWith("while")) {
                    i++;
                }
                if (substring.startsWith("repeat")) {
                    i++;
                }
                if (i == -1) {
                    alert("To many 'end's!\n" + "Line: " + line);
                    setCaretPosition("text", x);
                    insertAtCaret("text", "REMOVE thiS->")
                    break;
                }
                // alert(i);
            }
            if (i > 0) {
                alert("Missing an End!!!")
            }
        }

        function setCaretPosition(elemId, caretPos) {
            var elem = document.getElementById(elemId);

            if (elem != null) {
                if (elem.createTextRange) {
                    var range = elem.createTextRange();
                        range.move('character', caretPos);
                    range.select();
                } else {
                    if (elem.selectionStart) {
                        elem.focus();
                        elem.setSelectionRange(caretPos, caretPos);
                    } else elem.focus();
                }
            }
        }

        function insertAtCaret(areaId, text) {
            var txtarea = document.getElementById(areaId);
            var scrollPos = txtarea.scrollTop;
            var caretPos = txtarea.selectionStart;

            var front = (txtarea.value).substring(0, caretPos);
            var back = (txtarea.value).substring(txtarea.selectionEnd, txtarea.value.length);
            txtarea.value = front + text + back;
            caretPos = caretPos + text.length;
            txtarea.selectionStart = caretPos;
            txtarea.selectionEnd = caretPos;
            txtarea.focus();
            txtarea.scrollTop = scrollPos;
        }
    </script>
</head>
<body>
    <textarea rows="40" cols="50" id="text">type here</textarea>
   

    <button type="button" onClick="test()">Count!</button>
</body>

</html>


DJ Omnimaga

The best way to count missing ends is to indent your code, but sadly that is not possible when programming on-calc (it would actually make it harder to read the code, because the screen is so small, plus it would take too much RAM space). I think that such tool was suggested long ago, but I don't remember if it was ever implemented. The only closest thing I can remember was a variable usage detection program, which told you if a variable was in use in your BASIC program.


Also, sometimes loops will not stop prematurely due to missing End instructions, but rather due to a conditional error, such as the > and < signs being inverted as a typo, or variable conflicts.
  • Calculators owned: TI-84 Plus, TI-84 Plus C Silver Edition, TI-84 Plus CE, Casio fx-CG10, HP Prime, fx 1.0 Plus, fx-7400G Plus, fx-9750G Plus, fx-9860G, HP 39gII
  • Consoles, mobile devices and vintage computers owned: Huawei P30 Lite, Nintendo 64, Wii U

Ivoah

Quote from: DJ Omnimaga on October 26, 2015, 06:07:06 AM
The best way to count missing ends is to indent your code, but sadly that is not possible when programming on-calc (it would actually make it harder to read the code, because the screen is so small, plus it would take too much RAM space). I think that such tool was suggested long ago, but I don't remember if it was ever implemented. The only closest thing I can remember was a variable usage detection program, which told you if a variable was in use in your BASIC program.


Also, sometimes loops will not stop prematurely due to missing End instructions, but rather due to a conditional error, such as the > and < signs being inverted as a typo, or variable conflicts.
Necro bump  >:D
You can indent you code with ':', but as you mentioned it wastes space and slows it down.
  • Calculators owned: TI-86 (now broken), TI SR-56, TI-Nspire CX CAS, TI-84+ SE, TI-84+ SE, TI-85, TI-73 Explorer VS, ViewScreen, TI-84+ CSE, TI-83+ SE

DJ Omnimaga

Nah using : instead of a linebreak actually takes the same amount of space. I don't know if it slows execution down, but it considerably speeds up the time it takes to scroll through the code on color models.
  • Calculators owned: TI-84 Plus, TI-84 Plus C Silver Edition, TI-84 Plus CE, Casio fx-CG10, HP Prime, fx 1.0 Plus, fx-7400G Plus, fx-9750G Plus, fx-9860G, HP 39gII
  • Consoles, mobile devices and vintage computers owned: Huawei P30 Lite, Nintendo 64, Wii U

c4ooo

Quote from: DJ Omnimaga on February 24, 2016, 02:50:12 AM
Nah using : instead of a linebreak actually takes the same amount of space. I don't know if it slows execution down, but it considerably speeds up the time it takes to scroll through the code on color models.
The ":" does not work with return statement though, ive had this problem in the Lazer I.
Ex:

If A=1
Then
Blah
Blah
Return
End
If A=2
Then
Blah
Blah
Return
End
If A=3
Then
Blah
Blah
Return
End

works fine but

If A=1:Then:Blah:Blah:Return:End:If A=2:Then:Blah:Blah:Return:End:If A=3:Then:Blah:Blah:Return:End

wont work correctly >_>

DJ Omnimaga

Really? I never noticed that before. I thought that : only failed with the Lbl command... ???

Is that a newly introduced OS bug? Can anyone else reproduce? You should make a screenshot
  • Calculators owned: TI-84 Plus, TI-84 Plus C Silver Edition, TI-84 Plus CE, Casio fx-CG10, HP Prime, fx 1.0 Plus, fx-7400G Plus, fx-9750G Plus, fx-9860G, HP 39gII
  • Consoles, mobile devices and vintage computers owned: Huawei P30 Lite, Nintendo 64, Wii U

c4ooo

Quote from: DJ Omnimaga on March 03, 2016, 08:13:15 PM
Really? I never noticed that before. I thought that : only failed with the Lbl command... ???

Is that a newly introduced OS bug? Can anyone else reproduce? You should make a screenshot
I know its present in 2.55MP, dont know about earlier OSs.
Also there was a cemetech post about this exact bug.

DJ Omnimaga

I'll try to remember to try reproducing the bug on various OS'es when I have soms time.

OS 1.12 had that weird glitch where :Then with an extra : caused a syntax error, but it was fixed afterwards.

The Omni topic might mention it. It has plenty of ancient bugs.
  • Calculators owned: TI-84 Plus, TI-84 Plus C Silver Edition, TI-84 Plus CE, Casio fx-CG10, HP Prime, fx 1.0 Plus, fx-7400G Plus, fx-9750G Plus, fx-9860G, HP 39gII
  • Consoles, mobile devices and vintage computers owned: Huawei P30 Lite, Nintendo 64, Wii U

c4ooo

Update time: your code will now be auto indented!
https://jsfiddle.net/L33gnLk9/

Code:
Spoiler: ShowHide

<!DOCTYPE html>
<head>
    <script>
        function test() {
            var text = document.getElementById('text').value;
            var i = 0;
            var line = 0;
            for (var x = 0; x < text.length; x++) {
                if (text.charAt(x) == "\n") {
                    line++;
                    while(text.charAt(x+1) == ' '){
                     text = text.slice(0,x+1) + text.slice(x+2);
                    }
                var substring = text.substring(x).toLowerCase();
                    if(substring.substring(1).startsWith("end")) {i--;}
                    for (var insert = 0; insert < i; insert++) {
                      text=text.slice(0,x+1)+" "+text.slice(x+1);
                    }
                   document.getElementById('text').value = text;
                }
                if (substring.startsWith("for")) {
                    i++;
                }
                if (substring.startsWith("then")) {
                    i++;
                }
                if (substring.startsWith("while")) {
                    i++;
                }
                if (substring.startsWith("repeat")) {
                    i++;
                }
                if (substring.startsWith("end")) {
                   // i--;
                }
                if (i == -1) {
                    alert("To many 'end's!\n" + "Line: " + line);
                    setCaretPosition("text", x);
                    insertAtCaret("text", "REMOVE thiS->")
                    break;
                }
                // alert(i);
            }
            if (i > 0) {
                alert("Missing an End!!!")
            }
        }

        function setCaretPosition(elemId, caretPos) {
            var elem = document.getElementById(elemId);

            if (elem != null) {
                if (elem.createTextRange) {
                    var range = elem.createTextRange();
                        range.move('character', caretPos);
                    range.select();
                } else {
                    if (elem.selectionStart) {
                        elem.focus();
                        elem.setSelectionRange(caretPos, caretPos);
                    } else elem.focus();
                }
            }
        }

        function insertAtCaret(areaId, text) {
            var txtarea = document.getElementById(areaId);
            var scrollPos = txtarea.scrollTop;
            var caretPos = txtarea.selectionStart;

            var front = (txtarea.value).substring(0, caretPos);
            var back = (txtarea.value).substring(txtarea.selectionEnd, txtarea.value.length);
            txtarea.value = front + text + back;
            caretPos = caretPos + text.length;
            txtarea.selectionStart = caretPos;
            txtarea.selectionEnd = caretPos;
            txtarea.focus();
            txtarea.scrollTop = scrollPos;
        }
    </script>
</head>
<body>
    <textarea rows="40" cols="50" id="text">type here</textarea>
   

    <button type="button" onClick="test()">Count!</button>
</body>

</html>

DJ Omnimaga

I typed While 1: Goto 0:End with line breaks and then clicked Count and nothing happened. I am using Opera 42
  • Calculators owned: TI-84 Plus, TI-84 Plus C Silver Edition, TI-84 Plus CE, Casio fx-CG10, HP Prime, fx 1.0 Plus, fx-7400G Plus, fx-9750G Plus, fx-9860G, HP 39gII
  • Consoles, mobile devices and vintage computers owned: Huawei P30 Lite, Nintendo 64, Wii U

c4ooo


DJ Omnimaga

By the way @c4ooo I tried the second link and it still does nothing.
  • Calculators owned: TI-84 Plus, TI-84 Plus C Silver Edition, TI-84 Plus CE, Casio fx-CG10, HP Prime, fx 1.0 Plus, fx-7400G Plus, fx-9750G Plus, fx-9860G, HP 39gII
  • Consoles, mobile devices and vintage computers owned: Huawei P30 Lite, Nintendo 64, Wii U

c4ooo

Quote from: DJ Omnimaga on March 11, 2017, 12:39:30 AM
By the way @c4ooo I tried the second link and it still does nothing.
Are you sure? Its working for me  :(
This is the latest link: https://jsfiddle.net/th4hnpmh/

DJ Omnimaga

Yeah it does nothing for me. I think cross-browser compatibility is the problem. In which browser have you tested this?
  • Calculators owned: TI-84 Plus, TI-84 Plus C Silver Edition, TI-84 Plus CE, Casio fx-CG10, HP Prime, fx 1.0 Plus, fx-7400G Plus, fx-9750G Plus, fx-9860G, HP 39gII
  • Consoles, mobile devices and vintage computers owned: Huawei P30 Lite, Nintendo 64, Wii U

p2

it loads tons of external scripts like from google. some of us might want to recheck the filter settings as well ;)
  • Calculators owned: ti-83+, ti-84+, ti-84+, ti-84+se, ti-84+se(te), ti-nsphire, ti-nsphire CAS, ti-nsphire CX-CAS, ti-voyage, ti-voyage, Who reads this list anyways...?
Anyway war sucks. Just bring us your food instead of missiles  :P ~ DJ Omnimaga (11.10.2016 20:21:48)
if you cant get a jframe set up, draw stuff to it, and receive input, i can only imagine how horrible your game code is _._   ~ c4ooo (14.11.2016 22:44:07)
If they pull a Harambe on me tell my family I love them ~ u/Pwntear37d (AssangeWatch /r/)
make Walrii great again ~ DJ Omnimaga (28.11.2016 23:01:31)
God invented the pc, satan the smartphone I guess ~ p4nix (16.02.2017 22:51:49)

Powered by EzPortal