← 목록
기타 2026-06-20 5KB 읽기 5분

모노톤 SVG 아이콘 생성기 (한선씨)

개요

브리프 crowny-orchestrate/briefs/아이콘생성기.md 의 자율 프로토콜대로, 모노톤(단색) 벡터 SVG 아이콘을 생성하는 순수 한선씨 도구를 작성·검증했다.

무엇을 했는지

  • 참고 파일 crowny-icons.js 부재 확인 — 디스크 전체 검색 결과 없음. 기존 libs/아이콘.한선
SVG와 무관한 30줄 아이콘 레지스트리(단문자 코드)였고 git 미추적. 웹코드SVG.한선/웹코드아이콘.한선은 캔버스 도형·이모지 폴백이라 진짜 벡터 아이콘 경로를 내지 않음.
  • 기존 검증된 모듈명 클로버 금지(libs/CLAUDE.md) 준수 + 세션명 일치를 위해
신규 파일 libs/아이콘생성기.한선 작성(기존 아이콘.한선은 보존).
  • 10종 Feather 계열 라인 아이콘 경로 내장: 홈/검색/사용자/설정/하트/별/체크/닫기/더하기/알림.
  • 공개 API: 아이콘목록() 아이콘있는가(이름) 아이콘SVG(이름,크기,색)(외곽선)
아이콘SVG채움(이름,크기,색)(fill) 아이콘파일저장(이름,크기,색,경로).
  • 모노톤: 단일 색 문자열(#3D2B1F/currentColor/rgb(...))로만 stroke 또는 fill.

검증 (직접·왕복)

  • hanseonc_high(기준 컴파일러) 컴파일 exit=0, 실행 5개 샘플 정상 생성.
  • 생성 SVG 5개 전부 xmllint --noout 유효 XML 통과.
  • 왕복: 순수 한선씨 추출기 clike_to_rpn.한선 → RPN → hanseonc_rpn → TOAU 경로로도
5개 샘플 바이트 동일 생성. (단, 진단용 카운트 한 줄 등록 아이콘: 10개가 RPN 경로에서 1411310개로 어긋남 — 중첩 문자열변환(길이(...)) 연결에 대한 추출기 충실도 갭(SSOT 기록된 "양방향 어렵다"), 아이콘 생성기 자체 버그 아님. 기준 컴파일러는 정상.)

관련 파일

  • CrownyOS/crownyc/libs/아이콘생성기.한선 (신규, 도구 본체+데모)
  • 샘플: /tmp/아이콘_{홈,검색,사용자,하트,별}.svg
  • 학습DB: intent 모노톤_SVG_아이콘생성기 등록

확장 (이어서 진행)

  • 아이콘 10종 → 23종 추가: 화살표(오른/왼/위/아래)·메뉴·달력·휴지통·다운로드·업로드·편집·잠금·메일·새로고침.
  • 데모를 아이콘목록() 전체 순회로 변경 → 23개 전부 생성·검증.
  • 버그 발견·수정: 설정(기어) 경로 ~700자 단일 리터럴이 hanseonc_high 토큰 버퍼
char text[512](line ~580)를 넘어 잘리고 쓰레기 바이트 혼입 → xmllint 실패. C 미수정, 한선씨에서 3조각 분할 + 연결로 우회. (메모리 feedback_hanseonc_high_token_buffer_512)
  • 중첩 문자열변환(길이(...))를 변수로 분리 → 왕복(RPN) 경로 진단 출력도 정상화.
  • 최종 검증: 기준 컴파일러 23/23 유효 XML, 왕복 추출기 경로도 23/23 유효 XML.

함정 근본 수정 (컴파일러 본체)

"함정 해결 가능?" 요청에 따라 우회가 아닌 hanseonc_high.c 본체를 수정했다.
  • 근본 원인: 문자열 렉서(line ~726)에 경계검사가 전혀 없어 512자 초과 리터럴이 Token.text[512]
넘어 인접 메모리를 덮어쓰는 버퍼 오버런(쓰레기 바이트 혼입). 단순 길이 한계가 아니라 메모리 안전 버그.
  • 수정: ① Token.text[512]→[1024] ② 렉서에 경계검사 추가 → 초과 시 깨지지 않고
문자열 리터럴이 1023자를 초과 (line N). 긴 문자열은 + 로 분할 연결하세요. 명확한 에러+exit(1).
  • 메모리: tokens[524288] 고정배열 ×1024 ≈ 577MB BSS(데먼드-제로, 시작 지연 없음). MAX_TOKENS 불변 → 회귀 0.
  • 검증: tests 70개 회귀 PASS=68/FAIL=2(기준선과 100% 동일, 무관한 벤치마크·이미지통합테스트).
700자 단일 리터럴 정상 컴파일, 1100자는 명확한 에러, 아이콘 23/23 재검증 유효.
  • 메모리: feedback_hanseonc_high_token_buffer_512 갱신(함정→수정완료).
  • 라이브러리의 기어 경로 분할은 유지(구버전 바이너리 호환).

무제한 리팩터 (char 동적화 — 2단계 완결)

"좋아" 승인에 따라 1023자 한계까지 제거: Token.textchar text[1024]char *text 동적할당으로 전환.
  • 렉서 쓰기 지점만 수정(tok_strndup/tok_strdup, 문자열은 가변버퍼 slit_push). 읽기 지점은 char 호환 무수정.
  • 하류 복사 전수감사: 전부 strncpy(...,255) 또는 길이기반 buf_emit_str → 오버플로 없음.
  • 메모리 추가 감소: tokens[524288] 인라인 1024B→포인터 8B. __DATA 869MB→336MB(누적 약 533MB↓).
  • 검증: tests 회귀 기존통과분 PASS=74/FAIL=0(신규 실패 0, 기존 실패는 벤치마크·이미지통합테스트뿐).
1023/1024/3000/8000자 단일 리터럴 정상, 아이콘 23/23.
  • 환경 함정: 동시 세션이 hanseonc_high를 옛 빌드로 덮는 stale 바이너리 발생 → 작업 직전 재빌드+시각확인 필수. (git 미추적 산출물)

잔여 이슈

  • 추출기(clike_to_rpn)의 중첩 호출 직접 연결 충실도 갭은 잔존(변수 분리로 회피 가능) — 별도 추출기 세션 과제.
  • 라이브러리 기어 경로 분할은 유지(구버전 바이너리 호환). 신버전만 쓰면 단일 리터럴로 단순화 가능.