티스토리 뷰

< 분석 내용 > 

( 분석 대상 : jsondump.c, simple.c )


: 이번에 분석할 두개의 c file은, 

'input에서 뽑아진 token들'을 가지고 어떻게 예쁘게 'print'할 것인지에 초점이 맞추어진 것 같다. 

(내부적으로 parser함수들도 당연히 사용한다.)

애초에 두개 다 샘플 실행 파일로 제공할 요량으로 만들어진 듯 하다. 



1. jsondump.c 

 0. 개요 

: jsondump.c는 뒤에 설명할 simple.c와 다르게, 다른 json file을 print해낼 수 있다는 점에서 좀 더 유연하며, 

핵심인 dump()는 각 token마다 부여된, pos, start, end, size등의 정보를 가지고 print해주는 합리적인 방법을 사용한다. 

(뒤에 나올 simple.c는 simple하게 짠만큼 정말.. 비합리적인 방법을 사용한다)

 

 1. 실행 

목적 : stdin으로 받은 input에 대한 output을 보여주기 위함. 

input file : library.json 

: input file은 아래와 같다.



실행 결과아래는 makefile을 이용하여 파일 생성후, jsondump를 실행한 모습. 

 


-> 실행 결과는 거의 유사하지만 몇몇 차이점 들에서 jsondump.c가 그대로 print out한 것은 아니라는 사실을 알 수 있다. 

예를 들면, repository의 sub object의 key들인 type, url들을 구별해냈고, 

 value가 array로 구성된 'example'인 경우에도 array의 value를 잘 걸러냈다.  



 2. 소스 분석 


 main() 에서의 실행은 특별한건 없고, 

 1) jsmn_init()을 통한 초기화하고, 

 2) token count만큼 token을 allocate한 후에, 

 3) jsmn_parse()하고, 

 4) dump()를 call한다. 

-> 1), 2), 3)의 내용은 이전 posting에서 충분히 설명했으므로, 4)의 dump()에 대해 분석해 보려 한다. 


 dump() 

   : dump()은 위에서 언급한 것처럼, user의 command line input이나 file (redirection등)의 형태로 input을 줄 수 있도록 해놨다. 


 1) parameters 

 const char *js

  조사할 대상이 되는 string

 jsmntok_t *t

  token들의 배열을 가리킬 pointer

 size_t count

  현재 token의 print할 남은 갯수를 가리킬 변수.

 int indent

  depth를 시각적으로 표시하기 위해, depth가 깊어질 수록 indentation을 하는듯 하다. 

     -> printf(" "); 사용! 



 2) 소스 분석 

 

: type이 primitive이거나 string인 경우 간단하게 print 해준다. 


: 이 경우 중요한 point는 dump()를 recursive call 하는데 있다. 

pointer, count, indent값을 각각 다르게 하면서, return되는 j를 누적한다. 


이때 count는 출력해야할 남은 char를 가리키고, indent는 depth가 깊어지는 것을 시각적으로 표기하기 위해 공백을 주는 역할을 한다 


 

: Array의 경우도 object인 경우와 마찬가지로 recursive call을 사용하며, 

array의 하위 항목은 ' - '를 이용해서 pirnt한다는 차이점이 있다. 기본적인 동작은 동일하다.









2. simple.c 

 0. 개요 

: simple.c는 간단한 만큼(사실 간단하지도 않다) 많은 정보가 소스에 박혀있다. 

redirection으로 command 상에서 다른 json file을 받아오지도 못하고, input json string이 소스안에 있다..


simple.c가 print하는 방법은) key를 matching시키는 것이다. 


이게 얼마나 융통성이 없는 방법이냐면, 소스에 보면 key값이 그대로 박혀있다. 

기본적으로 하드코딩이 되어있는 만큼, 간단한 흐름을 파악하고 결과값을 보여주는 샘플 코드의 기능까지만 수행한다고 봐야겠다. 


 1. 실행 

: simple.c는 jsondump.c 와 다르게 source안에 있는 JSON_STRING을 사용한다. 

 input : source에 정의된 string


실행 결과)




 2. 소스 분석 

이 역시,  main() 에서의 실행은 특별한건 없고 이전 post에서 진행했던 과정을 그대로 진행한다. 

 1) jsmn_init()으로 parser를 초기화 해주고, 

 2) jsmn_parse()로 parsing을 수행해서, 

 3) return되는 변수 r로 error, object등을 check한다. 


simple.c에서 중요한 기능을 수행하는 함수는,  jsoneq() 다.


 1) parameters 

-> 여기서 중요한 건 *s다. simple.c에서는 jsoneq를 사용할 때, string으로 key값 자체를 넘겨준다. 


 2) 소스 분석 

: jsoneq()의 구조는 매우 간단하다. 원하는 key값과 일치하면 0을, 일치하지 않으면 -1을 return한다. 

이는 아래 main()안에서 jsoneq()를 사용하는 방식을 보면 쉽게 이해할 수 있다. 



< main()에서 jsoneq() 사용 >


-> 여러 case를 나눠서 jsoneq()를 call하고 있는데, 눈여겨 봐야 할 점은, 3번째 parameter로 실제 json file에 들어있는 key name을 그대로 전달한다는 점이다. 그래서 match되면 지정해 놓은 Key name을 대문자로 멋지게 print하며 output을 낸다. 






3. JSON input text를 변경하여 적용해보기! 

: 임의로 만든 json file에 jsondump.c를 적용해서 test 해본 결과는 아래와 같다.






댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함