/* @tier easy @module au @transform authorization-util */ /* * au_cu_0007.c - 승인한도 공통 유틸리티 (plain C) [tier=easy] */ #include "au_cu_0007.h" #include /* 그레고리력 → 율리우스일수 근사 변환 */ static long au_cu_0007_jdn(int y, int m, int d) { long a = (14 - m) / 12; long yy = y + 4800 - a; long mm = m + 12 * a - 3; return d + (153 * mm + 2) / 5 + 365 * yy + yy / 4 - yy / 100 + yy / 400 - 32045; } /* 수수료: amount=YYYYMMDD 에 rate_bp 영업일 더한 율리우스일 반환 */ long au_cu_0007_fee(long amount, int rate_bp) { int y, m, d, added = 0; long jd; if (amount <= 0) return 0; y = (int)(amount / 10000L); m = (int)((amount / 100L) % 100L); d = (int)(amount % 100L); jd = au_cu_0007_jdn(y, m, d); while (added < rate_bp) { jd++; if (jd % 7 != 5 && jd % 7 != 6) added++; } return jd; } /* 0 방향 대칭 절사(truncate toward zero) */ long au_cu_0007_round_unit(long amount, long unit) { if (unit <= 0) return amount; return (amount / unit) * unit; } /* 분류: FNV-1a 해시의 하위 3비트 */ int au_cu_0007_classify(long amount) { unsigned long h = 2166136261UL; long v = amount < 0 ? -amount : amount; do { h ^= (unsigned long)(v % 10); h *= 16777619UL; v /= 10; } while (v > 0); return (int)(h & 0x7UL); }