]> granicus.if.org Git - php/commitdiff
- new function hw_insertanchors(). It takes a document, a list of anchors
authorUwe Steinmann <steinm@php.net>
Tue, 12 Dec 2000 12:28:26 +0000 (12:28 +0000)
committerUwe Steinmann <steinm@php.net>
Tue, 12 Dec 2000 12:28:26 +0000 (12:28 +0000)
  and its destination and inserts the anchors into the text.

ext/hyperwave/hg_comm.c
ext/hyperwave/hg_comm.h
ext/hyperwave/hw.c

index c87eeec057c00efda9216cc1de2b1987909f8022..7662c85b083996d544bd64b69d3f108ed4bef8c5 100644 (file)
@@ -364,7 +364,8 @@ DLIST *fnCreateAnchorList(hw_objectID objID, char **anchors, char **docofanchorr
                if(NULL != anchors[i]) {
                        object = anchors[i];
                        docofanchorptr = docofanchorrec[i];
-                       reldestptr = reldestrec[i];
+                       if(reldestrec) /* FIXME reldestrec may only be NULL if anchormode != 0 */
+                               reldestptr = reldestrec[i];
        
                        /* Determine Position. Doesn't matter if Src or Dest
                           The Position field should always be there. Though there
@@ -587,7 +588,8 @@ DLIST *fnCreateAnchorList(hw_objectID objID, char **anchors, char **docofanchorr
                
                                efree(anchors[i]);
                                if(docofanchorrec[i]) efree(docofanchorrec[i]);
-                               if(reldestrec[i]) efree(reldestrec[i]);
+                               if(reldestrec)
+                                       if(reldestrec[i]) efree(reldestrec[i]);
                        }
                }
        }
@@ -2166,6 +2168,42 @@ int send_gettext(int sockfd, hw_objectID objectID, int mode, int rootid, char **
        return(0);
 }
 
+send_insertanchors(char **text, int *count, char **anchors, char **destrec, int ancount, char **urlprefix, char **bodytag) {
+       char **reldestrec = NULL;
+       int mode = 0;
+       hw_objectID objectID = 0;
+#ifdef newlist
+       zend_llist *pAnchorList = NULL;
+#else
+       DLIST *pAnchorList = NULL;
+#endif
+       pAnchorList = fnCreateAnchorList(objectID, anchors, destrec, reldestrec, ancount, mode);
+
+       /* Free only the array, the objrecs has been freed in fnCreateAnchorList() */
+       if(anchors) efree(anchors);
+       if(destrec) efree(destrec);
+       if(reldestrec) efree(reldestrec);
+
+       if(pAnchorList != NULL) {
+               char *newtext;
+               char *body;
+
+               newtext = fnInsAnchorsIntoText(*text, pAnchorList, &body, urlprefix);
+
+#ifdef newlist
+               zend_llist_destroy(pAnchorList);
+               efree(pAnchorList);
+#else
+               dlst_kill(pAnchorList, fnDeleteAnchor);
+#endif
+               *bodytag = strdup(body);
+               efree(body);
+               *text = newtext;
+               *count = strlen(newtext);
+       }
+       return 0;
+}
+
 int send_edittext(int sockfd, char *objattr, char *text)
 {
        hg_msg msg, *retmsg;
index 4c88d08dd722635f35ff27633863ac1a511d8b9e..bbdf6d755be35982449c40a8ca44c0559b05113c 100644 (file)
@@ -225,6 +225,7 @@ extern int send_incollections(int sockfd, int retcol, int cobjids, hw_objectID *
 extern int send_getsrcbydest(int sockfd, hw_objectID objid, char ***childrec, int *count);
 extern int send_mapid(int sockfd, int servid, hw_objectID id, int *virtid);
 extern int send_dummy(int sockfd, hw_objectID objectID, int msgid, char **attributes);
+extern send_insertanchors(char **text, int *count, char **anchors, char **destrec, int ancount, char **urlprefix, char **bodytag);
 extern char *get_hw_info(hw_connection *conn);
 
 #define send_mvcpdocscoll(sockfd,objectIDs,count,from,dest,mvcp) \
index eb8f3913741e170dfe40488def5b1227f0ce3ec1..6fdad299d2c0d2487886c2c666f52a6a98525bef 100644 (file)
@@ -641,18 +641,22 @@ static int * make_ints_from_array(HashTable *lht) {
 
 static char **make_strs_from_array(HashTable *arrht) {
        char **carr = NULL;
+       char **ptr;
        zval *data, **dataptr;
 
        zend_hash_internal_pointer_reset(arrht);
        if(NULL == (carr = emalloc(zend_hash_num_elements(arrht) * sizeof(char *))))
-               return(NULL);
+               return(NULL);   
+       ptr = carr;
 
        /* Iterate through hash */
        while(zend_hash_get_current_data(arrht, (void **) &dataptr) == SUCCESS) {
                data = *dataptr;
                switch(data->type) {
                        case IS_STRING:
-                               *carr++ = estrdup(data->value.str.val);
+                               *ptr = estrdup(data->value.str.val);
+fprintf(stderr, "carr[] = %s\n", *ptr);
+                               ptr++;
                                break;
                }
 
@@ -2306,11 +2310,11 @@ PHP_FUNCTION(hw_pipedocument) {
        {
        case 2:
                if (getParameters(ht, 2, &arg1, &arg2) == FAILURE)
-                       RETURN_FALSE;
+                       WRONG_PARAM_COUNT;
                break;
        case 3:
                if (getParameters(ht, 3, &arg1, &arg2, &arg3) == FAILURE)
-                       RETURN_FALSE;
+                       WRONG_PARAM_COUNT;
                break;
        default:
                WRONG_PARAM_COUNT;
@@ -4084,20 +4088,35 @@ PHP_FUNCTION(hw_getrellink) {
 }
 /* }}} */
        
-/* {{{ proto string hw_insertanchors(int hwdoc, array anchorecs, array dest)
+/* {{{ proto string hw_insertanchors(int hwdoc, array anchorecs, array dest [, array urlprefixes])
    Inserts only anchors into text */
 PHP_FUNCTION(hw_insertanchors) {
        pval **arg1, **arg2, **arg3, **arg4;
        hw_document *hwdoc;
-       int type, docid, error;
+       int type, docid, error, argc, count;
        char *anchorstr;
        char **anchorrecs;
        char **dest;
+       char **urlprefix;
+       char *bodytag = NULL;
        HashTable *arrht;
+       HashTable *prefixarray;
 
-       if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
+       argc = ZEND_NUM_ARGS();
+       switch(argc)
+       {
+       case 3:
+               if (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE)
+                       WRONG_PARAM_COUNT;
+               break;
+       case 4:
+               if (zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE)
+                       WRONG_PARAM_COUNT;
+               break;
+       default:
                WRONG_PARAM_COUNT;
        }
+
        convert_to_long_ex(arg1);
        convert_to_array_ex(arg2);
        convert_to_array_ex(arg3);
@@ -4108,6 +4127,50 @@ PHP_FUNCTION(hw_insertanchors) {
                RETURN_FALSE;
        }
 
+       /* check for the array with urlprefixes */
+       if(argc == 4) {
+               int i;
+               convert_to_array_ex(arg4);
+               prefixarray =(*arg4)->value.ht;
+               if((prefixarray == NULL) || (zend_hash_num_elements(prefixarray) != 5)) {
+                       php_error(E_WARNING,"You must provide 5 urlprefixes (you have provided %d)", zend_hash_num_elements(prefixarray));
+                       RETURN_FALSE;
+               }
+
+               urlprefix = emalloc(5*sizeof(char *));
+               zend_hash_internal_pointer_reset(prefixarray);
+               for(i=0; i<5; i++) {
+                       char *key;
+                       zval *data, **dataptr;
+                       ulong ind;
+                       
+                       zend_hash_get_current_key(prefixarray, &key, &ind);
+                       zend_hash_get_current_data(prefixarray, (void *) &dataptr);
+                       data = *dataptr;
+                       if (data->type != IS_STRING) {
+                               php_error(E_WARNING,"%s must be a String", key);
+                               RETURN_FALSE;
+                       } else if ( strcmp(key, "HW_DEFAULT_LINK") == 0 ) {
+                               urlprefix[HW_DEFAULT_LINK] = data->value.str.val;
+                       } else if ( strcmp(key, "HW_IMAGE_LINK") == 0 ) {
+                               urlprefix[HW_IMAGE_LINK] = data->value.str.val;
+                       } else if ( strcmp(key, "HW_BACKGROUND_LINK") == 0 ) {
+                               urlprefix[HW_BACKGROUND_LINK] = data->value.str.val;
+                       } else if ( strcmp(key, "HW_INTAG_LINK") == 0 ) {
+                               urlprefix[HW_INTAG_LINK] = data->value.str.val;
+                       } else if ( strcmp(key, "HW_APPLET_LINK") == 0 ) {
+                               urlprefix[HW_APPLET_LINK] = data->value.str.val;
+                       } else {
+                               php_error(E_WARNING,"%s is not a valid urlprefix", key);
+                               RETURN_FALSE;
+                       }
+                       efree(key);
+                       zend_hash_move_forward(prefixarray);
+               }
+       } else {
+               urlprefix = NULL;
+       }
+
        if(zend_hash_num_elements((*arg2)->value.ht) != zend_hash_num_elements((*arg3)->value.ht)) {
                php_error(E_WARNING,"Unequal number of elments in arrays");
                RETURN_FALSE;
@@ -4118,13 +4181,14 @@ PHP_FUNCTION(hw_insertanchors) {
        anchorrecs = make_strs_from_array(arrht);
        arrht = (*arg3)->value.ht;
        dest = make_strs_from_array(arrht);
-/*
-       if (0 != (error = insertanchors(hwdoc->data, anchorrecs, dest, zend_hash_num_elements(arrht)))) {
+
+       if (0 != (error = send_insertanchors(&(hwdoc->data), &count, anchorrecs, dest, zend_hash_num_elements(arrht), urlprefix, &bodytag))) {
                php_error(E_WARNING, "command (insertanchors) returned %d\n", error);
                RETURN_FALSE;
        }
-*/
-       RETURN_STRING(anchorstr, 0);
+       hwdoc->size = count;
+
+       RETURN_TRUE;
 }
 /* }}} */