Skip to content
GitLab
Explore
Sign in
Register
Commits on Source (2)
option -o that writes info file for web-interface
· 4b90cdd6
Masahiko Sakai
authored
Apr 09, 2019
4b90cdd6
Avioding coredump for an empty input
· ce3b044a
Masahiko Sakai
authored
Apr 09, 2019
ce3b044a
Show whitespace changes
Inline
Side-by-side
malbolge20.c
View file @
ce3b044a
...
...
@@ -3,6 +3,7 @@
#include
<ctype.h>
#include
<string.h>
#include
<math.h>
#include
<unistd.h>
#define ALLOCATED 1
#define UNALLOCATED 0
...
...
@@ -26,7 +27,7 @@ const char xlat2[] =
"5z]&gqtyfr$(we4{WP)H-Zn,[%
\\
3dL+Q;>U!pJS72FhOA1C"
"B6v^=I_0/8|jsb9m<.TVac`uY*MK'X~xDl}REokN:#?G
\"
i@"
;
FILE
*
f
;
FILE
*
fperror
;
int
main
(
int
argc
,
char
**
argv
)
{
...
...
@@ -36,18 +37,43 @@ int main( int argc, char **argv )
unsigned
int
i
,
ii
=
0
;
int
x
;
int
opt
,
outf
=
0
;
char
*
usage
=
"Usage: malbolge20 [-oh] prog-file
\n
"
;
while
((
opt
=
getopt
(
argc
,
argv
,
"o"
))
!=
-
1
)
{
switch
(
opt
){
case
'o'
:
outf
=
1
;
break
;
case
'h'
:
default:
fputs
(
usage
,
stderr
);
return
(
1
);
}
}
for
(
i
=
0
;
i
<
59049
;
i
++
){
// フラグ初期化
flag
[
i
]
=
UNALLOCATED
;
}
if
(
argc
!=
2
)
if
(
outf
)
{
FILE
*
tmpf
;
if
(
(
tmpf
=
fopen
(
"info"
,
"w"
)
)
!=
NULL
)
{
fputs
(
"Usage: malbolge20 prog-file
\n
"
,
stderr
);
fperror
=
tmpf
;
}
}
else
fperror
=
stdout
;
if
(
(
argc
-
optind
)
!=
1
)
{
fputs
(
usage
,
stderr
);
return
(
1
);
}
if
(
(
f
=
fopen
(
argv
[
1
],
"r"
)
)
==
NULL
)
if
(
(
f
=
fopen
(
argv
[
optind
],
"r"
)
)
==
NULL
)
{
fputs
(
"can't open file
\n
"
,
stderr
);
fputs
(
"can't open
input
file
\n
"
,
stderr
);
return
(
1
);
}
...
...
@@ -55,7 +81,8 @@ int main( int argc, char **argv )
if
(
mem
==
NULL
)
{
fclose
(
f
);
fputs
(
"can't allocate memory
\n
"
,
stderr
);
fprintf
(
fperror
,
"Error: can't allocate memory
\n
"
);
fclose
(
fperror
);
return
(
1
);
}
...
...
@@ -65,7 +92,8 @@ int main( int argc, char **argv )
if
(
mem
[
id
]
==
NULL
)
{
fclose
(
f
);
fputs
(
"can't allocate memory
\n
"
,
stderr
);
fprintf
(
fperror
,
"Error: can't allocate memory
\n
"
);
fclose
(
fperror
);
return
(
1
);
}
flag
[
id
]
=
ALLOCATED
;
...
...
@@ -79,15 +107,17 @@ int main( int argc, char **argv )
{
if
(
strchr
(
"ji*p</vo"
,
xlat1
[(
x
-
33
+
ii
)
%
94
]
)
==
NULL
)
{
fputs
(
"
invalid character in source file
\n
"
,
stderr
);
fprintf
(
fperror
,
"Error:
invalid character
(ascii=%d)
in source file
\n
"
,
x
);
free
(
mem
);
fclose
(
f
);
fclose
(
fperror
);
return
(
1
);
}
}
else
{
fputs
(
"
invalid character in source file
\n
"
,
stderr
);
fprintf
(
fperror
,
"Error:
invalid character
(ascii=%d)
in source file
\n
"
,
x
);
free
(
mem
);
fclose
(
f
);
fclose
(
fperror
);
return
(
1
);
}
mem
[
id
][
i
++
]
=
x
;
...
...
@@ -99,6 +129,7 @@ int main( int argc, char **argv )
fputs
(
"input file too long
\n
"
,
stderr
);
free
(
mem
);
fclose
(
f
);
fclose
(
fperror
);
return
(
1
);
}
//次ブロックのメモリ領域を確保
...
...
@@ -106,7 +137,8 @@ int main( int argc, char **argv )
if
(
mem
[
id
]
==
NULL
)
{
fclose
(
f
);
fputs
(
"can't allocate memory
\n
"
,
stderr
);
fprintf
(
fperror
,
"Error: can't allocate memory
\n
"
);
fclose
(
fperror
);
return
(
1
);
}
flag
[
id
]
=
ALLOCATED
;
//第idブロックを使用済みに変更
...
...
@@ -115,6 +147,10 @@ int main( int argc, char **argv )
}
fclose
(
f
);
//入力の読み込み終了
//以下は使用中ブロックの余ったメモリの初期化処理
if
(
id
==
0
&&
i
<=
1
)
{
// avoiding errors when null inputs
fprintf
(
fperror
,
"Exited due to an empty input
\n
"
);
return
(
1
);
}
if
(
i
==
0
){
mem
[
id
][
0
]
=
op
(
mem
[
id
-
1
][
59048
],
mem
[
id
-
1
][
59047
]
);
mem
[
id
][
1
]
=
op
(
mem
[
id
][
0
],
mem
[
id
-
1
][
59048
]
);
...
...
@@ -132,6 +168,8 @@ int main( int argc, char **argv )
exec
(
flag
,
mem
,
init
);
//実行
free
(
mem
);
if
(
outf
)
fprintf
(
fperror
,
"Execution completed.
\n
"
);
fclose
(
fperror
);
return
(
0
);
}
...
...
@@ -186,7 +224,8 @@ void mem_manage(unsigned int *reg_addr, unsigned int num, int *id, unsigned int
if
(
mem
[
new_id
]
==
NULL
){
fclose
(
f
);
free
(
mem
);
fputs
(
"can't allocate memory
\n
"
,
stderr
);
fprintf
(
fperror
,
"Error: can't allocate memory
\n
"
);
fclose
(
fperror
);
exit
(
1
);
}
mem
[
new_id
][
0
]
=
init
[
new_id
][
0
];
...
...
@@ -213,7 +252,8 @@ void increment(unsigned int *reg_addr, int *id, int flag[59049], unsigned int **
mem
[
*
id
]
=
(
unsigned
int
*
)
malloc
(
sizeof
(
unsigned
int
)
*
59049
);
if
(
mem
[
*
id
]
==
NULL
){
fclose
(
f
);
fputs
(
"can't allocate memory
\n
"
,
stderr
);
fprintf
(
fperror
,
"Error: can't allocate memory
\n
"
);
fclose
(
fperror
);
exit
(
1
);
}
mem
[
*
id
][
0
]
=
init
[
*
id
][
0
];
...
...
@@ -238,7 +278,8 @@ void exec( int flag[59049], unsigned int **mem, unsigned int init[59049][2] )
for
(;;)
{
if
(
mem
[
c_id
][
c
]
<
33
||
mem
[
c_id
][
c
]
>
126
)
{
printf
(
"Enter into an infinite loop. exit(1). "
);
fprintf
(
fperror
,
"Error: enterring into an infinite loop.
\n
"
);
fclose
(
fperror
);
exit
(
1
);
//continue; // もともとの処理
}
...
...