[BACK]Return to oxapp.c CVS log [TXT][DIR] Up to [local] / OpenXM / misc / packages / Windows

File: [local] / OpenXM / misc / packages / Windows / oxapp.c (download)

Revision 1.1, Sun Jan 6 08:47:36 2002 UTC (22 years, 5 months ago) by takayama
Branch: MAIN

"Oxpp" is a utility  to build an asir source code from multiple source codes which are
included by the load command each other.
The new source code does not contain "load".

The asirinit command in oxasir.sm1 loads "oxasir-win.rr" instead of
"oxasir.asir" when it is executed on Windows.
oxasir-win.rr should be built by the Makefile in misc/packages/Windows.

/* $OpenXM: OpenXM/misc/packages/Windows/oxapp.c,v 1.1 2002/01/06 08:47:36 takayama Exp $ */
#include <stdio.h>
#define LINESIZE 4096

main(int argc,char *argv[]) {
  char s[LINESIZE];
  int removeSharp = 0;
  if (argc > 1) {
	if (strcmp(argv[1],"--removeSharp") == 0) {
	  removeSharp = 1;
	}
  }
  while (fgets(s,LINESIZE,stdin) != NULL) {
	if (strlen(s) >= LINESIZE-1) {
	  fprintf(stderr,"Too long line.\n");
	  exit(20);
	}
	edit(s);
	if (removeSharp && s[0] == '#') {
	  printf("\n");
	}else{
	  printf("%s",s);
	}
  }
  if (removeSharp == 0) {
	printf("end$\n");
  }
}

edit(char s[]) {
  int k,i,j;
  char t[LINESIZE*2];
  if (strlen(s) == 0) return;
  t[0] = 0;
  if ((k = find(s,"load(")) >= 0) {
	if (k > 0 && not_separator(s[k-1]) ) return; /* bload */
	/* Heuristic 1 */
	if (k > 0) {
	  if (s[0] == 'i' && s[1] == 'f') return; /* if ... load */
	}
	/* Heuristic 2.A.    load(User_asirrc)$ */
	if (find(s,"load(User_asirrc)")>=0) {
	  s[0] = '\n'; s[1]=0;
	  return;
	}
	/* Heuristic 2 */
	if (('A' <= s[k+5]) && (s[k+5] <= 'Z')) {
	  return; /* load(User_asirrc) */
	}  
	/* Heuristic 3. load("./"+Fname) in phc */
	if (find(s,"+Fname")>=0) return;

	for (i=0; i<k; i++) {
	  t[i] = s[i]; t[i+1] = 0;
	}
    strcat(t,"#include ");
	j=k+5;
	for (i=strlen(t); i<LINESIZE*2-1; ) {
	  if (s[j] == 0) break;
	  if (s[j] == ')' || s[j] == ';' || s[j] == '$')  {
		j += 1;
	  }else{
		t[i] = s[j]; t[i+1] = 0;
		i++; j++;
	  }
	}
	if (strlen(t) >= LINESIZE-1) {
	  fprintf(stderr,"Too long string %s\n",t);
	}
	strcpy(s,t);
  }
  if ((k = find(s,"end$")) >= 0) {
	if (k > 0 && not_separator(s[k-1])) return;
    strcpy(s,"\n");
  }
}

find(char *s,char *substr) {
  int n,m,i,j,k,k0;
  n = strlen(s);
  m = strlen(substr);
  k0 = -1; k = -1;
  for (i=0; i<n-m+1; i++) {
	k = i;
	for (j=0; j<m; j++) {
      if (s[i+j] != substr[j]) {
		k = -1; break;
	  }
	}
    if (k >= 0 && k0 >= 0) {
	  fprintf(stderr,"More than appearance of %s\n",substr);
	  exit(20);
	}
	if (k >= 0) k0 = k;
  }
  return k0;
}

not_separator(c) {
  if (c >='A' && c <='Z') return 1;
  if (c >='a' && c <='z') return 1;
  if (c >='0' && c <='9') return 1;
  if (c =='_') return 1;
  return 0;
}