⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmdparse.c

📁 SEAL是DOS 下的32位保护模式的GUI程序
💻 C
字号:
/* Initialization script parser version 1.0 (c) 2001 Kostas Michalopoulos */

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "cmdparse.h"

typedef struct t_var *p_var;
typedef struct t_var
{
  char  *name;
  char  *value;
  p_var next;
} t_var;

p_var vars = NULL, last = NULL;

p_var new_var(char *name, char *value)
{
  p_var var = (p_var) malloc(sizeof(t_var));
  var->name = strdup(name);
  var->value = strdup(value);
  var->next = NULL;
  if (vars) last->next = var; else vars = var;
  last = var;

  return var;
}

p_var find_var(char *name)
{
  p_var v = vars;
  if (!v) return NULL;
  while (v) {
    if (!stricmp(v->name, name+1)) return v;
    v = v->next;
  };
  return NULL;
}

char *get_var(char *name)
{
  char *res;
  int slen = strlen(name);

  if (name[0] == '"' && name[slen-1] == '"') {
    res = (char *) malloc(slen);
    strcpy(res, name+1);
    res[strlen(res)-1] = 0;
    res = realloc(res, strlen(res)+1);

    return res;
  };
  if (name[0] == '$') {
    p_var v = vars;
    if (!v) return strdup("");
    while (v) {
      if (!stricmp(v->name, name+1)) return strdup(v->value);
      v = v->next;
    };

    return strdup("");
  };
  res = (char *) malloc(50);
  itoa(atoi(name), res, 10);
  res = (char *) realloc(res, strlen(res)+1);

  return res;
}

void set_var(char *name, char *value)
{
  p_var v = find_var(name);
  if (!v) {
    new_var(name, value);

    return;
  };

  v->value = value;
}

void set_var_value(char *name, char *value)
{
  set_var(name, value);
}

char *get_var_value(char *name)
{
  p_var v = vars;
  if (!v) return strdup("");
  while (v) {
    if (!stricmp(v->name, name)) return strdup(v->value);
    v = v->next;
  };

  return strdup("");
}

void parse_line(char *line)
{
  char **arg = malloc(4);
  int args = 0, i, c = 0, us = 0;

  arg[0] = strdup("");

  for (i=0;i<strlen(line);i++) switch (line[i]) {
    case ' ': if (us) {
      arg[args] = realloc(arg[args], strlen(arg[args])+2);
      arg[args][c++] = ' ';
      arg[args][c] = 0;
    } else if (arg[args][0]) {
      args++;
      c = 0;
      arg = realloc(arg, args*4+4);
      arg[args] = strdup("");
    }; break;
    case '"': {
      us = !us;
      arg[args] = realloc(arg[args], strlen(arg[args])+2);
      arg[args][c++] = '"';
      arg[args][c] = 0;
    }; break;
    default: {
      arg[args] = realloc(arg[args], strlen(arg[args])+2);
      arg[args][c++] = line[i];
      arg[args][c] = 0;
    };
  };
  strlwr(arg[0]);

  if (!strcmp(arg[0], "parse")) {
    if (args >= 1 && arg[1][0]) parse_file(arg[1]);
  } else
  if (arg[0][strlen(arg[0])-1] == ':') {
    char *buff = strdup("");
    for (i=1;i<=args;i++) {
      char *a = get_var(arg[i]);
      buff = realloc(buff, strlen(buff)+strlen(a)+1);
      strcat(buff, a);
      free(a);
    };
    arg[0][strlen(arg[0])-1] = 0;
    set_var(arg[0], buff);
    free(buff);
  };

  for (i=0;i<=args;i++) free(arg[i]);
  free(arg);
}

int parse_file(char *fname)
{
  FILE *f = fopen(fname, "rt");
  if (!f) return 0;

  while (!feof(f)) {
    char buff[1024];
    fgets(buff, 1024, f);

    if (buff[strlen(buff)-1] == '\n') buff[strlen(buff)-1] = 0;
    if (buff[0] && buff[0] != ';') parse_line(buff);
  };

  fclose(f);

  return 1;
}

void free_vars()
{
  p_var v = vars;
  if (!v) return;
  do {
    p_var next = v->next;
    free(v->name);
    free(v->value);
    free(v);
    v = next;
  } while (v);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -