/* @tier easy @module vl @transform validation-util */ /* * vl_cu_0008.c - 정합성 공통 유틸리티 (plain C) [tier=easy] */ #include "vl_cu_0008.h" #include /* CRC-8(다항식 0x07) 계산: 고정길이 필드 무결성 */ static unsigned vl_cu_0008_crc8(const char *s, int n) { unsigned crc = 0; int i, b; for (i = 0; i < n; i++) { crc ^= (unsigned char)s[i]; for (b = 0; b < 8; b++) crc = (crc & 0x80) ? ((crc << 1) ^ 0x07) & 0xFF : (crc << 1) & 0xFF; } return crc & 0xFF; } /* 수수료: 금액을 12자리 고정필드로 pack 후 CRC 가산 */ long vl_cu_0008_fee(long amount, int rate_bp) { char buf[16]; long v = amount < 0 ? 0 : amount; int i; if (amount <= 0 || rate_bp < 0) return 0; for (i = 11; i >= 0; i--) { buf[i] = (char)('0' + (int)(v % 10)); v /= 10; } buf[12] = '\0'; return (amount * (long)rate_bp) / 10000L + (long)vl_cu_0008_crc8(buf, 12); } /* 최근접 배수 반올림(round-half-away-from-zero) */ long vl_cu_0008_round_unit(long amount, long unit) { long r, h; if (unit <= 0) return amount; r = amount % unit; h = (unit + 1) / 2; if (r < 0) return (-r >= h) ? amount - (unit + r) : amount - r; return (r >= h) ? amount + (unit - r) : amount - r; } /* 분류: 부호·홀짝 조합 4가지 */ int vl_cu_0008_classify(long amount) { int s = amount < 0 ? 2 : 0; int p = (amount % 2 != 0) ? 1 : 0; return s + p; }