]> granicus.if.org Git - php/commitdiff
- Some more comments
authorUwe Steinmann <steinm@php.net>
Thu, 9 Nov 2000 13:36:54 +0000 (13:36 +0000)
committerUwe Steinmann <steinm@php.net>
Thu, 9 Nov 2000 13:36:54 +0000 (13:36 +0000)
- Initial support to just include anchors into documents

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

index 5469446a182f1b89f3d5ffd18280c2cfae71dc79..b56926e89b64e221cf788ef7755780cb8910d085 100644 (file)
@@ -326,12 +326,17 @@ int fnCmpAnchors(ANCHOR *a1, ANCHOR *a2)
 
 /***********************************************************************
 * Function fnCreateAnchorList()                                        *
+* Uses either docofanchorrec or reldestrec to create a list of anchors *
+* depending on anchormode                                              *
 *                                                                      *
 * Returns a list of Anchors converted from an object record            *
 * Parameter: int objectID: the object for which the list is created    *
 *            char **anchors: object records of anchors                 *
-*            char **dest: object records of destinations               *
+*            char **docofanchorrec: Name of destination absolut        *
+*            char **reldestrec: Name of destination relativ to current *
+*                               object                                 *
 *            int ancount: number of anchors                            *
+*            int anchormode: 0 = use absolut dest, else rel. dest      *
 * Return: List of Anchors, NULL if error                               *
 ***********************************************************************/
 #ifdef newlist
@@ -2112,6 +2117,7 @@ int send_gettext(int sockfd, hw_objectID objectID, int mode, int rootid, char **
                        DLIST *pAnchorList;
 #endif
 
+                       /* Get dest as relative and absolut path */
                        send_getdestforanchorsobj(sockfd, anchors, &destrec, ancount);
                        send_getreldestforanchorsobj(sockfd, anchors, &reldestrec, ancount, rootid, objectID);
                        pAnchorList = fnCreateAnchorList(objectID, anchors, destrec, reldestrec, ancount, mode);
@@ -3366,11 +3372,17 @@ int send_getdestforanchorsobj(int sockfd, char **anchorrec, char ***destrec, int
        /* Now get for each anchor the object record of its destination */
        for(i=0; i<count; i++) {
                /* if you retrieve the anchors you sometimes get more than actually accessible.
-                  This happens for the object 0x29a9c. */
+               */
                if((NULL != anchorrec[i]) && (NULL != (str = fnAttributeValue(anchorrec[i], "Dest")))) {
                        sscanf(str, "0x%x", &objectID);
                        efree(str);
 
+                       /* Using send_docbyanchorobj() makes sense because the Destination can
+                          be both, an anchor or a document. If it is a document you get the
+                          objectrecord of that document. If it is an anchor the function
+                          graps the document which belongs to the anchor
+                          and you get also the objectrecord of that document.
+                       */
                        if(0 > send_docbyanchorobj(sockfd, objectID, &objptr)) {
                                efree(destptr);
                                return -1;
@@ -3412,6 +3424,7 @@ int send_getreldestforanchorsobj(int sockfd, char **anchorrec, char ***reldestre
                        sscanf(str, "0x%x", &destobjectID);
                        efree(str);
 
+                       /* See note in send_getdestforanchorsobj() at same position in source code */
                        if(0 > send_docbyanchorobj(sockfd, destobjectID, &docofanchorptr)) {
                                efree(reldestptr);
                                return -1;
@@ -4964,8 +4977,8 @@ int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, in
        efree(retmsg);
 
        /* passively open the data connection. The HG server is probably
-           already waiting for us.
-        */
+          already waiting for us.
+       */
        len = sizeof(serv_addr);
        if((newfd = accept(fd, (struct sockaddr *) &serv_addr, &len)) < 0) {
 /*             php_printf("client: can't open data connection to server\n"); */
@@ -5016,6 +5029,7 @@ int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, in
                        DLIST *pAnchorList = NULL;
 #endif
 
+                       /* Get dest as relative and absolut path */
                        send_getdestforanchorsobj(sockfd, anchors, &destrec, ancount);
                        send_getreldestforanchorsobj(sockfd, anchors, &reldestrec, ancount, rootid, objectID);
                        pAnchorList = fnCreateAnchorList(objectID, anchors, destrec, reldestrec, ancount, mode);
index d383d3062946d67e00960ed10cc8205c2ab30278..0351c4d7ac1410e92e544e9c9294b447af06d1cc 100644 (file)
@@ -108,6 +108,7 @@ function_entry hw_functions[] = {
        PHP_FE(hw_insertobject,                                                 NULL)
        PHP_FE(hw_insdoc,                                                               NULL)
        PHP_FE(hw_getsrcbydestobj,                                              NULL)
+       PHP_FE(hw_insertanchors,                                                        NULL)
        PHP_FE(hw_getrellink,                                                   NULL)
        PHP_FE(hw_who,                                                                  NULL)
        PHP_FE(hw_stat,                                                                 NULL)
@@ -633,6 +634,28 @@ static int * make_ints_from_array(HashTable *lht) {
        return objids;
 }
 
+static char **make_strs_from_array(HashTable *arrht) {
+       char **carr = NULL;
+       zval *data, **dataptr;
+
+       zend_hash_internal_pointer_reset(arrht);
+       if(NULL == (carr = emalloc(zend_hash_num_elements(arrht) * sizeof(char *))))
+               return(NULL);
+
+       /* 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);
+                               break;
+               }
+
+               zend_hash_move_forward(arrht);
+       }
+       return(carr);
+}
+
 #define BUFFERLEN 30
 static void php_hw_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
 {
@@ -3831,6 +3854,50 @@ PHP_FUNCTION(hw_getrellink) {
 }
 /* }}} */
        
+/* {{{ proto string hw_insertanchors(int hwdoc, array anchorecs, array dest)
+   Inserts only anchors into text */
+PHP_FUNCTION(hw_insertanchors) {
+       pval **arg1, **arg2, **arg3, **arg4;
+       hw_document *hwdoc;
+       int type, docid, error;
+       char *anchorstr;
+       char **anchorrecs;
+       char **dest;
+       HashTable *arrht;
+
+       if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+       convert_to_long_ex(arg1);
+       convert_to_array_ex(arg2);
+       convert_to_array_ex(arg3);
+       docid=(*arg1)->value.lval;
+       hwdoc = zend_list_find(docid, &type);
+       if(!hwdoc || (type!=HwSG(le_document))) {
+               php_error(E_WARNING,"Unable to find file identifier %d",link);
+               RETURN_FALSE;
+       }
+
+       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;
+       }
+
+       /* Turn PHP-Array of strings into C-Array of strings */
+       arrht = (*arg2)->value.ht;
+       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)))) {
+               php_error(E_WARNING, "command (insertanchors) returned %d\n", error);
+               RETURN_FALSE;
+       }
+*/
+       RETURN_STRING(anchorstr, 0);
+}
+/* }}} */
+       
 
 PHP_MINFO_FUNCTION(hw)
 {
index 6e1be6fde1af17d6e0c1e2068fc80fe28663cdfa..674303bfcd26359fd736d8de1073030384379aca 100644 (file)
@@ -142,6 +142,7 @@ PHP_FUNCTION(hw_objrec2array);
 PHP_FUNCTION(hw_array2objrec);
 PHP_FUNCTION(hw_connection_info);
 PHP_FUNCTION(hw_getsrcbydestobj);
+PHP_FUNCTION(hw_insertanchors);
 PHP_FUNCTION(hw_getrellink);
 PHP_FUNCTION(hw_dummy);
 PHP_FUNCTION(hw_who);