
//[2011.10.18.화][생성!!!]{------------------------------------
//<*.avrspec> 와 <*.avrspecbin> 두 종류의 [명세문서] 를 처리한다.
//
//<*.avrspec>    : TC2006 으로 만든 AVR-ISP 용 문자형 [명세문서].
//<*.avrspecbin> : 맷돌C 로 만든 AVR-ISP 용 2진형 [명세문서].
//
//명세내용은 동일하나 형식이 다르며, 서로 변환함수로 양방향으로 변환 가능하다.
//}-----------------------------------------------------------

#include "함수묶음.h"

#include "명세문서.h"

void 명세문서_AvrSpec_읽기(struct AVR설정정보  *rAVR설정정보,
                        char              *p경로이름확장자)
{
  //[2011.10.19.수][생성!!!]{-------------------------------
  //<*.avrspec> 문서를 열어 <AVR설정정보> 구조체에 정리해준다.
  //
  //<*.avrspec> 문서는 문자형문서로 정보를 직접 찾아서 처리해야 한다.
  //}------------------------------------------------------

  //[VAR]
  //{
      //[명세문서] 크기는 1K 이하다.
      char  문서[1024];

      int   문서크기;

      int   i;

      int   총행수, 행번호;

      int   행시작위치;

      int   단어위치;
      char  단어[256];
      char  문자열[512];

  //}

  //[<*.avrspec> 문서 열기]
  //{
      //문서열기 오류 시에는 더이상 처리하지 않는다.
      if(_File_열기_(p경로이름확장자, (unsigned char *)문서, (unsigned int *)(&문서크기)) != true) return;

      //[주의!!!]{--------------------------------------------------------
      //[문자형 문서] 인 경우는 맨 뒤에 '\0' 을 붙여서 [문자열] 로 만들어 주어야 한다.
      문서[문서크기] = '\0';
      //}----------------------------------------------------------------

  //}

  //[분석/처리]
  //{
      //[총 행수]
      //{
          //반복적으로 사용되는 [총행수] 를 구한다.
          총행수 = _Str_행수얻기_(문서);

      //}

      //[<Flash페이지크기>]
      //{
          행번호 = _Str_단어일치_행번호얻기_(문서, 총행수, 0, (0), false, "<Flash페이지크기>");

          //해당 내용은 다음행에 존재.
          _Str_행번호로_시작위치얻기_(문서, ++행번호, &행시작위치);
          _Str_행단어추출_(문서, 행시작위치, (0), &단어위치, 단어);

          //[10진수표기=>값] 변환.
          rAVR설정정보->flash페이지크기 = _Conv_10진수표기_Int값_(단어);

      //}

      //[<Flash크기>]
      //{
          행번호 = _Str_단어일치_행번호얻기_(문서, 총행수, 0, (0), false, "<Flash크기>");

          //해당 내용은 다음행에 존재.
          _Str_행번호로_시작위치얻기_(문서, ++행번호, &행시작위치);
          _Str_행단어추출_(문서, 행시작위치, (0), &단어위치, 단어);

          //[10진수표기=>값] 변환.
          rAVR설정정보->flash크기 = _Conv_10진수표기_Int값_(단어);

      //}

      //[<Flash기록시간>]
      //{
          행번호 = _Str_단어일치_행번호얻기_(문서, 총행수, 0, (0), false, "<Flash기록시간>");

          //해당 내용은 다음행에 존재.
          _Str_행번호로_시작위치얻기_(문서, ++행번호, &행시작위치);
          _Str_행단어추출_(문서, 행시작위치, (0), &단어위치, 단어);

          //[10진수표기=>값] 변환.
          rAVR설정정보->flash페이지기록시간 = _Conv_10진수표기_Int값_(단어);

      //}

      //[<EEprom크기>]
      //{
          행번호 = _Str_단어일치_행번호얻기_(문서, 총행수, 0, (0), false, "<EEprom크기>");

          //해당 내용은 다음행에 존재.
          _Str_행번호로_시작위치얻기_(문서, ++행번호, &행시작위치);
          _Str_행단어추출_(문서, 행시작위치, (0), &단어위치, 단어);

          //[10진수표기=>값] 변환.
          rAVR설정정보->eep크기 = _Conv_10진수표기_Int값_(단어);

      //}

      //[<EEprom기록시간>]
      //{
          행번호 = _Str_단어일치_행번호얻기_(문서, 총행수, 0, (0), false, "<EEprom기록시간>");

          //해당 내용은 다음행에 존재.
          _Str_행번호로_시작위치얻기_(문서, ++행번호, &행시작위치);
          _Str_행단어추출_(문서, 행시작위치, (0), &단어위치, 단어);

          //[10진수표기=>값] 변환.
          rAVR설정정보->eep기록시간 = _Conv_10진수표기_Int값_(단어);

      //}

      //[<고유번호>]
      //{
          행번호 = _Str_단어일치_행번호얻기_(문서, 총행수, 0, (0), false, "<고유번호>");

          //해당 내용은 다음행에 존재.
          행번호++;

          //한행에 3개의 정보가 존재한다.
          for(i = 0; i < 3; i++)
          {
            _Str_행번호로_시작위치얻기_(문서, 행번호, &행시작위치);
            _Str_행단어추출_(문서, 행시작위치, (i), &단어위치, 단어);

            //16진수표기로 완성.
            _Str_합치기_(문자열, "0x", 단어);

            //[16진수표기=>값] 변환.
            rAVR설정정보->고유번호[i] = _Conv_16진수표기_Int값_(문자열);

          }

      //}

      //[<보안설정>]
      //{
          행번호 = _Str_단어일치_행번호얻기_(문서, 총행수, 0, (0), false, "<보안설정>");

          //해당 내용은 다음행부터 시작.
          행번호++;

          //총 8개의 행(각 행은 1비트 설정)을 처리.
          //[주의!!!]
          //7->0 번 비트로 정리돼 있다.
          for(i = 7; i >= 0; i--, 행번호++)
          {
            _Str_행번호로_시작위치얻기_(문서, 행번호, &행시작위치);

            //이름.
            _Str_행단어추출_(문서, 행시작위치, (1), &단어위치, rAVR설정정보->보안설정[i].이름);

            //사용유무.
            _Str_행단어추출_(문서, 행시작위치, (2), &단어위치, 단어);
            if(_Str_일치확인_(단어, "*", false) == true) { rAVR설정정보->보안설정[i].사용유무 = true;  }
            else                                      { rAVR설정정보->보안설정[i].사용유무 = false; }

            //고정유무.
            _Str_행단어추출_(문서, 행시작위치, (3), &단어위치, 단어);
            if(_Str_일치확인_(단어, "고정", false) == true) { rAVR설정정보->보안설정[i].고정유무 = true;  }
            else                                        { rAVR설정정보->보안설정[i].고정유무 = false; }

          }

      //}

      //[<확장설정>]
      //{
          행번호 = _Str_단어일치_행번호얻기_(문서, 총행수, 0, (0), false, "<확장설정>");

          //해당 내용은 다음행부터 시작.
          행번호++;

          //총 8개의 행(각 행은 1비트 설정)을 처리.
          //[주의!!!]
          //7->0 번 비트로 정리돼 있다.
          for(i = 7; i >= 0; i--, 행번호++)
          {
            _Str_행번호로_시작위치얻기_(문서, 행번호, &행시작위치);

            //이름.
            _Str_행단어추출_(문서, 행시작위치, (1), &단어위치, rAVR설정정보->확장설정[i].이름);

            //사용유무.
            _Str_행단어추출_(문서, 행시작위치, (2), &단어위치, 단어);
            if(_Str_일치확인_(단어, "*", false) == true) { rAVR설정정보->확장설정[i].사용유무 = true;  }
            else                                      { rAVR설정정보->확장설정[i].사용유무 = false; }

            //고정유무.
            _Str_행단어추출_(문서, 행시작위치, (3), &단어위치, 단어);
            if(_Str_일치확인_(단어, "고정", false) == true) { rAVR설정정보->확장설정[i].고정유무 = true;  }
            else                                        { rAVR설정정보->확장설정[i].고정유무 = false; }

          }

      //}

      //[<상위설정>]
      //{
          행번호 = _Str_단어일치_행번호얻기_(문서, 총행수, 0, (0), false, "<상위설정>");

          //해당 내용은 다음행부터 시작.
          행번호++;

          //총 8개의 행(각 행은 1비트 설정)을 처리.
          //[주의!!!]
          //7->0 번 비트로 정리돼 있다.
          for(i = 7; i >= 0; i--, 행번호++)
          {
            _Str_행번호로_시작위치얻기_(문서, 행번호, &행시작위치);

            //이름.
            _Str_행단어추출_(문서, 행시작위치, (1), &단어위치, rAVR설정정보->상위설정[i].이름);

            //사용유무.
            _Str_행단어추출_(문서, 행시작위치, (2), &단어위치, 단어);
            if(_Str_일치확인_(단어, "*", false) == true) { rAVR설정정보->상위설정[i].사용유무 = true;  }
            else                                      { rAVR설정정보->상위설정[i].사용유무 = false; }

            //고정유무.
            _Str_행단어추출_(문서, 행시작위치, (3), &단어위치, 단어);
            if(_Str_일치확인_(단어, "고정", false) == true) { rAVR설정정보->상위설정[i].고정유무 = true;  }
            else                                        { rAVR설정정보->상위설정[i].고정유무 = false; }

          }

      //}

      //[<하위설정>]
      //{
          행번호 = _Str_단어일치_행번호얻기_(문서, 총행수, 0, (0), false, "<하위설정>");

          //해당 내용은 다음행부터 시작.
          행번호++;

          //총 8개의 행(각 행은 1비트 설정)을 처리.
          //[주의!!!]
          //7->0 번 비트로 정리돼 있다.
          for(i = 7; i >= 0; i--, 행번호++)
          {
            _Str_행번호로_시작위치얻기_(문서, 행번호, &행시작위치);

            //이름.
            _Str_행단어추출_(문서, 행시작위치, (1), &단어위치, rAVR설정정보->하위설정[i].이름);

            //사용유무.
            _Str_행단어추출_(문서, 행시작위치, (2), &단어위치, 단어);
            if(_Str_일치확인_(단어, "*", false) == true) { rAVR설정정보->하위설정[i].사용유무 = true;  }
            else                                      { rAVR설정정보->하위설정[i].사용유무 = false; }

            //고정유무.
            _Str_행단어추출_(문서, 행시작위치, (3), &단어위치, 단어);
            if(_Str_일치확인_(단어, "고정", false) == true) { rAVR설정정보->하위설정[i].고정유무 = true;  }
            else                                        { rAVR설정정보->하위설정[i].고정유무 = false; }

          }

      //}

  //}

}

void 명세문서_AvrSpec_쓰기(struct AVR설정정보  *pAVR설정정보,
                        char              *p경로이름확장자)
{
  //[2011.10.19.수][생성!!!]{-------------------------------
  //<AVR설정정보> 구조체의 내용을 <*.avrspec> 문서로 저장한다.
  //
  //<*.avrspec> 문서는 문자형문서로 정보를 직접 찾아서 처리해야 한다.
  //}------------------------------------------------------

  //[VAR]
  //{
      //[명세문서] 크기는 1K 이하다.
      char  문서[1024];

      char  단어[256];

      int   저장크기;

      int   i;

  //}

  //[초기화]
  //{
      문서[0] = '\0';
      저장크기 = 0;

  //}

  //[분석/처리]
  //{
      //[<Flash페이지크기>]
      //{
          저장크기 += _Str_더하기_(&(문서[저장크기]), "<Flash페이지크기>\r\n");

          _Conv_Long값_문자열_(pAVR설정정보->flash페이지크기,
                             0, false, false,
                             단어);
          저장크기 += _Str_더하기_(&(문서[저장크기]), 단어);
          저장크기 += _Str_더하기_(&(문서[저장크기]), "\r\n");

      //}

      //[<Flash크기>]
      //{
          저장크기 += _Str_더하기_(&(문서[저장크기]), "<Flash크기>\r\n");

          _Conv_Long값_문자열_(pAVR설정정보->flash크기,
                             0, false, false,
                             단어);
          저장크기 += _Str_더하기_(&(문서[저장크기]), 단어);
          저장크기 += _Str_더하기_(&(문서[저장크기]), "\r\n");

      //}

      //[<Flash기록시간>]
      //{
          저장크기 += _Str_더하기_(&(문서[저장크기]), "<Flash기록시간>\r\n");

          _Conv_Long값_문자열_(pAVR설정정보->flash페이지기록시간,
                             0, false, false,
                             단어);
          저장크기 += _Str_더하기_(&(문서[저장크기]), 단어);
          저장크기 += _Str_더하기_(&(문서[저장크기]), "\r\n");

      //}

      //[<EEprom크기>]
      //{
          저장크기 += _Str_더하기_(&(문서[저장크기]), "<EEprom크기>\r\n");

          _Conv_Long값_문자열_(pAVR설정정보->eep크기,
                             0, false, false,
                             단어);
          저장크기 += _Str_더하기_(&(문서[저장크기]), 단어);
          저장크기 += _Str_더하기_(&(문서[저장크기]), "\r\n");

      //}

      //[<EEprom기록시간>]
      //{
          저장크기 += _Str_더하기_(&(문서[저장크기]), "<EEprom기록시간>\r\n");

          _Conv_Long값_문자열_(pAVR설정정보->eep기록시간,
                             0, false, false,
                             단어);
          저장크기 += _Str_더하기_(&(문서[저장크기]), 단어);
          저장크기 += _Str_더하기_(&(문서[저장크기]), "\r\n");

      //}

      //[<고유번호>]
      //{
          저장크기 += _Str_더하기_(&(문서[저장크기]), "<고유번호>\r\n");

          for(i = 0; i < 3; i++)
          {
            //2자리수로 표기--------------------------------v
            _Conv_Long값_16진수표기_(pAVR설정정보->고유번호[i], 2, 단어);
            저장크기 += _Str_더하기_(&(문서[저장크기]), 단어);
            저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

          }

          저장크기 += _Str_더하기_(&(문서[저장크기]), "\r\n");

      //}

      //[<보안설정>]
      //{
          저장크기 += _Str_더하기_(&(문서[저장크기]), "<보안설정>\r\n");

          for(i = 7; i >= 0; i--)
          {
            //비트번호.
            _Conv_Long값_문자열_((i), 0, false, false, 단어);
            저장크기 += _Str_더하기_(&(문서[저장크기]), 단어);
            저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            //이름.
            저장크기 += _Str_더하기_(&(문서[저장크기]), pAVR설정정보->보안설정[i].이름);
            저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            //사용유무.
            if(pAVR설정정보->보안설정[i].사용유무 == true) { 저장크기 += _Str_더하기_(&(문서[저장크기]), "*"); }
            else                                     { 저장크기 += _Str_더하기_(&(문서[저장크기]), "-"); }
            저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            //고정유무.
            if(pAVR설정정보->보안설정[i].고정유무 == true)
            {
              저장크기 += _Str_더하기_(&(문서[저장크기]), "고정");
              저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            }
            //[고정] 이 아닌 경우는 추가하지 않는다.

            //행 추가.
            저장크기 += _Str_더하기_(&(문서[저장크기]), "\r\n");

          }

      //}

      //[<확장설정>]
      //{
          저장크기 += _Str_더하기_(&(문서[저장크기]), "<확장설정>\r\n");

          for(i = 7; i >= 0; i--)
          {
            //비트번호.
            _Conv_Long값_문자열_((i), 0, false, false, 단어);
            저장크기 += _Str_더하기_(&(문서[저장크기]), 단어);
            저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            //이름.
            저장크기 += _Str_더하기_(&(문서[저장크기]), pAVR설정정보->확장설정[i].이름);
            저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            //사용유무.
            if(pAVR설정정보->확장설정[i].사용유무 == true) { 저장크기 += _Str_더하기_(&(문서[저장크기]), "*"); }
            else                                     { 저장크기 += _Str_더하기_(&(문서[저장크기]), "-"); }
            저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            //고정유무.
            if(pAVR설정정보->확장설정[i].고정유무 == true)
            {
              저장크기 += _Str_더하기_(&(문서[저장크기]), "고정");
              저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            }
            //[고정] 이 아닌 경우는 추가하지 않는다.

            //행 추가.
            저장크기 += _Str_더하기_(&(문서[저장크기]), "\r\n");

          }

      //}

      //[<상위설정>]
      //{
          저장크기 += _Str_더하기_(&(문서[저장크기]), "<상위설정>\r\n");

          for(i = 7; i >= 0; i--)
          {
            //비트번호.
            _Conv_Long값_문자열_((i), 0, false, false, 단어);
            저장크기 += _Str_더하기_(&(문서[저장크기]), 단어);
            저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            //이름.
            저장크기 += _Str_더하기_(&(문서[저장크기]), pAVR설정정보->상위설정[i].이름);
            저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            //사용유무.
            if(pAVR설정정보->상위설정[i].사용유무 == true) { 저장크기 += _Str_더하기_(&(문서[저장크기]), "*"); }
            else                                     { 저장크기 += _Str_더하기_(&(문서[저장크기]), "-"); }
            저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            //고정유무.
            if(pAVR설정정보->상위설정[i].고정유무 == true)
            {
              저장크기 += _Str_더하기_(&(문서[저장크기]), "고정");
              저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            }
            //[고정] 이 아닌 경우는 추가하지 않는다.

            //행 추가.
            저장크기 += _Str_더하기_(&(문서[저장크기]), "\r\n");

          }

      //}

      //[<하위설정>]
      //{
          저장크기 += _Str_더하기_(&(문서[저장크기]), "<하위설정>\r\n");

          for(i = 7; i >= 0; i--)
          {
            //비트번호.
            _Conv_Long값_문자열_((i), 0, false, false, 단어);
            저장크기 += _Str_더하기_(&(문서[저장크기]), 단어);
            저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            //이름.
            저장크기 += _Str_더하기_(&(문서[저장크기]), pAVR설정정보->하위설정[i].이름);
            저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            //사용유무.
            if(pAVR설정정보->하위설정[i].사용유무 == true) { 저장크기 += _Str_더하기_(&(문서[저장크기]), "*"); }
            else                                     { 저장크기 += _Str_더하기_(&(문서[저장크기]), "-"); }
            저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            //고정유무.
            if(pAVR설정정보->하위설정[i].고정유무 == true)
            {
              저장크기 += _Str_더하기_(&(문서[저장크기]), "고정");
              저장크기 += _Str_더하기_(&(문서[저장크기]), " ");

            }
            //[고정] 이 아닌 경우는 추가하지 않는다.

            //행 추가.
            저장크기 += _Str_더하기_(&(문서[저장크기]), "\r\n");

          }

      //}

      저장크기 += _Str_더하기_(&(문서[저장크기]), "<끝>\r\n");

  //}

  //[<*.avrspec> 문서 저장]
  //{
      _File_저장_(p경로이름확장자, (unsigned char *)문서, 저장크기);

  //}

}

void 명세문서_AvrSpecBin_읽기(struct AVR설정정보  *rAVR설정정보,
                           char              *p경로이름확장자)
{
  //[2011.10.19.수][생성!!!]{------------------------------
  //<*.avrspecbin> 문서를 열어 <AVR설정정보> 구조체에 정리해준다.
  //
  //<*.avrspecbin> 문서는 2진문서로 바로 읽어들여 구조체에 저장한다.
  //}-----------------------------------------------------

  //[VAR]
  //{
      int  문서크기;

  //}

  //[<*.avrspecbin> 문서 열기]
  //{
      //덩어리를 통째로 구조체에 저장한다.
      if(_File_열기_(p경로이름확장자, (unsigned char *)rAVR설정정보, (unsigned int *)(&문서크기)) != true) return;

  //}

}

void 명세문서_AvrSpecBin_쓰기(struct AVR설정정보  *pAVR설정정보,
                           char              *p경로이름확장자)
{
  //[2011.10.19.수][생성!!!]{-----------------------------
  //<AVR설정정보> 구조체의 내용을 <*.avrspecbin> 문서로 저장한다.
  //
  //<*.avrspecbin> 문서는 2진문서로 구조체 자체를 바로 저장한다.
  //}----------------------------------------------------

  //[<*.avrspecbin> 문서 저장]
  //{
      //구조체 통째로 2진문서로 저장.
      _File_저장_(p경로이름확장자, (unsigned char *)(pAVR설정정보), d_AVR설정정보_크기);

  //}

}

void 명세문서_AvrSpecToAvrSpecBin(char  *pAvrSpec_경로이름확장자)
{
  //[2011.10.18.화][생성!!!]{----------------------------
  //<*.avrspec> 문서를 <*.avrspecbin> 으로 변환하여 저장한다.
  //<*.avrspec> 와 같은 위치에 <*.avrspecbin> 문서로.
  //}---------------------------------------------------

  //[VAR]
  //{
      struct AVR설정정보  avr설정정보;

      char   문자열[512];

  //}

  //<*.avrspec> 문서를 읽어 구조체에 저장.
  명세문서_AvrSpec_읽기(&avr설정정보, pAvrSpec_경로이름확장자);

  //[<*.avrspecbin> 문서 경로이름확장자 만들기]
  //{
      _FileStr_확장자교체_(pAvrSpec_경로이름확장자, "avrspecbin", 문자열);

  //}

  //구조체를 <*.avrspecbin> 문서로 저장.
  명세문서_AvrSpecBin_쓰기(&avr설정정보, 문자열);

}

void 명세문서_AvrSpecBinToAvrSpec(char  *pAvrSpecBin_경로이름확장자)
{
  //[2011.10.18.화][생성!!!]{----------------------------
  //<*.avrspecbin> 문서를 <*.avrspec> 으로 변환하여 저장한다.
  //<*.avrspecbin> 와 같은 위치에 <*.avrspec> 문서로.
  //}---------------------------------------------------

  //[VAR]
  //{
      struct AVR설정정보  avr설정정보;

      char   문자열[512];

  //}

  //<*.avrspecbin> 문서를 읽어 구조체에 저장.
  명세문서_AvrSpecBin_읽기(&avr설정정보, pAvrSpecBin_경로이름확장자);

  //[<*.avrspecbin> 문서 경로이름확장자 만들기]
  //{
      _FileStr_확장자교체_(pAvrSpecBin_경로이름확장자, "avrspec", 문자열);

  //}

  //구조체를 <*.avrspec> 문서로 저장.
  명세문서_AvrSpec_쓰기(&avr설정정보, 문자열);

}

int 명세문서_AvrSpecToAvrSpecBin_전체(char  *p경로)
{
  //[2011.10.19.수][생성!!!]{----------------------------
  //<*.avrspec> 문서를 <*.avrspecbin> 으로 변환하여 저장한다.
  //<*.avrspec> 와 같은 위치에 <*.avrspecbin> 문서로.
  //
  //단, <p경로> 안의 모든 <*.avrspec> 문서를 대상으로 처리.
  //
  //[반환값]---------------------------------------------
  //처리한 문서수.
  //}---------------------------------------------------

  //[VAR]
  //{
      struct AVR설정정보  avr설정정보;

      char   문자열[512];

      //여러개의 문서를 행단위로 가지므로 넉넉하게 설정.
      char   목록[1024*4];

      int    행시작위치;

      int    처리한문서수;

  //}

  //[목록얻기]
  //{
      //[!]{-----------------------------------------------
      //<p경로> 가 존재하는 폴더안의 모든 <*.avrspec> 문서 목록얻기.
      //}--------------------------------------------------

      _Dir_폴더안의_문서전체이름목록_얻기_(p경로,
                                    "avrspec",
                                    //하위폴더는 대상으로 하지 않는다.
                                    false,
                                    //[경로이름확장자] 모두필요.
                                    d_문서,
                                    목록);

  //}

  //[변환]
  //{
      for(행시작위치 = 0, 처리한문서수 = 0; ; 처리한문서수++)
      {
        //문서 [경로이름확장자] 한개 얻기.
        _Str_행문자열추출_(목록, 행시작위치, 문자열);

        //목록의 끝인 경우는 여기서 종료.
        if(문자열[0] == '\0') break;

        //변환.
        명세문서_AvrSpecToAvrSpecBin(문자열);

        //다음행 시작위치 얻기.
        _Str_다음행_시작위치얻기_(목록, 행시작위치, &행시작위치);

      }

  //}

  return(처리한문서수);

}

int 명세문서_AvrSpecBinToAvrSpec_전체(char  *p경로)
{
  //[2011.10.19.수][생성!!!]{----------------------------
  //<*.avrspecbin> 문서를 <*.avrspec> 으로 변환하여 저장한다.
  //<*.avrspecbin> 와 같은 위치에 <*.avrspec> 문서로.
  //
  //단, <p경로> 안의 모든 <*.avrspecbin> 문서를 대상으로 처리.
  //
  //[반환값]---------------------------------------------
  //처리한 문서수.
  //}---------------------------------------------------

  //[VAR]
  //{
      struct AVR설정정보  avr설정정보;

      char   문자열[512];

      //여러개의 문서를 행단위로 가지므로 넉넉하게 설정.
      char   목록[1024*4];

      int    행시작위치;

      int    처리한문서수;

  //}

  //[목록얻기]
  //{
      //[!]{--------------------------------------------------
      //<p경로> 가 존재하는 폴더안의 모든 <*.avrspecbin> 문서 목록얻기.
      //}-----------------------------------------------------

      _Dir_폴더안의_문서전체이름목록_얻기_(p경로,
                                    "avrspecbin",
                                    //하위폴더는 대상으로 하지 않는다.
                                    false,
                                    //[경로이름확장자] 모두필요.
                                    d_문서,
                                    목록);

  //}

  //[변환]
  //{
      for(행시작위치 = 0, 처리한문서수 = 0; ; 처리한문서수++)
      {
        //문서 [경로이름확장자] 한개 얻기.
        _Str_행문자열추출_(목록, 행시작위치, 문자열);

        //목록의 끝인 경우는 여기서 종료.
        if(문자열[0] == '\0') break;

        //변환.
        명세문서_AvrSpecBinToAvrSpec(문자열);

        //다음행 시작위치 얻기.
        _Str_다음행_시작위치얻기_(목록, 행시작위치, &행시작위치);

      }

  //}

  return(처리한문서수);

}

unsigned char 명세문서_보안설정을_값으로_변환(struct AVR설정정보  *pAVR설정정보)
{
  //[2011.11.02.수][생성!!!]{---------------
  //<AVR설정정보:보안설정> 을 1바이트 값으로 변환.
  //}--------------------------------------

  //[VAR]
  //{
      unsigned char  설정값;

      int  i;

  //}

  //[변환]
  //{
      //[주의!!!]{--------------------------------------
      //실제 적용시에는 <0:사용>, <1:미사용> 이라는 것이 주의!!!
      //<true/false> 와는 반대로 적용해야 한다.
      //}----------------------------------------------

      설정값 = 0;

      for(i = 0; i <= 7; i++)
      {
        설정값 |= (((!(pAVR설정정보->보안설정[i].사용유무)) & 1) << i);

      }

  //}

  return(설정값);

}

void 명세문서_값을_보안설정으로_변환(struct AVR설정정보  *pAVR설정정보,
                              unsigned char      p설정값)
{
  //[2011.11.02.수][생성!!!]{-------------
  //1바이트 값을 <AVR설정정보:보안설정> 에 정리.
  //}------------------------------------

  //[VAR]
  //{
      int  i;

  //}

  //[변환]
  //{
      //[주의!!!]{--------------------------------------
      //실제 적용시에는 <0:사용>, <1:미사용> 이라는 것이 주의!!!
      //<true/false> 와는 반대로 적용해야 한다.
      //}----------------------------------------------

      for(i = 0; i <= 7; i++)
      {
        pAVR설정정보->보안설정[i].사용유무 = !((p설정값 >> i) & 1);

      }

  //}

}

unsigned char 명세문서_확장설정을_값으로_변환(struct AVR설정정보  *pAVR설정정보)
{
  //[2011.11.02.수][생성!!!]{---------------
  //<AVR설정정보:확장설정> 을 1바이트 값으로 변환.
  //}--------------------------------------

  //[VAR]
  //{
      unsigned char  설정값;

      int  i;

  //}

  //[변환]
  //{
      //[주의!!!]{--------------------------------------
      //실제 적용시에는 <0:사용>, <1:미사용> 이라는 것이 주의!!!
      //<true/false> 와는 반대로 적용해야 한다.
      //}----------------------------------------------

      설정값 = 0;

      for(i = 0; i <= 7; i++)
      {
        설정값 |= (((!(pAVR설정정보->확장설정[i].사용유무)) & 1) << i);

      }

  //}

  return(설정값);

}

void 명세문서_값을_확장설정으로_변환(struct AVR설정정보  *pAVR설정정보,
                              unsigned char      p설정값)
{
  //[2011.11.02.수][생성!!!]{-------------
  //1바이트 값을 <AVR설정정보:확장설정> 에 정리.
  //}------------------------------------

  //[VAR]
  //{
      int  i;

  //}

  //[변환]
  //{
      //[주의!!!]{--------------------------------------
      //실제 적용시에는 <0:사용>, <1:미사용> 이라는 것이 주의!!!
      //<true/false> 와는 반대로 적용해야 한다.
      //}----------------------------------------------

      for(i = 0; i <= 7; i++)
      {
        pAVR설정정보->확장설정[i].사용유무 = !((p설정값 >> i) & 1);

      }

  //}

}

unsigned char 명세문서_상위설정을_값으로_변환(struct AVR설정정보  *pAVR설정정보)
{
  //[2011.11.02.수][생성!!!]{---------------
  //<AVR설정정보:상위설정> 을 1바이트 값으로 변환.
  //}--------------------------------------

  //[VAR]
  //{
      unsigned char  설정값;

      int  i;

  //}

  //[변환]
  //{
      //[주의!!!]{--------------------------------------
      //실제 적용시에는 <0:사용>, <1:미사용> 이라는 것이 주의!!!
      //<true/false> 와는 반대로 적용해야 한다.
      //}----------------------------------------------

      설정값 = 0;

      for(i = 0; i <= 7; i++)
      {
        설정값 |= (((!(pAVR설정정보->상위설정[i].사용유무)) & 1) << i);

      }

  //}

  return(설정값);

}

void 명세문서_값을_상위설정으로_변환(struct AVR설정정보  *pAVR설정정보,
                              unsigned char      p설정값)
{
  //[2011.11.02.수][생성!!!]{-------------
  //1바이트 값을 <AVR설정정보:상위설정> 에 정리.
  //}------------------------------------

  //[VAR]
  //{
      int  i;

  //}

  //[변환]
  //{
      //[주의!!!]{--------------------------------------
      //실제 적용시에는 <0:사용>, <1:미사용> 이라는 것이 주의!!!
      //<true/false> 와는 반대로 적용해야 한다.
      //}----------------------------------------------

      for(i = 0; i <= 7; i++)
      {
        pAVR설정정보->상위설정[i].사용유무 = !((p설정값 >> i) & 1);

      }

  //}

}

unsigned char 명세문서_하위설정을_값으로_변환(struct AVR설정정보  *pAVR설정정보)
{
  //[2011.11.02.수][생성!!!]{---------------
  //<AVR설정정보:하위설정> 을 1바이트 값으로 변환.
  //}--------------------------------------

  //[VAR]
  //{
      unsigned char  설정값;

      int  i;

  //}

  //[변환]
  //{
      //[주의!!!]{--------------------------------------
      //실제 적용시에는 <0:사용>, <1:미사용> 이라는 것이 주의!!!
      //<true/false> 와는 반대로 적용해야 한다.
      //}----------------------------------------------

      설정값 = 0;

      for(i = 0; i <= 7; i++)
      {
        설정값 |= (((!(pAVR설정정보->하위설정[i].사용유무)) & 1) << i);

      }

  //}

  return(설정값);

}

void 명세문서_값을_하위설정으로_변환(struct AVR설정정보  *pAVR설정정보,
                              unsigned char      p설정값)
{
  //[2011.11.02.수][생성!!!]{-------------
  //1바이트 값을 <AVR설정정보:하위설정> 에 정리.
  //}------------------------------------

  //[VAR]
  //{
      int  i;

  //}

  //[변환]
  //{
      //[주의!!!]{--------------------------------------
      //실제 적용시에는 <0:사용>, <1:미사용> 이라는 것이 주의!!!
      //<true/false> 와는 반대로 적용해야 한다.
      //}----------------------------------------------

      for(i = 0; i <= 7; i++)
      {
        pAVR설정정보->하위설정[i].사용유무 = !((p설정값 >> i) & 1);

      }

  //}

}








