Parser
ChangHyun Jang edited this page Apr 21, 2022
·
22 revisions
- 인자값 - 확장자명 .rt 체크
./minirt cjang.rt (o)
./minirt test1.rt test2.rt (x)
./minirt (x)
./minirt cjang (x)
- open - fd 체크
./minirt cjang.rt (o)
./minirt cjam.rt (x)
- gnl - open한 결과값인 fd값을 이용하여 get_next_line으로 read를 이용하여 한 줄씩 읽음
- split - 개행문자를 제외한 white space를 기준으로 split한다.
- 도형 타입 - split한 문자열의 맨 앞의 값이 해당하는 도형의 문자열인지 아닌지 체크
- 정보 개수 - 도형 타입과 들어와야 할 정보 개수가 유효한지 체크
A 0.2 255,255,255 (o)
C -2,2,1 -1,1,1 90 (o)
L 0,20,0 0.6 255,255,255 (o)
sp 0,-100.5,-1 200 204,204,0 (o)
cy 1,-0.5,-1 0,1,0 1 1 204,153,51 (o)
pl 0,0,-5 0,0,1 30,127,30 (o)
# 도형 타입
0.2 255,255,255 (x)
PL 0,0,-5 0,0,1 30,127,30 (x)
B -2,2,1 -1,1,1 90 (x)
# 정보 개수
pl 0,0,-5 0,0,1 1 1 30,127,30 (x)
pl 1,2,3 (x)
pl 1, 2, 3 0, 0, 1 30,127,30 (x)
pl 1 , 2 , 3 0,0,1 30,127,30 (x)
- vector(x,y,z)값 - 쉼표를 기준으로 파싱. 이 때, split이 아니라 strsep을 이용하여 쉼표를 구분한다.
pl 0,0,-5 0,0,1 30,127,30 (o)
pl 0a,0,-5 0,0,1 30,127,30 (x)
pl 0a,0,-5 0,0,1 30,,127,30 (x)
pl 0a,0,-5 0,0,1 30,127,30, (x)
pl 0,0,-5 0,0 bb,127,30 (x)
sp 0,-100.5,-1 2. 204,204,0 (o)
sp 0,-100.5,-1 2.. 204,204,0 (x)
- 값 범위 - 과제에 나와있는 기준값 이내인지 체크
다만, FOV에서는 180 미만으로 처리하였다. 180도가 될 경우 화면의 영역과 화각이 서로 평행하기 때문에 이론상 화면이 그려지지 않기 때문이다.
# [x,y,z point] [normalized vector] [ratio] [diameter] [height] [FOV] [RGB]
A [0-1] [0-255],[0-255],[0-255] (o)
C [none],[none],[none] [-1~1],[-1~1],[-1~1] [0-180) (o)
L [none],[none],[none] [0-1] [0-255],[0-255],[0-255] (o)
sp [none],[none],[none] [0-] [0-255],[0-255],[0-255] (o)
cy [none],[none],[none] [-1~1],[-1~1],[-1~1] [0-] [0-] [0-255],[0-255],[0-255] (o)
pl [none],[none],[none] [-1~1],[-1~1],[-1~1] [0-255],[0-255],[0-255] (o)
# 이외는 x
- 값 - 필요한 값에 맞게 정의
[normalized vector] 벡터의 길이를 1로 재설정.
[diameter] diameter / 2
[RGB] [0-255],[0-255],[0-255] -> [0-1],[0-1],[0-1]
open에선 실행이 되지만, get_next_line 내부의 read함수에서 읽지 못한다. 이 부분에서 예외처리를 하여 잘못 읽었음을 에러로 출력한다.
@hyojekim @cjang