NOTHING MATTERS ANYMORE WOOOOO
This commit is contained in:
@ -493,7 +493,6 @@ int generateAssign(Instruction *inst) {
|
|||||||
|
|
||||||
CGNode *op1CG = findCG(getTN(op1));
|
CGNode *op1CG = findCG(getTN(op1));
|
||||||
if (op1CG == NULL) {
|
if (op1CG == NULL) {
|
||||||
printf("failed here\n");
|
|
||||||
printdebug("generateAssign failed, op1 is not constant but not in CGlist");
|
printdebug("generateAssign failed, op1 is not constant but not in CGlist");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
100
src/grammar.y
100
src/grammar.y
@ -564,23 +564,36 @@ simple_statement:
|
|||||||
assignable ASSIGN expression
|
assignable ASSIGN expression
|
||||||
{ printdebug("simple statement");
|
{ printdebug("simple statement");
|
||||||
TableNode* node;
|
TableNode* node;
|
||||||
if((getAdInfoType((TableNode*)$1) == TYPE_FUNCTION_DECLARATION)||
|
if((getAdInfoType(getTypeEntry(getTypeEntry((TableNode*)$1))) == TYPE_FUNCTION_DECLARATION)||
|
||||||
(getAdInfoType((TableNode*)$1) == TYPE_ARRAY)||
|
(getAdInfoType(getTypeEntry(getTypeEntry((TableNode*)$1))) == TYPE_ARRAY)||
|
||||||
(getAdInfoType((TableNode*)$1) == TYPE_RECORD)||
|
(getAdInfoType(getTypeEntry(getTypeEntry((TableNode*)$1))) == TYPE_RECORD)||
|
||||||
(getAdInfoType((TableNode*)$1) == TYPE_PRIMITIVE)){
|
(getAdInfoType(getTypeEntry(getTypeEntry((TableNode*)$1))) == TYPE_PRIMITIVE)){
|
||||||
|
|
||||||
node = ((TableNode*)$1);
|
node = ((TableNode*)$1);
|
||||||
} else{
|
} else {
|
||||||
printdebug("Invalid type passed to assignable.");
|
printf("%d\n",getAdInfoType(getTypeEntry(getTypeEntry((TableNode*)$1))));
|
||||||
node = undefined;
|
throw_error(ERROR_TYPE, "Invalid type passed to assignable.");
|
||||||
}
|
printf("%d, %d\n", @1.first_line, @1.first_column);
|
||||||
|
printf("%s\n", getType(getTypeEntry((TableNode*)$1)));
|
||||||
|
printf("%s\n\n", getType(getTypeEntry((TableNode*)$3)));
|
||||||
|
node = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if(getAdInfoType(node) == getAdInfoType((TableNode*)$3)){
|
if(getAdInfoType(node) == getAdInfoType((TableNode*)$3)){
|
||||||
emit_assignment($1, tn_or_const(NODE, $3));
|
emit_assignment($1, tn_or_const(NODE, $3));
|
||||||
printdebug("%s[☺] Passed type check; %s = %s", COLOR_GREEN, getName(node), getName((TableNode*)$3));
|
printdebug("%s[☺] Passed type check; %s = %s", COLOR_GREEN, getType(node), getType((TableNode*)$3));
|
||||||
} else {
|
} else if (getTypeEntry(getTypeEntry(node)) == arrayprim && getTypeEntry((TableNode*)$3) == addr) {
|
||||||
throw_error(ERROR_TYPE, "%s != %s", getName(node), getName((TableNode*)$3));
|
emit_assignment($1, tn_or_const(NODE, $3));
|
||||||
|
printdebug("%s[☺] Passed type check; %s = %s", COLOR_GREEN, getType(node), getType((TableNode*)$3));
|
||||||
|
} else if (getTypeEntry(getTypeEntry(node)) == recprime && getTypeEntry((TableNode*)$3) == addr) {
|
||||||
|
emit_assignment($1, tn_or_const(NODE, $3));
|
||||||
|
printdebug("%s[☺] Passed type check; %s = %s", COLOR_GREEN, getType(node), getType((TableNode*)$3));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
else {
|
||||||
|
throw_error(ERROR_TYPE, "Object %s of type %s != Object %s of type %s", getName(node), getType(node), getName((TableNode*)$3), getType((TableNode*)$3));
|
||||||
}
|
}
|
||||||
|
|
||||||
$$ = undefined;
|
$$ = undefined;
|
||||||
@ -620,14 +633,14 @@ argument_list:
|
|||||||
//NEED TO EMIT PARAMETERS HERE. MAYBE USE STACK STRUCTURE
|
//NEED TO EMIT PARAMETERS HERE. MAYBE USE STACK STRUCTURE
|
||||||
expression COMMA argument_list
|
expression COMMA argument_list
|
||||||
{
|
{
|
||||||
CreateEntry(cur,getAdInfoType((TableNode*)$1), (TableNode*)$1, getName((TableNode*)$1), NULL);
|
CreateEntry(cur, getAdInfoType((TableNode*)$1), getTypeEntry((TableNode*)$1), getName((TableNode*)$1), NULL);
|
||||||
$$ = $3 + 1;
|
$$ = $3 + 1;
|
||||||
printdebug("[ARGUMENT_LIST] argument list is %d", $$);
|
printdebug("[ARGUMENT_LIST] argument list is %d", $$);
|
||||||
}
|
}
|
||||||
|
|
||||||
| expression
|
| expression
|
||||||
{
|
{
|
||||||
CreateEntry(cur,getAdInfoType((TableNode*)$1),(TableNode*)$1, getName((TableNode*)$1), NULL);
|
CreateEntry(cur, getAdInfoType((TableNode*)$1), getTypeEntry((TableNode*)$1), getName((TableNode*)$1), NULL);
|
||||||
$$ = 1; printdebug("[ARGUMENT_LIST] argument list is %d", $$);
|
$$ = 1; printdebug("[ARGUMENT_LIST] argument list is %d", $$);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -656,7 +669,7 @@ expression:
|
|||||||
$$ = node;
|
$$ = node;
|
||||||
} else {
|
} else {
|
||||||
$$=undefined;
|
$$=undefined;
|
||||||
throw_error(ERROR_TYPE, "%s != %s", getName(getTypeEntry((TableNode*)$2)), getName(integ));
|
throw_error(ERROR_TYPE, "Object %s of type %s is not of type integer and can't be negated", getName((TableNode*)$2), getType((TableNode*)$2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -672,7 +685,7 @@ expression:
|
|||||||
$$ = node;
|
$$ = node;
|
||||||
} else {
|
} else {
|
||||||
$$=undefined;
|
$$=undefined;
|
||||||
throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$2), getName(boo));
|
throw_error(ERROR_TYPE, "Object %s of type %s is not of type Boolean and can't be negated", getName((TableNode*)$2), getType((TableNode*)$2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -687,6 +700,7 @@ expression:
|
|||||||
} else {
|
} else {
|
||||||
$$=undefined;
|
$$=undefined;
|
||||||
throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3));
|
throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3));
|
||||||
|
throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be integers", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -701,7 +715,7 @@ expression:
|
|||||||
$$ = node;
|
$$ = node;
|
||||||
} else {
|
} else {
|
||||||
$$=undefined;
|
$$=undefined;
|
||||||
throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3));
|
throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be integers", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -715,7 +729,7 @@ expression:
|
|||||||
$$ = node;
|
$$ = node;
|
||||||
} else {
|
} else {
|
||||||
$$=undefined;
|
$$=undefined;
|
||||||
throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3));
|
throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be integers", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -729,7 +743,7 @@ expression:
|
|||||||
$$ = node;
|
$$ = node;
|
||||||
} else {
|
} else {
|
||||||
$$=undefined;
|
$$=undefined;
|
||||||
throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3));
|
throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be integers", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -743,7 +757,7 @@ expression:
|
|||||||
$$ = node;
|
$$ = node;
|
||||||
} else {
|
} else {
|
||||||
$$=undefined;
|
$$=undefined;
|
||||||
throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3));
|
throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be integers", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -757,7 +771,7 @@ expression:
|
|||||||
$$ = node;
|
$$ = node;
|
||||||
} else {
|
} else {
|
||||||
$$=undefined;
|
$$=undefined;
|
||||||
throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3));
|
throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be Boolean", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -771,7 +785,7 @@ expression:
|
|||||||
$$ = node;
|
$$ = node;
|
||||||
} else {
|
} else {
|
||||||
$$=undefined;
|
$$=undefined;
|
||||||
throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3));
|
throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be Boolean", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -785,7 +799,7 @@ expression:
|
|||||||
$$ = node;
|
$$ = node;
|
||||||
} else {
|
} else {
|
||||||
$$=undefined;
|
$$=undefined;
|
||||||
throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3));
|
throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be integers", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -800,7 +814,7 @@ expression:
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
$$ = undefined;
|
$$ = undefined;
|
||||||
throw_error(ERROR_TYPE, "%s != %s", getName((TableNode*)$1), getName((TableNode*)$3));
|
throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be the same type", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -824,7 +838,7 @@ expression:
|
|||||||
//NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK)
|
//NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK)
|
||||||
$$ = node;
|
$$ = node;
|
||||||
} else {
|
} else {
|
||||||
throw_error(ERROR_TYPE, "Invalid memOp expression (%s).", getName((TableNode*)$2));
|
throw_error(ERROR_TYPE, "Invalid memOp expression with object %s of type %s.", getName((TableNode*)$2), getType((TableNode*)$2));
|
||||||
$$=undefined;
|
$$=undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -884,13 +898,12 @@ assignable:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($3 != getRecLength(param)) {
|
if ($3 != getRecLength(param)) {
|
||||||
printdebug("expected %d arguments but got %d", getRecLength(param), $3);
|
throw_error(ERROR_SYNTAX, "expected %d arguments but got %d", getRecLength(param), $3);
|
||||||
}
|
}
|
||||||
//this isn't very efficient, but will hopefully work
|
//this isn't very efficient, but will hopefully work
|
||||||
while (lastCheckedAct != NULL && lastCheckedRef != NULL) {
|
while (lastCheckedAct != NULL && lastCheckedRef != NULL) {
|
||||||
if (getTypeEntry(lastCheckedRef) != getTypeEntry(lastCheckedAct)) {
|
if (getTypeEntry(lastCheckedRef) != getTypeEntry(lastCheckedAct)) {
|
||||||
printdebug("expected %s. expression in function call got %s. at line %d and column %d",getType(lastCheckedRef), getName(lastCheckedAct), @3.first_line, @3.first_column);
|
throw_error(ERROR_TYPE, "expected %s. expression in function call got %s",getType(lastCheckedRef), getName(lastCheckedAct));
|
||||||
|
|
||||||
}
|
}
|
||||||
lastCheckedAct = getNextEntry(lastCheckedAct);
|
lastCheckedAct = getNextEntry(lastCheckedAct);
|
||||||
TableNode *tn = getFirstEntry(recList);
|
TableNode *tn = getFirstEntry(recList);
|
||||||
@ -904,25 +917,24 @@ assignable:
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (strcmp(getName(param), getName(getFirstEntry(cur))) != 0) {
|
if (strcmp(getName(param), getName(getFirstEntry(cur))) != 0) {
|
||||||
printdebug("expected %s expression in function call but got %s", getName(param), getName(getFirstEntry(cur)));
|
throw_error(ERROR_TYPE, "expected %s expression in function call but got %s", getName(param), getName(getFirstEntry(cur)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getNextEntry(getFirstEntry(cur)) != NULL) {
|
if (getNextEntry(getFirstEntry(cur)) != NULL) {
|
||||||
printdebug("expected 1 parameter, but got multiple in function call");
|
throw_error(ERROR_SYNTAX, "expected 1 parameter, but got multiple in function call");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
char *expected = getName(getParameter(look_up(getParent(cur), getType((TableNode*)$1))));
|
char *expected = getName(getParameter(look_up(getParent(cur), getType((TableNode*)$1))));
|
||||||
char *actual = getType(getFirstEntry(cur));
|
char *actual = getType(getFirstEntry(cur));
|
||||||
if (strcmp(expected, actual) != 0) {
|
if (strcmp(expected, actual) != 0) {
|
||||||
printdebug("expected %s expression in function call but got %s at line %d and column %d",expected, actual, @3.first_line, @3.first_column);
|
throw_error(ERROR_TYPE, "expected %s expression in function call but got %s", expected, actual);
|
||||||
}
|
}
|
||||||
if ($3 != 1) {
|
if ($3 != 1) {
|
||||||
printdebug("expected 1 argument but got %d", $3);
|
throw_error(ERROR_SYNTAX, "expected 1 argument but got %d", $3); }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
printTableNode(getReturn(getTypeEntry((TableNode*)$1)));
|
printTableNode(getReturn(getTypeEntry((TableNode*)$1)));
|
||||||
//
|
|
||||||
char* temp = temp_var_gen();
|
char* temp = temp_var_gen();
|
||||||
TableNode* typeNode2 = getReturn(getTypeEntry($1));
|
TableNode* typeNode2 = getReturn(getTypeEntry($1));
|
||||||
int t = -1;
|
int t = -1;
|
||||||
@ -939,7 +951,7 @@ assignable:
|
|||||||
t = TYPE_FUNCTION_DECLARATION;
|
t = TYPE_FUNCTION_DECLARATION;
|
||||||
}else{
|
}else{
|
||||||
t= TYPE_UNDEFINED;
|
t= TYPE_UNDEFINED;
|
||||||
printdebug("CHANGE ME [TYPE CHECK] Undefined type stored in record. improper.");
|
throw_error(ERROR_TYPE, "Undefined type returned by function.");
|
||||||
}
|
}
|
||||||
TableNode* node = CreateEntry(cur,t, typeNode2, temp, NULL);
|
TableNode* node = CreateEntry(cur,t, typeNode2, temp, NULL);
|
||||||
$$ = node;
|
$$ = node;
|
||||||
@ -949,7 +961,7 @@ assignable:
|
|||||||
} else if (type == TYPE_ARRAY_TYPE) {
|
} else if (type == TYPE_ARRAY_TYPE) {
|
||||||
printdebug("%sEntering array call", COLOR_LIGHTGREEN);
|
printdebug("%sEntering array call", COLOR_LIGHTGREEN);
|
||||||
if (getNumArrDim(look_up(getParent(cur), getType((TableNode*)$1))) != $<integ>2) {
|
if (getNumArrDim(look_up(getParent(cur), getType((TableNode*)$1))) != $<integ>2) {
|
||||||
printdebug("expected %d arguments but had %d at line %d and column %d\n", getNumArrDim(look_up(cur, getName((TableNode*)$1))), $<integ>2, @2.first_line, @2.first_column);
|
throw_error(ERROR_SYNTAX, "expected %d arguments for this array but got %d", getNumArrDim(look_up(cur, getName((TableNode*)$1))), $<integ>2);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* temp = temp_var_gen();
|
char* temp = temp_var_gen();
|
||||||
@ -968,7 +980,7 @@ assignable:
|
|||||||
t = TYPE_FUNCTION_DECLARATION;
|
t = TYPE_FUNCTION_DECLARATION;
|
||||||
}else{
|
}else{
|
||||||
t= TYPE_UNDEFINED;
|
t= TYPE_UNDEFINED;
|
||||||
printdebug("CHANGE ME [TYPE CHECK] Undefined type stored in record. improper.");
|
throw_error(ERROR_TYPE, "Undefined type stored in array.");
|
||||||
}
|
}
|
||||||
TableNode* node = CreateEntry(cur,t, typeNode2, temp, NULL);
|
TableNode* node = CreateEntry(cur,t, typeNode2, temp, NULL);
|
||||||
//emit assign here
|
//emit assign here
|
||||||
@ -981,8 +993,8 @@ assignable:
|
|||||||
|
|
||||||
| assignable rec_op ID
|
| assignable rec_op ID
|
||||||
{
|
{
|
||||||
if(getAdInfoType((TableNode*)$1) != TYPE_RECORD_TYPE){
|
if(getAdInfoType((TableNode*)$1) != TYPE_RECORD){
|
||||||
printdebug("CHANGE ME [TYPE CHECK]Invalid type passed to record access");
|
throw_error(ERROR_TYPE, "Invalid type passed to record access");
|
||||||
}
|
}
|
||||||
else if(undefined != table_lookup(getRecList(table_lookup(getAncestor(cur), getName(getTypeEntry((TableNode*)$1)))), $3)) {
|
else if(undefined != table_lookup(getRecList(table_lookup(getAncestor(cur), getName(getTypeEntry((TableNode*)$1)))), $3)) {
|
||||||
|
|
||||||
@ -1002,7 +1014,7 @@ assignable:
|
|||||||
t = TYPE_FUNCTION_DECLARATION;
|
t = TYPE_FUNCTION_DECLARATION;
|
||||||
}else{
|
}else{
|
||||||
t= TYPE_UNDEFINED;
|
t= TYPE_UNDEFINED;
|
||||||
printdebug("CHANGE ME [TYPE CHECK] Undefined type stored in record. improper.");
|
throw_error(ERROR_TYPE, "Undefined type stored in record.");
|
||||||
}
|
}
|
||||||
|
|
||||||
TableNode* node = CreateEntry(cur,t, type, temp, NULL);
|
TableNode* node = CreateEntry(cur,t, type, temp, NULL);
|
||||||
@ -1010,7 +1022,7 @@ assignable:
|
|||||||
//emit_field_access(char* node, char* record, $3)
|
//emit_field_access(char* node, char* record, $3)
|
||||||
$$=node;
|
$$=node;
|
||||||
}else{
|
}else{
|
||||||
printdebug("CHANGE ME [TYPE CHECK] undefined type (Field Access Lookup failed)");
|
throw_error(ERROR_TYPE, "Invalid field access %s", $3);
|
||||||
$$=undefined;
|
$$=undefined;
|
||||||
}
|
}
|
||||||
printdebug("[ASSIGNABLE - RULE 3] record = name: %s | field = %s", getName((TableNode*)($1)), getName((TableNode*)$3));
|
printdebug("[ASSIGNABLE - RULE 3] record = name: %s | field = %s", getName((TableNode*)($1)), getName((TableNode*)$3));
|
||||||
@ -1186,7 +1198,7 @@ void throw_error(ErrorType error_type, const char *format, ...) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(total_error_message, total_needed, "%s%s\n\n", error_message, error_message2);
|
snprintf(total_error_message, total_needed, "%s%s\n", error_message, error_message2);
|
||||||
if (tc_flag) {
|
if (tc_flag) {
|
||||||
insert_code_line(total_error_message, line);
|
insert_code_line(total_error_message, line);
|
||||||
} else {
|
} else {
|
||||||
@ -1208,9 +1220,9 @@ void yyerror(const char *err) {
|
|||||||
// Grammar Fallback Case
|
// Grammar Fallback Case
|
||||||
if (strcmp(err, "syntax error") == 0) {
|
if (strcmp(err, "syntax error") == 0) {
|
||||||
if (asc_flag != NULL) {
|
if (asc_flag != NULL) {
|
||||||
int needed = snprintf(NULL, 0, " LINE (%d:%d) ** SYNTAX ERROR: Incorrect syntax at token '%s'\n\n", line, column, yytext);
|
int needed = snprintf(NULL, 0, " LINE (%d:%d) ** SYNTAX ERROR: Incorrect syntax at token '%s'\n", line, column, yytext);
|
||||||
char *error_message = malloc(needed + 1);
|
char *error_message = malloc(needed + 1);
|
||||||
snprintf(error_message, needed + 1, " LINE (%d:%d) ** SYNTAX ERROR: Incorrect syntax at token '%s'\n\n", line, column, yytext);
|
snprintf(error_message, needed + 1, " LINE (%d:%d) ** SYNTAX ERROR: Incorrect syntax at token '%s'\n", line, column, yytext);
|
||||||
insert_code_line(error_message, line);
|
insert_code_line(error_message, line);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
11
src/runner.c
11
src/runner.c
@ -247,7 +247,7 @@ int is_alpha_file(char *alpha, int file_len) {
|
|||||||
return 0; // is alpha file
|
return 0; // is alpha file
|
||||||
}
|
}
|
||||||
|
|
||||||
void insert_code_line(char * error_message, int line_number) {
|
void insert_code_line(char *error_message, int line_number) {
|
||||||
CodeLine *error_line = malloc(sizeof(CodeLine));
|
CodeLine *error_line = malloc(sizeof(CodeLine));
|
||||||
error_line->line_number = line_number;
|
error_line->line_number = line_number;
|
||||||
error_line->line = malloc(strlen(error_message) + 1);
|
error_line->line = malloc(strlen(error_message) + 1);
|
||||||
@ -259,11 +259,14 @@ void insert_code_line(char * error_message, int line_number) {
|
|||||||
|
|
||||||
int line = error_line->line_number;
|
int line = error_line->line_number;
|
||||||
CodeLine *current = code_head;
|
CodeLine *current = code_head;
|
||||||
|
|
||||||
while (current != NULL) {
|
while (current != NULL) {
|
||||||
if (current->line_number == line) {
|
if (current->line_number == line) {
|
||||||
CodeLine *next_code_line = current->next;
|
if (current->is_error == false) {
|
||||||
current->next = error_line;
|
CodeLine *next_code_line = current->next;
|
||||||
error_line->next = next_code_line;
|
current->next = error_line;
|
||||||
|
error_line->next = next_code_line;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
current = current->next;
|
current = current->next;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user