Annotation of OpenXM/src/kxx/xtag.c, Revision 1.1
1.1 ! takayama 1: /* $OpenXM$
! 2: */
! 3: #include <stdio.h>
! 4: int findChar(char s[],int c);
! 5: int findString(char s[],char a[]);
! 6: int findString2(char s[],char a[]);
! 7: char *getTag(char *s);
! 8: char *getKeyValue(char *s,char *key);
! 9: char *getBody(char *s);
! 10: void *xtagMalloc(int n);
! 11: void xtagFree(void *p);
! 12: void xtagError(char *s);
! 13: /*
! 14: struct stringPair {
! 15: char *first;
! 16: char *rest;
! 17: };
! 18: char *getKeyValue(char *s, char *key);
! 19: struct stringPair *getNextBlock(char *s);
! 20: */
! 21:
! 22: main_assert1() {
! 23: /* asserting functions. */
! 24: char *s1,*s2,*s3;
! 25: s1 = " <login method=\"file\"> ";
! 26: s2 = " <launch> ox -ox ox_asir </launch>";
! 27: s3 = " <launch> ox <launch> hogera </launch></launch>";
! 28: printf("%s\n",getTag(s1));
! 29: printf("%s\n",getTag("hoge hoge hogera"));
! 30: printf("%s\n",getTag("<hoge hoge hogera"));
! 31: printf("%s\n",getKeyValue(s1,"method"));
! 32: printf("%s\n",getKeyValue(s1,"user"));
! 33: printf("%s\n",getBody(s2));
! 34: printf("%s\n",getBody(s3));
! 35: }
! 36:
! 37: void xtagError(char *s) {
! 38: fprintf(stderr,"Error in xtag.c : %s\n",s);
! 39: exit(10);
! 40: }
! 41: void *xtagMalloc(int n) {
! 42: void *p;
! 43: if (n <= 0) xtagError("malloc with negative arguments.");
! 44: p = (void *)malloc(n);
! 45: if (p == NULL) xtagError("No more memory.");
! 46: return p;
! 47: }
! 48: void xtagFree(void *p) {
! 49: free(p);
! 50: }
! 51:
! 52: char *getTag(char *s) {
! 53: int n,i,j;
! 54: char *ans, *ans2;
! 55: n = strlen(s);
! 56: ans = (char *)xtagMalloc(n+1);
! 57: ans[0] = 0;
! 58: for (i=0; i<n; i++) {
! 59: if (s[i] == '<') {
! 60: for (j=i+1; j<n; j++) {
! 61: if ((s[j] == '>') ||
! 62: (s[j] == '/' && s[j+1] == '>') ||
! 63: (s[j] == ' ')) {
! 64: goto aaa;
! 65: }
! 66: ans[j-i-1] = s[j];
! 67: ans[j-i] = 0;
! 68: }
! 69: }
! 70: }
! 71: aaa: ;
! 72: if (strlen(ans) == 0) return NULL;
! 73: ans2 = (char *) xtagMalloc(strlen(ans)+1);
! 74: strcpy(ans2,ans);
! 75: xtagFree(ans);
! 76: return ans2;
! 77: }
! 78:
! 79: char *getKeyValue(char *s,char *key) {
! 80: char *key2;
! 81: int p;
! 82: int i,start,end;
! 83: char *ans;
! 84:
! 85: key2 = xtagMalloc(3+strlen(key)); /* search the string " key=" */
! 86: strcpy(key2," ");
! 87: strcat(key2,key);
! 88: strcat(key2,"=");
! 89:
! 90: p = findString(s,key2);
! 91: if (p < 0) return NULL;
! 92: else {
! 93: start = p + strlen(key2);
! 94: /* skip blank and " */
! 95: for (i=start; i<strlen(s) ; i++) {
! 96: if (s[i] == ' ' ||
! 97: s[i] == '\"') {
! 98: }else{
! 99: start = i;
! 100: break;
! 101: }
! 102: }
! 103: /* read key value */
! 104: end = start;
! 105: for (i = start; i<strlen(s); i++) {
! 106: if ((s[i] == ' ') ||
! 107: (s[i] == '\"')) {
! 108: end = i;
! 109: break;
! 110: }else{
! 111: end++;
! 112: }
! 113: }
! 114: if (end - start <= 0) return NULL;
! 115: ans = (char *)xtagMalloc((end-start)+1);
! 116: for (i=start; i<end; i++) {
! 117: ans[i-start] = s[i];
! 118: ans[i-start+1] = 0;
! 119: }
! 120: return ans;
! 121: }
! 122: }
! 123:
! 124: char *getBody(char *s) {
! 125: char *tag;
! 126: char *startTag;
! 127: char *endTag;
! 128: char *ans;
! 129: int start,end,i,level;
! 130:
! 131: tag = getTag(s);
! 132: if (tag == NULL) return NULL;
! 133: startTag = (char *)xtagMalloc(strlen(tag)+4);
! 134: strcpy(startTag,"<");
! 135: strcat(startTag,tag);
! 136: strcat(startTag,">");
! 137: endTag = (char *)xtagMalloc(strlen(tag)+4);
! 138: strcpy(endTag,"</");
! 139: strcat(endTag,tag);
! 140: strcat(endTag,">");
! 141:
! 142: /* printf("%s,%s, %s\n",tag,startTag,endTag); */
! 143: start = end = findString(s,startTag);
! 144: if (start < 0) return NULL;
! 145: start = start + strlen(startTag);
! 146: level = 1;
! 147: for (i=start; i<strlen(s); i++) {
! 148: if (findString2(&(s[i]),startTag) == 0) {
! 149: level++;
! 150: }else if (findString2(&(s[i]),endTag) == 0) {
! 151: level--;
! 152: if (level < 1) {
! 153: end = i;
! 154: break;
! 155: }
! 156: }
! 157: }
! 158: if (end - start <= 0) return NULL;
! 159: ans = (char *)xtagMalloc(end-start+1);
! 160: for (i=start; i<end; i++) {
! 161: ans[i-start] = s[i];
! 162: ans[i-start+1] = 0;
! 163: }
! 164: return ans;
! 165: }
! 166:
! 167: int findChar(char s[],int c) {
! 168: int i;
! 169: int n;
! 170: n = strlen(s);
! 171: for (i=0; i<n; i++) {
! 172: if (s[i] == c) return i;
! 173: }
! 174: return -1;
! 175: }
! 176:
! 177: int findString(char s[],char a[]) {
! 178: int n,m,i,j;
! 179: n = strlen(s);
! 180: m = strlen(a);
! 181: for (i=0; i<n-m; i++) {
! 182: for (j=0; j<m; j++) {
! 183: if (s[i+j] != a[j]) break;
! 184: if (j == m-1) return i;
! 185: }
! 186: }
! 187: return -1;
! 188: }
! 189: int findString2(char s[],char a[]) {
! 190: int n,m,i,j;
! 191: n = strlen(s);
! 192: m = strlen(a);
! 193: i = 0;
! 194: for (j=0; j<m; j++) {
! 195: if (s[i+j] != a[j]) break;
! 196: if (j == m-1) return i;
! 197: }
! 198: return -1;
! 199: }
! 200:
! 201:
! 202:
! 203:
! 204:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>