feat: acquire-core full legacy C corpus (~2066 files, build-verified) + generator + inventory

This commit is contained in:
forge-bot 2026-07-18 11:24:15 +00:00
commit b96cf702ee
2897 changed files with 264970 additions and 0 deletions

View file

@ -0,0 +1,21 @@
/*
* txcore_dbio.h - TxCore DBIO (ECPG/Pro*C )
*/
#ifndef TXCORE_DBIO_H
#define TXCORE_DBIO_H
#include "txcore.h"
#define TX_SQL_OK 0
#define TX_SQL_NOTFOUND 100
#define TX_DBIO_RESULT(sc) \
((sc) == TX_SQL_OK ? TX_OK : \
(sc) == TX_SQL_NOTFOUND ? TX_ENOENT : TX_EDB)
#define TX_DBIO_LOG_ERR(tag) \
tx_log(TX_LOG_ERROR, "DBIO 오류 [%s] sqlcode=%ld msg=%.*s", \
(tag), (long)sqlca.sqlcode, \
(int)sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc)
#endif /* TXCORE_DBIO_H */

View file

@ -0,0 +1,86 @@
/*
* txcore.h - TxCore API
*
* TxCore , Tuxedo/ProFrame TP
* ATMI(tpcall/tpreturn/tpbegin) FML/UBF(Fchg/Fget)
* . TP /.
*/
#ifndef TXCORE_H
#define TXCORE_H
#include <stddef.h>
#include <stdarg.h>
#ifdef __cplusplus
extern "C" {
#endif
#define TX_OK 0
#define TX_FAIL (-1)
#define TX_ENOENT (-2)
#define TX_EINVAL (-3)
#define TX_EDB (-4)
#define TX_ENOMEM (-5)
#define TX_ENOKEY (-6)
#define TX_LOG_DEBUG 0
#define TX_LOG_INFO 1
#define TX_LOG_WARN 2
#define TX_LOG_ERROR 3
#define TX_MAX_SLOTS 64
#define TX_KEY_LEN 32
#define TX_VAL_LEN 256
typedef struct {
char key[TX_KEY_LEN];
char val[TX_VAL_LEN];
int len;
int used;
} TXFIELD;
typedef struct {
int count;
TXFIELD slots[TX_MAX_SLOTS];
} TXBUF;
typedef struct {
char name[TX_KEY_LEN];
TXBUF *in;
TXBUF *out;
int rcode;
long xid;
} TXSVCINFO;
typedef void (*tx_service_fn)(TXSVCINFO *ctx);
#define TX_SERVICE(name, ctx) void name(TXSVCINFO *ctx)
TXBUF *tx_buf_alloc(void);
void tx_buf_free(TXBUF *buf);
void tx_buf_reset(TXBUF *buf);
int tx_buf_set(TXBUF *buf, const char *key, const char *val, int len);
int tx_buf_sets(TXBUF *buf, const char *key, const char *val);
int tx_buf_setlong(TXBUF *buf, const char *key, long val);
int tx_buf_get(TXBUF *buf, const char *key, char *out, int outlen);
int tx_buf_getlong(TXBUF *buf, const char *key, long *out);
int tx_register(const char *name, tx_service_fn fn);
int tx_call(const char *svc, TXBUF *in, TXBUF *out);
int tx_return(TXSVCINFO *ctx, int rc, TXBUF *out);
int tx_service_count(void);
int tx_begin(void);
int tx_commit(void);
int tx_abort(void);
long tx_current_xid(void);
void tx_log(int level, const char *fmt, ...);
void tx_set_loglevel(int level);
const char *tx_strerror(int rc);
#ifdef __cplusplus
}
#endif
#endif /* TXCORE_H */

View file

@ -0,0 +1,265 @@
/*
* txcore.c - TxCore
*/
#include "txcore.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define TX_MAX_SERVICES 512
typedef struct {
char name[TX_KEY_LEN];
tx_service_fn fn;
} tx_entry_t;
static tx_entry_t g_registry[TX_MAX_SERVICES];
static int g_registry_count = 0;
static int g_loglevel = TX_LOG_INFO;
static long g_xid_seq = 0;
static long g_cur_xid = 0;
static const char *level_name(int level)
{
switch (level) {
case TX_LOG_DEBUG: return "DEBUG";
case TX_LOG_INFO: return "INFO ";
case TX_LOG_WARN: return "WARN ";
case TX_LOG_ERROR: return "ERROR";
default: return "?????";
}
}
void tx_set_loglevel(int level) { g_loglevel = level; }
void tx_log(int level, const char *fmt, ...)
{
va_list ap;
time_t now;
struct tm tmv;
char ts[20];
if (level < g_loglevel)
return;
now = time(NULL);
localtime_r(&now, &tmv);
strftime(ts, sizeof(ts), "%Y-%m-%d %H:%M:%S", &tmv);
fprintf(stderr, "[%s] %s ", ts, level_name(level));
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fputc('\n', stderr);
}
const char *tx_strerror(int rc)
{
switch (rc) {
case TX_OK: return "정상";
case TX_FAIL: return "일반 실패";
case TX_ENOENT: return "서비스 미등록";
case TX_EINVAL: return "파라미터 오류";
case TX_EDB: return "DB 오류";
case TX_ENOMEM: return "자원 부족";
case TX_ENOKEY: return "버퍼 키 없음";
default: return "알 수 없는 오류";
}
}
TXBUF *tx_buf_alloc(void) { return (TXBUF *)calloc(1, sizeof(TXBUF)); }
void tx_buf_free(TXBUF *buf) { if (buf) free(buf); }
void tx_buf_reset(TXBUF *buf) { if (buf) memset(buf, 0, sizeof(*buf)); }
static TXFIELD *find_slot(TXBUF *buf, const char *key)
{
int i;
for (i = 0; i < TX_MAX_SLOTS; i++) {
if (buf->slots[i].used &&
strncmp(buf->slots[i].key, key, TX_KEY_LEN) == 0)
return &buf->slots[i];
}
return NULL;
}
static TXFIELD *alloc_slot(TXBUF *buf, const char *key)
{
int i;
TXFIELD *f = find_slot(buf, key);
if (f)
return f;
for (i = 0; i < TX_MAX_SLOTS; i++) {
if (!buf->slots[i].used) {
f = &buf->slots[i];
memset(f, 0, sizeof(*f));
strncpy(f->key, key, TX_KEY_LEN - 1);
f->used = 1;
buf->count++;
return f;
}
}
return NULL;
}
int tx_buf_set(TXBUF *buf, const char *key, const char *val, int len)
{
TXFIELD *f;
if (!buf || !key || !val)
return TX_EINVAL;
if (len < 0 || len >= TX_VAL_LEN)
return TX_ENOMEM;
f = alloc_slot(buf, key);
if (!f)
return TX_ENOMEM;
memcpy(f->val, val, len);
f->val[len] = '\0';
f->len = len;
return TX_OK;
}
int tx_buf_sets(TXBUF *buf, const char *key, const char *val)
{
if (!val)
return TX_EINVAL;
return tx_buf_set(buf, key, val, (int)strlen(val));
}
int tx_buf_setlong(TXBUF *buf, const char *key, long val)
{
char tmp[32];
snprintf(tmp, sizeof(tmp), "%ld", val);
return tx_buf_set(buf, key, tmp, (int)strlen(tmp));
}
int tx_buf_get(TXBUF *buf, const char *key, char *out, int outlen)
{
TXFIELD *f;
if (!buf || !key || !out || outlen <= 0)
return TX_EINVAL;
f = find_slot(buf, key);
if (!f)
return TX_ENOKEY;
if (f->len >= outlen)
return TX_ENOMEM;
memcpy(out, f->val, f->len);
out[f->len] = '\0';
return TX_OK;
}
int tx_buf_getlong(TXBUF *buf, const char *key, long *out)
{
TXFIELD *f;
char *end;
long v;
if (!buf || !key || !out)
return TX_EINVAL;
f = find_slot(buf, key);
if (!f)
return TX_ENOKEY;
v = strtol(f->val, &end, 10);
if (end == f->val)
return TX_EINVAL;
*out = v;
return TX_OK;
}
int tx_register(const char *name, tx_service_fn fn)
{
int i;
if (!name || !fn)
return TX_EINVAL;
if (g_registry_count >= TX_MAX_SERVICES)
return TX_ENOMEM;
for (i = 0; i < g_registry_count; i++) {
if (strncmp(g_registry[i].name, name, TX_KEY_LEN) == 0) {
g_registry[i].fn = fn;
return TX_OK;
}
}
strncpy(g_registry[g_registry_count].name, name, TX_KEY_LEN - 1);
g_registry[g_registry_count].fn = fn;
g_registry_count++;
tx_log(TX_LOG_DEBUG, "서비스 등록: %s", name);
return TX_OK;
}
int tx_service_count(void) { return g_registry_count; }
static tx_service_fn lookup(const char *name)
{
int i;
for (i = 0; i < g_registry_count; i++) {
if (strncmp(g_registry[i].name, name, TX_KEY_LEN) == 0)
return g_registry[i].fn;
}
return NULL;
}
int tx_call(const char *svc, TXBUF *in, TXBUF *out)
{
tx_service_fn fn;
TXSVCINFO ctx;
if (!svc || !in || !out)
return TX_EINVAL;
fn = lookup(svc);
if (!fn) {
tx_log(TX_LOG_ERROR, "tx_call: 서비스 미등록 svc=%s", svc);
return TX_ENOENT;
}
memset(&ctx, 0, sizeof(ctx));
strncpy(ctx.name, svc, TX_KEY_LEN - 1);
ctx.in = in;
ctx.out = out;
ctx.rcode = TX_OK;
ctx.xid = g_cur_xid;
fn(&ctx);
return ctx.rcode;
}
int tx_return(TXSVCINFO *ctx, int rc, TXBUF *out)
{
if (!ctx)
return TX_EINVAL;
ctx->rcode = rc;
if (out && ctx->out && out != ctx->out)
memcpy(ctx->out, out, sizeof(TXBUF));
return rc;
}
int tx_begin(void)
{
if (g_cur_xid != 0) {
tx_log(TX_LOG_WARN, "tx_begin: 이미 진행중 xid=%ld", g_cur_xid);
return TX_FAIL;
}
g_cur_xid = ++g_xid_seq;
tx_log(TX_LOG_INFO, "tx_begin xid=%ld", g_cur_xid);
return TX_OK;
}
int tx_commit(void)
{
if (g_cur_xid == 0) {
tx_log(TX_LOG_WARN, "tx_commit: 트랜잭션 없음");
return TX_FAIL;
}
tx_log(TX_LOG_INFO, "tx_commit xid=%ld", g_cur_xid);
g_cur_xid = 0;
return TX_OK;
}
int tx_abort(void)
{
if (g_cur_xid == 0) {
tx_log(TX_LOG_WARN, "tx_abort: 트랜잭션 없음");
return TX_FAIL;
}
tx_log(TX_LOG_WARN, "tx_abort xid=%ld", g_cur_xid);
g_cur_xid = 0;
return TX_OK;
}
long tx_current_xid(void) { return g_cur_xid; }