모노톤 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.text를
char 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)의 중첩 호출 직접 연결 충실도 갭은 잔존(변수 분리로 회피 가능) — 별도 추출기 세션 과제.
- 라이브러리 기어 경로 분할은 유지(구버전 바이너리 호환). 신버전만 쓰면 단일 리터럴로 단순화 가능.