ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
exit_loop_if.c
Go to the documentation of this file.
1/*****************************************************************************
2 * ugBASIC - an isomorphic BASIC language compiler for retrocomputers *
3 *****************************************************************************
4 * Copyright 2021-2026 Marco Spedaletti (asimov@mclink.it)
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *----------------------------------------------------------------------------
18 * Concesso in licenza secondo i termini della Licenza Apache, versione 2.0
19 * (la "Licenza"); è proibito usare questo file se non in conformità alla
20 * Licenza. Una copia della Licenza è disponibile all'indirizzo:
21 *
22 * http://www.apache.org/licenses/LICENSE-2.0
23 *
24 * Se non richiesto dalla legislazione vigente o concordato per iscritto,
25 * il software distribuito nei termini della Licenza è distribuito
26 * "COSÌ COM'È", SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, esplicite o
27 * implicite. Consultare la Licenza per il testo specifico che regola le
28 * autorizzazioni e le limitazioni previste dalla medesima.
29 ****************************************************************************/
30
31/****************************************************************************
32 * INCLUDE SECTION
33 ****************************************************************************/
34
35#include "../../ugbc.h"
36
37/****************************************************************************
38 * CODE SECTION
39 ****************************************************************************/
40
51/* <usermanual>
52@keyword EXIT IF
53
54@english
55The instruction forces the program to leave a loop, such as ''FOR...NEXT'',
56''REPEAT...UNTIL'', ''WHILE...WEND'' and ''DO...LOOP'' under a specific
57set of conditions. The ''EXIT'' will only be performed ''IF'' the
58result is found to true.
59
60An optional ''number'' can be given to specify the number of loops
61to be jumped out, otherwise only the current loop will be aborted.
62
63@italian
64Questa istruzione forza il programma ad abbandonare un
65ciclo di tutti i tipi, come
66''FOR...NEXT'', ''REPEAT...UNTIL'', ''WHILE...WEND'' e ''DO...LOOP'',
67in base a delle condizioni: tale istruzione uscirà
68(''EXIT'') solo se (''IF'') il risultato viene valutato come vero.
69
70Può essere fornito un numero opzionale per specificare il numero di loop
71da cui uscire, altrimenti verrà interrotto solo il loop più interno.
72
73@syntax EXIT IF expression[, number]
74@syntax EXIT number IF expression
75
76@example EXIT IF lifes = 0, 2
77@example EXIT 2 IF lifes
78
79@usedInExample control_loops_02.bas
80@usedInExample control_loops_03.bas
81
82@target all
83</usermanual> */
84
85void exit_loop_if( Environment * _environment, char * _expression, int _number ) {
86
87
88
89 Loop * loop = _environment->loops;
90
91 if ( ! loop ) {
93 }
94
95 if ( _number ) {
96 --_number;
97 }
98
99 while( _number-- ) {
100 loop = loop->next;
101
102 if ( ! loop ) {
104 }
105 }
106
107 unsigned char newLabel[MAX_TEMPORARY_STORAGE]; sprintf(newLabel, "%sbis", loop->label );
108
109 Variable * expression = variable_retrieve( _environment, _expression );
110
111 cpu_bvneq( _environment, expression->realName, newLabel );
112
113}
void cpu_bvneq(Environment *_environment, char *_value, char *_label)
Definition 6309.c:345
Variable * variable_retrieve(Environment *_environment, char *_name)
void exit_loop_if(Environment *_environment, char *_expression, int _number)
Emit ASM code for EXIT IF.
Loop * loops
Definition ugbc.h:2669
char * realName
Definition ugbc.h:982
#define MAX_TEMPORARY_STORAGE
Definition ugbc.h:563
void loop(Environment *_environment, char *_label)
struct _Variable Variable
Structure of a single variable.
#define CRITICAL_EXIT_WITHOUT_ENOUGH_LOOP()
Definition ugbc.h:3589
struct _Environment Environment
Structure of compilation environment.
struct _Loop Loop
Structure of a single loop.