diff --git a/sIDE/Makefile b/sIDE/Makefile index a715ab0..a4fcd46 100644 --- a/sIDE/Makefile +++ b/sIDE/Makefile @@ -33,7 +33,7 @@ MOVE = mv -f TAR = tar -cf COMPRESS = gzip -9f DISTNAME = sIDE1.0.0 -DISTDIR = /home/sky/homework/c_asm_ds/sIDE/.tmp/sIDE1.0.0 +DISTDIR = /home/sky/lab/projects/sIDE/sIDE/.tmp/sIDE1.0.0 LINK = g++ LFLAGS = -Wl,-O1 -Wl,-O1,--sort-common,--as-needed,-z,relro LIBS = $(SUBLIBS) -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread @@ -627,17 +627,17 @@ moc_mainwindow.cpp: consoleworker.h \ mainwindow.h \ moc_predefs.h \ /usr/bin/moc - /usr/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I/home/sky/homework/c_asm_ds/sIDE -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I/usr/include/c++/6.3.1 -I/usr/include/c++/6.3.1/x86_64-pc-linux-gnu -I/usr/include/c++/6.3.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include -I/usr/local/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include-fixed -I/usr/include mainwindow.h -o moc_mainwindow.cpp + /usr/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I/home/sky/lab/projects/sIDE/sIDE -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I/usr/include/c++/6.3.1 -I/usr/include/c++/6.3.1/x86_64-pc-linux-gnu -I/usr/include/c++/6.3.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include -I/usr/local/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include-fixed -I/usr/include mainwindow.h -o moc_mainwindow.cpp moc_consoleworker.cpp: consoleworker.h \ moc_predefs.h \ /usr/bin/moc - /usr/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I/home/sky/homework/c_asm_ds/sIDE -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I/usr/include/c++/6.3.1 -I/usr/include/c++/6.3.1/x86_64-pc-linux-gnu -I/usr/include/c++/6.3.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include -I/usr/local/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include-fixed -I/usr/include consoleworker.h -o moc_consoleworker.cpp + /usr/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I/home/sky/lab/projects/sIDE/sIDE -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I/usr/include/c++/6.3.1 -I/usr/include/c++/6.3.1/x86_64-pc-linux-gnu -I/usr/include/c++/6.3.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include -I/usr/local/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include-fixed -I/usr/include consoleworker.h -o moc_consoleworker.cpp moc_asmeditor.cpp: asmeditor.h \ moc_predefs.h \ /usr/bin/moc - /usr/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I/home/sky/homework/c_asm_ds/sIDE -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I/usr/include/c++/6.3.1 -I/usr/include/c++/6.3.1/x86_64-pc-linux-gnu -I/usr/include/c++/6.3.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include -I/usr/local/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include-fixed -I/usr/include asmeditor.h -o moc_asmeditor.cpp + /usr/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I/home/sky/lab/projects/sIDE/sIDE -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I/usr/include/c++/6.3.1 -I/usr/include/c++/6.3.1/x86_64-pc-linux-gnu -I/usr/include/c++/6.3.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include -I/usr/local/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/include-fixed -I/usr/include asmeditor.h -o moc_asmeditor.cpp compiler_moc_source_make_all: compiler_moc_source_clean: diff --git a/sIDE/mainwindow.cpp b/sIDE/mainwindow.cpp index cc799f8..ecd076d 100644 --- a/sIDE/mainwindow.cpp +++ b/sIDE/mainwindow.cpp @@ -270,7 +270,7 @@ void MainWindow::on_assemble_triggered() ui->actionAssemble_Run->setEnabled(false); ui->tabWidget->setCurrentWidget(ui->tabAssembler); - assembleWorker->execute(tr("sas.exe"), args); + assembleWorker->execute(tr("./sas.exe"), args); } void MainWindow::on_runThread_started() @@ -308,7 +308,7 @@ void MainWindow::on_run_triggered() ui->actionRun->setEnabled(false); ui->actionKill->setEnabled(true); - runWorker->execute(tr("ssim.exe"), args); + runWorker->execute(tr("./ssim.exe"), args); } void MainWindow::on_stop_triggered() diff --git a/sas/sas.c b/sas/sas.c index 5579a44..15d86f3 100644 --- a/sas/sas.c +++ b/sas/sas.c @@ -42,17 +42,10 @@ FILE *g_fin, *g_fout; FILE *g_flist; // Translate a string to uppercase. -// But characters surrounded by "" or with proceeding # will be ignored. +// But characters surrounded by "" will be ignored. void str_toupper(char *str) { - bool in_quote = false; - - for (; *str && '#' != *str; ++str) { - if ('\"' == *str) { - in_quote = !in_quote; - } else { - if (!in_quote) - *str = toupper(*str); - } + for (; *str && '\"' != *str; ++str) { + *str = toupper(*str); } } @@ -240,15 +233,30 @@ int process_bracket(char **curr_ptr, size_t elem_size) { // Process string constant initializers. // Returns the string length on sucess, negative number on failure. int process_string_const(char **line) { - char string[LINE_BUF_SIZE], len; - - if (1 != sscanf(*line, "\"%[^\"]\"", string)) return -1; - - len = strlen(string); - fwrite(string, len + 1, 1, g_fout); - *line += len+2; + char str[LINE_BUF_SIZE], *str_ptr, *line_ptr; + int len = 0; + + str_ptr = str; + line_ptr = *line + 1; + for (; *line_ptr && '\"' != *line_ptr; ++line_ptr) { + if ('\\' == *line_ptr) { + if (*++line_ptr) { + *str_ptr++ = *line_ptr; + } else { + return -1; + } + } else { + *str_ptr++ = *line_ptr; + } + } + *str_ptr = 0; + + if ('\"' != *line_ptr) return -1; // Unmatched quotes + len = str_ptr-str+1; + fwrite(str, len, 1, g_fout); + *line = line_ptr + 1; - return len + 1; + return len; } // Process data definitions. @@ -327,11 +335,19 @@ int process_data(char *line, char *keyword, int step) { } else if ('\"' == *curr_ptr && 1 == elem_size) { // String int val_num = process_string_const(&curr_ptr); - if (val_num < 0 || val_num > elem_num) return -1; + if (val_num < 0) { + puts("Illegal string constant"); + return -1; + } + if (val_num > elem_num) { + puts("String constant exceeds the capacity of the array"); + return -1; + } // Fill out the rest with zeros. fwrite(&zero, elem_size, elem_num - val_num, g_fout); } else { // Illegal syntax. + puts("Illegal data syntax"); return -1; } @@ -341,7 +357,10 @@ int process_data(char *line, char *keyword, int step) { // Process ending. while (isspace(*curr_ptr)) curr_ptr++; - if (*curr_ptr != '\0' && *curr_ptr != '#') return -1; + if (*curr_ptr != '\0' && *curr_ptr != '#') { + printf("Trailling garbage: %s\n", curr_ptr); + return -1; + } } curr_ds_addr += elem_num * elem_size; diff --git a/test/puts.txt b/test/puts.txt new file mode 100644 index 0000000..b1e66f5 --- /dev/null +++ b/test/puts.txt @@ -0,0 +1,12 @@ + byte text[16] = "Say: \"Hello!\"" + + loadi G 0 +loop: + loadb A text + equ A Z + cjmp end + out A 15 + addi G 1 + jmp loop +end: + ret