Major changes since last commit: - FiveSql2 SQL:1999 engine (10,458 LOC) — 43/43 ALL PASS - 21 compiler/runtime bugs fixed (short-circuit AND/OR, FOR LOOP, etc.) - @byref pass-by-reference via RefCell pattern - Mutable closure capture (EnsureLocalRef + RefCell sharing) - RTL: 400 → 479 functions (+79: file, string, datetime, hash, UTF-8) - DateTime/Timestamp fully working (hb_DateTime, hb_Hour/Min/Sec, display) - Reserved word guard (39 keywords blocked from function calls) - AEval arg order fix (element before index) - Closure capture redecl fix (unique _cap_ names per block) - Hash/string indexing in ArrayPush/ArrayPop - Harbour compat test suite: 51/51 - 4 docs: Porting Report, Implementation Plan, Optimization Plan, Commercialization Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
144 lines
6.8 KiB
Markdown
144 lines
6.8 KiB
Markdown
# Five RTL 구현 목록 — 파일 + 문자열 + 날짜
|
||
|
||
**현재:** 417개 구현 / Harbour 1,011개
|
||
**이 목록 완료 시:** ~472개 (47%) → 비즈니스 앱 실질 커버리지 ~85%
|
||
|
||
---
|
||
|
||
## 1. 파일/디렉토리 (20개)
|
||
|
||
### 이미 있음 ✅
|
||
```
|
||
FOPEN, FCLOSE, FREAD, FWRITE, FSEEK, FCREATE, FERASE, FRENAME,
|
||
MEMOREAD, MEMOWRIT, DIRECTORY, CURDIR, DIRMAKE, DIRREMOVE,
|
||
HB_FILEEXISTS, HB_DIREXISTS, HB_DIRCREATE, HB_DIRBASE,
|
||
HB_FTEMPCREATE, HB_FNAMESPLIT, HB_FNAMEDIR, HB_FNAMEEXT,
|
||
HB_FNAMENAME, HB_FNAMEMERGE
|
||
```
|
||
|
||
### 구현 필요 (20개)
|
||
|
||
| # | 함수 | 설명 | Go 대응 | 난이도 |
|
||
|---|------|------|---------|--------|
|
||
| 1 | `HB_FSIZE(cFile)` | 파일 크기 (bytes) | `os.Stat().Size()` | 쉬움 |
|
||
| 2 | `HB_FCOPY(cSrc, cDst)` | 파일 복사 | `io.Copy` | 쉬움 |
|
||
| 3 | `HB_FEOF(nHandle)` | 파일 끝 확인 | `f.Read() == 0` | 쉬움 |
|
||
| 4 | `HB_FCOMMIT(nHandle)` | 파일 플러시 | `f.Sync()` | 쉬움 |
|
||
| 5 | `HB_FREADLEN(nH, nLen)` | N바이트 읽기 | `f.Read(buf)` | 쉬움 |
|
||
| 6 | `HB_FGETATTR(cFile)` | 파일 속성 | `os.Stat().Mode()` | 쉬움 |
|
||
| 7 | `HB_FSETATTR(cFile, n)` | 파일 속성 설정 | `os.Chmod()` | 쉬움 |
|
||
| 8 | `HB_FGETDATETIME(cFile)` | 파일 수정일시 | `os.Stat().ModTime()` | 중간 |
|
||
| 9 | `HB_FSETDATETIME(cFile, d, t)` | 파일 날짜 설정 | `os.Chtimes()` | 중간 |
|
||
| 10 | `HB_FLOCK(nH, nOff, nLen)` | 파일 잠금 | `syscall.Flock()` | 중간 |
|
||
| 11 | `HB_FUNLOCK(nH, nOff, nLen)` | 파일 잠금 해제 | `syscall.Flock()` | 중간 |
|
||
| 12 | `HB_FILEDELETE(cMask)` | 와일드카드 삭제 | `filepath.Glob` + `os.Remove` | 중간 |
|
||
| 13 | `HB_FILEMATCH(cFile, cMask)` | 와일드카드 매칭 | `filepath.Match` | 쉬움 |
|
||
| 14 | `HB_FNAMEEXISTS(cFile)` | 파일/디렉토리 존재 | `os.Stat()` | 쉬움 |
|
||
| 15 | `HB_FNAMEEXTSET(cFile, cExt)` | 확장자 변경 | `strings.TrimSuffix` + 추가 | 쉬움 |
|
||
| 16 | `HB_FNAMENAMEEXT(cFile)` | 이름+확장자 | `filepath.Base` | 쉬움 |
|
||
| 17 | `HB_MEMOREAD(cFile)` | 파일 전체 읽기 | 이미 `MEMOREAD` 있음, alias | 쉬움 |
|
||
| 18 | `HB_MEMOWRIT(cFile, cData)` | 파일 전체 쓰기 | 이미 `MEMOWRIT` 있음, alias | 쉬움 |
|
||
| 19 | `HB_DIRTEMP()` | 임시 디렉토리 경로 | `os.TempDir()` | 쉬움 |
|
||
| 20 | `HB_DISKSPACE(cDrive)` | 디스크 여유 공간 | `syscall.Statfs` | 중간 |
|
||
|
||
---
|
||
|
||
## 2. 문자열 (20개)
|
||
|
||
### 이미 있음 ✅
|
||
```
|
||
AT, RAT, SUBSTR, LEFT, RIGHT, PADR, PADL, PADC, STRTRAN, REPLICATE,
|
||
STUFF, UPPER, LOWER, ALLTRIM, LTRIM, RTRIM, SPACE, CHR, ASC, LEN,
|
||
VAL, STR, TRANSFORM, TOKEN, NUMTOKEN,
|
||
HB_VALTOEXP, HB_VALTOSTR, HB_NTOS, HB_CSTR,
|
||
HB_NUMTOHEX, HB_HEXTONUM, HB_STRTOHEX, HB_HEXTOSTR,
|
||
HB_TOKENGET, HB_TOKENCOUNT, HB_ATOKENS,
|
||
HB_UTF8LEN, HB_UTF8SUBSTR, HB_UTF8TOSTR, HB_STRTOUTF8,
|
||
HB_UTF8AT, HB_UTF8LEFT, HB_UTF8RIGHT
|
||
```
|
||
|
||
### 구현 필요 (15개)
|
||
|
||
| # | 함수 | 설명 | Go 대응 | 난이도 |
|
||
|---|------|------|---------|--------|
|
||
| 1 | `HB_AT(cSub, cStr [,nFrom])` | AT + 시작위치 | `strings.Index` + offset | 쉬움 |
|
||
| 2 | `HB_RAT(cSub, cStr)` | 뒤에서 찾기 + 확장 | `strings.LastIndex` | 쉬움 |
|
||
| 3 | `HB_ATI(cSub, cStr)` | 대소문자 무시 찾기 | `strings.ToUpper` + `Index` | 쉬움 |
|
||
| 4 | `HB_ATX(cRegex, cStr)` | 정규식 찾기 | `regexp.FindString` | 중간 |
|
||
| 5 | `HB_LEFTEQI(cStr, cPrefix)` | 대소문자 무시 시작 비교 | `strings.EqualFold` | 쉬움 |
|
||
| 6 | `HB_ASCIIISALPHA(n)` | 알파벳 여부 | `unicode.IsLetter` | 쉬움 |
|
||
| 7 | `HB_ASCIIISDIGIT(n)` | 숫자 여부 | `unicode.IsDigit` | 쉬움 |
|
||
| 8 | `HB_ASCIIISLOWER(n)` | 소문자 여부 | `unicode.IsLower` | 쉬움 |
|
||
| 9 | `HB_ASCIIISUPPER(n)` | 대문자 여부 | `unicode.IsUpper` | 쉬움 |
|
||
| 10 | `HB_STRISUTF8(cStr)` | UTF-8 유효성 | `utf8.Valid` | 쉬움 |
|
||
| 11 | `HB_STRDECODESCAPE(cStr)` | \n \t 등 이스케이프 | `strconv.Unquote` | 중간 |
|
||
| 12 | `HB_STRXOR(cStr, cKey)` | XOR 암호화 | byte loop | 쉬움 |
|
||
| 13 | `HB_WILDMATCH(cMask, cStr)` | 와일드카드 매칭 | `filepath.Match` | 쉬움 |
|
||
| 14 | `HB_WILDMATCHI(cMask, cStr)` | 대소문자 무시 와일드카드 | `ToUpper` + `Match` | 쉬움 |
|
||
| 15 | `HARDCR(cStr)` | Soft CR → Hard CR | `strings.ReplaceAll` | 쉬움 |
|
||
|
||
---
|
||
|
||
## 3. 날짜/시간 (20개)
|
||
|
||
### 이미 있음 ✅
|
||
```
|
||
DATE, DAY, MONTH, YEAR, DOW, CDOW, CMONTH,
|
||
DTOS, STOD, DTOC, CTOD, SECONDS, TIME,
|
||
HB_DATETIME, HB_HOUR, HB_MINUTE, HB_SEC, HB_SECOND,
|
||
HB_TTOS, HB_STOT, HB_TTOC, HB_CTOT, HB_MILLISECONDS
|
||
```
|
||
|
||
### 구현 필요 (20개)
|
||
|
||
| # | 함수 | 설명 | Go 대응 | 난이도 |
|
||
|---|------|------|---------|--------|
|
||
| 1 | `HB_DATE(nY, nM, nD)` | 날짜 생성 | Julian 변환 | 쉬움 |
|
||
| 2 | `HB_CTOD(cDate, cFmt)` | 포맷 지정 문자열→날짜 | `time.Parse` | 중간 |
|
||
| 3 | `HB_DTOC(dDate, cFmt)` | 포맷 지정 날짜→문자열 | `time.Format` | 중간 |
|
||
| 4 | `HB_STOD(cDate)` | "YYYYMMDD"→날짜 | 이미 `STOD` 있음, alias | 쉬움 |
|
||
| 5 | `HB_DTOT(dDate)` | Date→Timestamp (자정) | Julian + 0ms | 쉬움 |
|
||
| 6 | `HB_TTOD(tTimestamp)` | Timestamp→Date (시간 제거) | Julian만 | 쉬움 |
|
||
| 7 | `HB_TTOHOUR(tTS)` | 시 추출 | ms / 3600000 | 쉬움 |
|
||
| 8 | `HB_TTOMIN(tTS)` | 분 추출 | ms / 60000 % 60 | 쉬움 |
|
||
| 9 | `HB_TTOSEC(tTS)` | 초 추출 | ms / 1000 % 60 | 쉬움 |
|
||
| 10 | `HB_TTOMSEC(tTS)` | 밀리초 추출 | ms % 1000 | 쉬움 |
|
||
| 11 | `HB_TTON(tTS)` | Timestamp→초 (자정부터) | ms / 1000 | 쉬움 |
|
||
| 12 | `HB_NTOT(dDate, nSec)` | Date+초→Timestamp | Julian + sec*1000 | 쉬움 |
|
||
| 13 | `HB_NTOHOUR(nSec)` | 초→시 | nSec / 3600 | 쉬움 |
|
||
| 14 | `HB_NTOMIN(nSec)` | 초→분 | nSec / 60 % 60 | 쉬움 |
|
||
| 15 | `HB_NTOSEC(nSec)` | 초→초 (mod 60) | nSec % 60 | 쉬움 |
|
||
| 16 | `HB_WEEK(dDate)` | ISO 주차 | `time.ISOWeek` | 쉬움 |
|
||
| 17 | `HB_CDAY(nDow)` | 요일 번호→이름 | `time.Weekday.String` | 쉬움 |
|
||
| 18 | `DAYS(nSec)` | 초→일수 | nSec / 86400 | 쉬움 |
|
||
| 19 | `ELAPTIME(cStart, cEnd)` | 경과시간 "HH:MM:SS" | 파싱 + 차이 | 중간 |
|
||
| 20 | `AMPM(cTime)` | "13:00"→"01:00 PM" | 파싱 + 변환 | 쉬움 |
|
||
|
||
---
|
||
|
||
## 4. 추가 필수 유틸 (5개)
|
||
|
||
| # | 함수 | 설명 | Go 대응 | 난이도 |
|
||
|---|------|------|---------|--------|
|
||
| 1 | `HB_SETENV(cVar, cVal)` | 환경변수 설정 | `os.Setenv` | 쉬움 |
|
||
| 2 | `HB_PS()` | 경로 구분자 | `string(os.PathSeparator)` | 쉬움 |
|
||
| 3 | `HB_EOL()` | 줄바꿈 문자 | `"\n"` 또는 `"\r\n"` | 쉬움 |
|
||
| 4 | `HB_ISNULL(x)` | Empty string/NIL | `IsNil \|\| ""` | 쉬움 |
|
||
| 5 | `ERRORSYS()` | 기본 에러 핸들러 | stub | 쉬움 |
|
||
|
||
---
|
||
|
||
## 요약
|
||
|
||
| 카테고리 | 추가 수 | 쉬움 | 중간 |
|
||
|----------|---------|------|------|
|
||
| 파일/디렉토리 | 20 | 14 | 6 |
|
||
| 문자열 | 15 | 13 | 2 |
|
||
| 날짜/시간 | 20 | 17 | 3 |
|
||
| 유틸 | 5 | 5 | 0 |
|
||
| **합계** | **60** | **49** | **11** |
|
||
|
||
**예상 시간:** 쉬움 49개 × 5분 + 중간 11개 × 15분 = **~7시간**
|
||
**완료 후 RTL:** 417 + 60 = **477개** (47%)
|
||
**비즈니스 앱 실질 커버리지:** ~85%
|