📄 crmgr.c
字号:
/************************************************************************************************* * Utility for debugging Curia and its applications * Copyright (C) 2000-2003 Mikio Hirabayashi * This file is part of QDBM, Quick Database Manager. * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU * Lesser General Public License as published by the Free Software Foundation; either version * 2.1 of the License or any later version. QDBM is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * You should have received a copy of the GNU Lesser General Public License along with QDBM; if * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA. *************************************************************************************************/#include <depot.h>#include <curia.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#undef TRUE#define TRUE 1 /* boolean true */#undef FALSE#define FALSE 0 /* boolean false */#define ALIGNSIZ 32 /* basic size of alignment *//* for RISC OS */#if defined(__riscos__) || defined(__riscos)#include <unixlib/local.h>int __riscosify_control = __RISCOSIFY_NO_PROCESS;#endif/* global variables */const char *progname; /* program name *//* function prototypes */int main(int argc, char **argv);void usage(void);char *mystrdup(const char *str);char *hextoobj(const char *str, int *sp);char *dectoiobj(const char *str, int *sp);char *readfile(const char *name, int *sp);int runcreate(int argc, char **argv);int runput(int argc, char **argv);int runout(int argc, char **argv);int runget(int argc, char **argv);int runlist(int argc, char **argv);int runoptimize(int argc, char **argv);int runinform(int argc, char **argv);int runremove(int argc, char **argv);void pdperror(const char *name);void printobj(const char *obj, int size);void printobjhex(const char *obj, int size);int docreate(const char *name, int bnum, int dnum);int doput(const char *name, const char *kbuf, int ksiz, const char *vbuf, int vsiz, int dmode, int lob, int align);int doout(const char *name, const char *kbuf, int ksiz, int lob);int doget(const char *name, const char *kbuf, int ksiz, int start, int max, int ox, int lob, int nb);int dolist(const char *name, int ox);int dooptimize(const char *name, int bnum, int align);int doinform(const char *name);int doremove(const char *name);/* main routine */int main(int argc, char **argv){ int rv; progname = argv[0]; if(argc < 2) usage(); rv = 0; if(!strcmp(argv[1], "create")){ rv = runcreate(argc, argv); } else if(!strcmp(argv[1], "put")){ rv = runput(argc, argv); } else if(!strcmp(argv[1], "out")){ rv = runout(argc, argv); } else if(!strcmp(argv[1], "get")){ rv = runget(argc, argv); } else if(!strcmp(argv[1], "list")){ rv = runlist(argc, argv); } else if(!strcmp(argv[1], "optimize")){ rv = runoptimize(argc, argv); } else if(!strcmp(argv[1], "inform")){ rv = runinform(argc, argv); } else if(!strcmp(argv[1], "remove")){ rv = runremove(argc, argv); } else if(!strcmp(argv[1], "version") || !strcmp(argv[1], "--version")){ printf("Powered by QDBM version %s\n", dpversion); printf("Copyright (c) 2000-2003 Mikio Hirabayashi\n"); rv = 0; } else { usage(); } return rv;}/* print the usage and exit */void usage(void){ fprintf(stderr, "%s: administration utility for Curia\n", progname); fprintf(stderr, "\n"); fprintf(stderr, "usage:\n"); fprintf(stderr, " %s create [-bnum num] [-dnum num] name\n", progname); fprintf(stderr, " %s put [-kx|-ki] [-vx|-vi|-vf] [-keep|-cat] [-lob] [-na] " "name key val\n", progname); fprintf(stderr, " %s out [-kx|-ki] [-lob] name key\n", progname); fprintf(stderr, " %s get [-kx|-ki] [-start num] [-max num] [-ox] [-lob] [-n] name key\n", progname); fprintf(stderr, " %s list [-ox] name\n", progname); fprintf(stderr, " %s optimize [-bnum num] [-na] name\n", progname); fprintf(stderr, " %s inform name\n", progname); fprintf(stderr, " %s remove name\n", progname); fprintf(stderr, " %s version\n", progname); exit(1);}/* duplicate a string */char *mystrdup(const char *str){ int len; char *buf; len = strlen(str); if(!(buf = malloc(len + 1))) return NULL; memcpy(buf, str, len + 1); return buf;}/* create a binary object from a hexadecimal string */char *hextoobj(const char *str, int *sp){ char *buf, mbuf[3]; int len, i, j; len = strlen(str); if(!(buf = malloc(len + 1))) return NULL; j = 0; for(i = 0; i < len; i += 2){ while(strchr(" \n\r\t\f\v", str[i])){ i++; } if((mbuf[0] = str[i]) == '\0') break; if((mbuf[1] = str[i+1]) == '\0') break; mbuf[2] = '\0'; buf[j++] = strtol(mbuf, NULL, 16); } buf[j] = '\0'; *sp = j; return buf;}/* create a integer object from a decimal string */char *dectoiobj(const char *str, int *sp){ char *buf; int num; num = atoi(str); if(!(buf = malloc(sizeof(int)))) return NULL; *(int *)buf = num; *sp = sizeof(int); return buf;}/* read data from file */char *readfile(const char *name, int *sp){ FILE *IN; int i, c; char *buf; if(!(IN = fopen(name, "rb"))) return NULL; buf = NULL; for(i = 0; (c = fgetc(IN)) != EOF; i++){ if(!(buf = realloc(buf, i + 1))){ fclose(IN); return NULL; } buf[i] = c; } fclose(IN); *sp = i; return buf;}/* parse arguments of create command */int runcreate(int argc, char **argv){ char *name; int i, bnum, dnum, rv; name = NULL; bnum = -1; dnum = -1; for(i = 2; i < argc; i++){ if(!name && argv[i][0] == '-'){ if(!strcmp(argv[i], "-bnum")){ if(++i >= argc) usage(); bnum = atoi(argv[i]); } else if(!strcmp(argv[i], "-dnum")){ if(++i >= argc) usage(); dnum = atoi(argv[i]); } else { usage(); } } else if(!name){ name = argv[i]; } else { usage(); } } if(!name) usage(); rv = docreate(name, bnum, dnum); return rv;}/* parse arguments of put command */int runput(int argc, char **argv){ char *name, *key, *val, *kbuf, *vbuf; int i, kx, ki, vx, vi, vf, lob, ksiz, vsiz, align, rv; int dmode; name = NULL; kx = FALSE; ki = FALSE; vx = FALSE; vi = FALSE; vf = FALSE; lob = FALSE; align = ALIGNSIZ; key = NULL; val = NULL; dmode = CR_DOVER; for(i = 2; i < argc; i++){ if(!name && argv[i][0] == '-'){ if(!strcmp(argv[i], "-kx")){ kx = TRUE; } else if(!strcmp(argv[i], "-ki")){ ki = TRUE; } else if(!strcmp(argv[i], "-vx")){ vx = TRUE; } else if(!strcmp(argv[i], "-vi")){ vi = TRUE; } else if(!strcmp(argv[i], "-vf")){ vf = TRUE; } else if(!strcmp(argv[i], "-keep")){ dmode = CR_DKEEP; } else if(!strcmp(argv[i], "-cat")){ dmode = CR_DCAT; } else if(!strcmp(argv[i], "-lob")){ lob = TRUE; } else if(!strcmp(argv[i], "-na")){ align = 0; } else { usage(); } } else if(!name){ name = argv[i]; } else if(!key){ key = argv[i]; } else if(!val){ val = argv[i]; } else { usage(); } } if(!name || !key || !val) usage(); if(kx){ kbuf = hextoobj(key, &ksiz); } else if(ki){ kbuf = dectoiobj(key, &ksiz); } else { kbuf = mystrdup(key); ksiz = -1; } if(vx){ vbuf = hextoobj(val, &vsiz); } else if(vi){ vbuf = dectoiobj(val, &vsiz); } else if(vf){ vbuf = readfile(val, &vsiz); } else { vbuf = mystrdup(val); vsiz = -1; } if(kbuf && vbuf){ rv = doput(name, kbuf, ksiz, vbuf, vsiz, dmode, lob, align); } else { if(vf){ fprintf(stderr, "%s: %s: cannot read\n", progname, val); } else { fprintf(stderr, "%s: out of memory\n", progname); } rv = 1; } free(kbuf); free(vbuf); return rv;}/* parse arguments of out command */int runout(int argc, char **argv){ char *name, *key, *kbuf; int i, kx, ki, lob, ksiz, rv; name = NULL; kx = FALSE; ki = FALSE; lob = FALSE; key = NULL; for(i = 2; i < argc; i++){ if(!name && argv[i][0] == '-'){ if(!strcmp(argv[i], "-kx")){ kx = TRUE; } else if(!strcmp(argv[i], "-ki")){ ki = TRUE; } else if(!strcmp(argv[i], "-lob")){ lob = TRUE; } else { usage(); } } else if(!name){ name = argv[i]; } else if(!key){ key = argv[i]; } else { usage(); } } if(!name || !key) usage(); if(kx){ kbuf = hextoobj(key, &ksiz); } else if(ki){ kbuf = dectoiobj(key, &ksiz); } else { kbuf = mystrdup(key); ksiz = -1; } if(kbuf){ rv = doout(name, kbuf, ksiz, lob); } else { fprintf(stderr, "%s: out of memory\n", progname); rv = 1; } free(kbuf); return rv;}/* parse arguments of get command */int runget(int argc, char **argv){ char *name, *key, *kbuf; int i, kx, ki, ox, lob, nb, start, max, ksiz, rv; name = NULL; kx = FALSE; ki = FALSE; ox = FALSE; lob = FALSE; nb = FALSE; start = 0; max = -1; key = NULL; for(i = 2; i < argc; i++){ if(!name && argv[i][0] == '-'){ if(!strcmp(argv[i], "-kx")){ kx = TRUE; } else if(!strcmp(argv[i], "-ki")){ ki = TRUE; } else if(!strcmp(argv[i], "-ox")){ ox = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -