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

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>