[BACK]Return to xtag.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kxx

File: [local] / OpenXM / src / kxx / xtag.c (download)

Revision 1.1, Sun Oct 20 13:13:35 2002 UTC (21 years, 6 months ago) by takayama
Branch: MAIN
CVS Tags: R_1_3_1-2, RELEASE_1_3_1_13b, RELEASE_1_2_3_12, RELEASE_1_2_3, RELEASE_1_2_2_KNOPPIX_b, RELEASE_1_2_2_KNOPPIX, RELEASE_1_2_2, KNOPPIX_2006, HEAD, DEB_REL_1_2_3-9

The first version of OpenXM super server oxd.
Example of a session with oxd:

nobuki@yama2:$ telnet localhost 8089
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
?<login method="file"/>
<challenge file="/home/nobuki/.oxd12174"/>
?<done/>
?<launch> ox -ox ox_asir </launch>
<bye/>
Connection closed by foreign host.

/* $OpenXM: OpenXM/src/kxx/xtag.c,v 1.1 2002/10/20 13:13:35 takayama Exp $
 */
#include <stdio.h>
int findChar(char s[],int c);
int findString(char s[],char a[]);
int findString2(char s[],char a[]);
char *getTag(char *s);
char *getKeyValue(char *s,char *key);
char *getBody(char *s);
void *xtagMalloc(int n);
void xtagFree(void *p);
void xtagError(char *s);
/*
  struct stringPair {
    char *first;
    char *rest;
  };
  char *getKeyValue(char *s, char *key);
  struct stringPair *getNextBlock(char *s);
*/

main_assert1() {
  /* asserting functions. */
  char *s1,*s2,*s3;
  s1 = " <login method=\"file\"> ";
  s2 = " <launch> ox -ox ox_asir </launch>";
  s3 = " <launch> ox <launch> hogera </launch></launch>";
  printf("%s\n",getTag(s1));
  printf("%s\n",getTag("hoge hoge hogera"));
  printf("%s\n",getTag("<hoge hoge hogera"));
  printf("%s\n",getKeyValue(s1,"method"));
  printf("%s\n",getKeyValue(s1,"user"));
  printf("%s\n",getBody(s2));
  printf("%s\n",getBody(s3));
}

void xtagError(char *s) {
  fprintf(stderr,"Error in xtag.c : %s\n",s);
  exit(10);
}
void *xtagMalloc(int n) {
  void *p;
  if (n <= 0) xtagError("malloc with negative arguments.");
  p = (void *)malloc(n);
  if (p == NULL) xtagError("No more memory.");
  return p;
}
void xtagFree(void *p) {
  free(p);
}

char *getTag(char *s) {
  int n,i,j;
  char *ans, *ans2;
  n = strlen(s);
  ans = (char *)xtagMalloc(n+1);
  ans[0] = 0;
  for (i=0; i<n; i++) {
	if (s[i] == '<') {
	  for (j=i+1; j<n; j++) {
		if ((s[j] == '>') ||
            (s[j] == '/' && s[j+1] == '>') ||
			(s[j] == ' ')) {
		  goto aaa;
		}
		ans[j-i-1] = s[j];
		ans[j-i] = 0;
	  }
	}
  }
  aaa: ;
  if (strlen(ans) == 0) return NULL;
  ans2 = (char *) xtagMalloc(strlen(ans)+1);
  strcpy(ans2,ans);
  xtagFree(ans);
  return ans2;
}

char *getKeyValue(char *s,char *key) {
  char *key2;
  int p;
  int i,start,end;
  char *ans;

  key2 = xtagMalloc(3+strlen(key)); /* search the string " key=" */
  strcpy(key2," ");
  strcat(key2,key);
  strcat(key2,"=");

  p = findString(s,key2);
  if (p < 0) return NULL;
  else {
	start = p + strlen(key2);
	/* skip blank and " */
	for (i=start; i<strlen(s) ; i++) {
	  if (s[i] == ' ' ||
		  s[i] == '\"') {
	  }else{
		start = i;
		break;
	  }
	}
	/* read key value */
	end = start;
	for (i = start; i<strlen(s); i++) {
	  if ((s[i] == ' ') ||
		  (s[i] == '\"')) {
		end = i;
		break;
	  }else{
		end++;
	  }
	}
	if (end - start <= 0) return NULL;
	ans = (char *)xtagMalloc((end-start)+1);
	for (i=start; i<end; i++) {
	  ans[i-start] = s[i];
	  ans[i-start+1] = 0;
	}
	return ans;
  }
}

char *getBody(char *s) {
  char *tag;
  char *startTag;
  char *endTag;
  char *ans;
  int start,end,i,level;

  tag = getTag(s);
  if (tag == NULL) return NULL;
  startTag = (char *)xtagMalloc(strlen(tag)+4);
  strcpy(startTag,"<");
  strcat(startTag,tag);
  strcat(startTag,">");
  endTag = (char *)xtagMalloc(strlen(tag)+4);
  strcpy(endTag,"</");
  strcat(endTag,tag);
  strcat(endTag,">");

  /* printf("%s,%s, %s\n",tag,startTag,endTag); */
  start = end = findString(s,startTag);
  if (start < 0) return NULL;
  start = start + strlen(startTag);
  level = 1;
  for (i=start; i<strlen(s); i++) {
	if (findString2(&(s[i]),startTag) == 0) {
	  level++;
	}else if (findString2(&(s[i]),endTag) == 0) {
	  level--;
	  if (level < 1) {
		end = i;
		break;
	  }
	}
  }
  if (end - start <= 0) return NULL;
  ans = (char *)xtagMalloc(end-start+1);
  for (i=start; i<end; i++) {
    ans[i-start] = s[i];
    ans[i-start+1] = 0;
  }
  return ans;
}

int findChar(char s[],int c) {
  int i;
  int n;
  n = strlen(s);
  for (i=0; i<n; i++) {
	if (s[i] == c) return i;
  }
  return -1;
}

int findString(char s[],char a[]) {
  int n,m,i,j;
  n = strlen(s);
  m = strlen(a);
  for (i=0; i<n-m; i++) {
	for (j=0; j<m; j++) {
	  if (s[i+j] != a[j]) break;
	  if (j == m-1) return i;
	}
  }
  return -1;
}
int findString2(char s[],char a[]) {
  int n,m,i,j;
  n = strlen(s);
  m = strlen(a);
  i = 0;
  for (j=0; j<m; j++) {
	if (s[i+j] != a[j]) break;
	  if (j == m-1) return i;
  }
  return -1;
}