static int write_links(tgf_stream_out *s) { int i,j,rv; tgf_command cmd; tgf_argument args[2]; cmd.arguments = args; /* phase 1. collect segments */ for (i=0;i<sctext_size;i++) { char *ptr; int len,pos; sctext[i].segment = -1; if (sctext[i].alias >= 0) continue; if (!sctext[i].id || sctext[i].id[0] != '/') continue; /* put `in segment' idtf instead of full uri */ sctext[i].segment = register_segment(sctext[i].id, pos = get_seglen(sctext[i].id)); pos++; len = strlen(sctext[i].id+pos); ptr = malloc(len+1); memcpy(ptr,sctext[i].id+pos,len); ptr[len] = 0; free(sctext[i].id); sctext[i].id = ptr; } /* phase 2. write segments one by one */ for (j=0;j<segments_cnt;j++) { cmd.type = TGF_DECLARE_SEGMENT; cmd.arg_cnt = 1; args[0].type = TGF_STRING; args[0].arg.a_string = segments[j]; rv = tgf_write_command(s,&cmd,TGF_I2P(j+SCTEXT_MAXSIZE+1)); if (rv<0) return rv; cmd.type = TGF_GENEL; cmd.arg_cnt = 2; args[0].type = TGF_STRING; args[1].type = TGF_SCTYPE; for (i=0;i<sctext_size;i++) { if (sctext[i].segment<0 || sctext[i].segment != j || sctext[i].hidden) continue; if (sctext[i].cont_type) { fprintf(stderr,"Multiple segments are not fully supported yet." " So you cannot place content to elements of other segments, yet \n"); fprintf(stderr,"idtf is %s\n",sctext[i].id); abort(); } args[0].arg.a_string = sctext[i].id; args[1].arg.a_sctype = get_tgf_type(sctext[i].type); rv = tgf_write_command(s,&cmd,TGF_I2P(i+1)); if (rv<0) return rv; } } return 0; }
static void put_seg_desc(void) { if(segtype != SEG_VIRTUAL) { if(segtype > SEG_END) { if(!ingroup) { long len; int i, ml; char *me; len = get_seglen(); me = msgbuf; rb->snprintf(me,MAXDESCLEN, "%4d: ", currseg); me = me+rb->strlen(me); if(segtype >= SEG_DATA && len) { rb->snprintf(me,MAXDESCLEN, "%5ld bytes, ", len); me = me+rb->strlen(me); } ml = 0; for(i = 0; seg_desc[i]; i++) { if(seg_desc[i] == '\n') { *me = '\0'; put_msg(msgbuf); me = msgbuf; rb->snprintf(me,MAXDESCLEN, " "); me = me+rb->strlen(me); ml = 0; } else { if(ml < MAXDESCLEN) *me++ = seg_desc[i]; ml++; } } *me = '\0'; put_msg(msgbuf); } else { rb->snprintf(msgbuf,MAXDESCLEN, "%4d:", currseg); put_tmp_msg(msgbuf); } } else put_msg(seg_desc); } #ifdef DEBUG_TAPE else fprintf(stderr, "virtual segment\n"); #endif }