This is htd.m in view mode; [Download] [Up]
#import <objc/HashTable.h>
#import "MiscList.h"
#import <stdio.h>
#import <string.h>
#import <stdlib.h>
#import <ctype.h>
#import "structures.h"
#import "Htag.h"
#import "TeXviewSwitchBoard.h"
extern TeXviewSwitchBoard *myTeXviewSwitchBoard ;
extern Boolean prescan;
extern shalfword hh, vv;
extern integer pagenum;
extern int lasthh, lastvv;
extern int last_pagenum;
extern float screendpi ;
extern int debugon ;
int do_we_have_data = 0;
//id htags;
//id htpages;
MiscList *visited_tags; // History list of tags visited
// int visit_index; // Index of current tag
void
ht_get_ready_for_new_file()
{
id htags;
id htpages;
if (do_we_have_data) {
htags = [myTeXviewSwitchBoard getCurrentHtags] ;
htpages = [myTeXviewSwitchBoard getCurrentHtpages] ;
/*clear data*/
[htags freeObjects];
[htags free];
[htpages freeObjects];
[htpages free];
[visited_tags freeObjects];
[visited_tags free];
}
htags = [HashTable alloc];
[htags initKeyDesc:"*" valueDesc:"@" capacity:10];
htpages = [HashTable alloc];
[htpages initKeyDesc:"i" valueDesc:"@" capacity:5];
visited_tags = [[MiscList alloc] initCount:25];
// visit_index = 0;
}
/* Taking in to account screendpi, we can have multiple tags */
/* The key in the label is the name concatenated with the dpi */
void
ht_add_tag(char *pt ,int isexternal) /* Add an href */
{
char *ptexp;
id htags;
ptexp = (char *)malloc(strlen(pt) + 7);
sprintf(ptexp, "%sMD%.0f", pt, screendpi);
#ifdef DEBUG
if (debugon > 2 ) {
printf("tag's id is %s\n", ptexp) ;
}
#endif
htags = [myTeXviewSwitchBoard getCurrentHtags] ;
if ([htags isKey:ptexp]) {
/* if (!prescan) { */
[(id)[htags valueForKey:ptexp]
setParams:prescan:hh:vv:pagenum:lasthh:
lastvv:last_pagenum:screendpi];
#ifdef DEBUG
if (debugon > 2 ) {
printf("Just updated a tag %s with parameters:\n \
prescan=%i,hh=%i,vv=%i,pagenum=%i,lasthh=%i,lastvv=%i,last_pagenum=%i\
,screendpi=%.1f\n",ptexp,prescan,hh,vv,pagenum,
lasthh,lastvv,last_pagenum, screendpi);
}
#endif
free(ptexp) ;
return ;
/* } end of prescan */
} else { /* tag isn't found */
id newtag;
char *tagcpy;
/*Make new tag object and insert it in*/
newtag = [[Htag new] init];
[newtag setParams:prescan :hh :vv :pagenum :lasthh :lastvv :last_pagenum
:screendpi];
[newtag setMyName:ptexp];[newtag setIsTarget:1];
tagcpy = (char *)malloc(strlen(ptexp) + 1);
strcpy(tagcpy, ptexp);
[htags insertKey:tagcpy value:newtag];
#ifdef DEBUG
if (debugon > 2 ) {
printf("Just inserted a tag %s with parameters:\n \
prescan=%i,hh=%i,vv=%i,pagenum=%i,lasthh=%i,lastvv=%i,last_pagenum=%i, \
screendpi=%.1f\n",
ptexp,prescan,hh,vv,pagenum,lasthh,lastvv,last_pagenum, screendpi);
}
#endif
free (ptexp) ;
return ;
}
}
id page;
extern int last_thing;
void
ht_register_page()
{
id htpages;
htpages = [myTeXviewSwitchBoard getCurrentHtpages] ;
last_thing = 0;
if (![htpages isKey:(void *)pagenum]) {
/*Let us add a page */
page = [HashTable alloc];
[page initKeyDesc:"*" valueDesc:"@" capacity:3];
[htpages insertKey:(void *)pagenum value:page];
}
}
void
ht_add_pt(char *pt ,int isexternal) /* Add an href */
{
char *real_name;
char *ptexp;
id obj;
int counter = 0;
id htpages;
real_name = (char *)malloc(strlen(pt) + 1);
strcpy(real_name, pt);
ptexp = (char *)malloc(strlen(pt) + 7);
strcpy(ptexp, pt);
htpages = [myTeXviewSwitchBoard getCurrentHtpages] ;
page = [htpages valueForKey:(void *)last_pagenum];
if ([page isKey:ptexp]) {
if (prescan) { /* prescan, don't care about it */
free(real_name);
free(ptexp);
return;
}
obj = (id)[page valueForKey:ptexp];
while (([obj getScreenDpi] != screendpi) || ([obj getiHH] != lasthh) ||
([obj getiVV] != lastvv)) {
counter++;
sprintf(ptexp, "%sDL%d", real_name, counter);
obj = (id)[page valueForKey:ptexp];
if (!obj)
break;
if (([obj getiHH] == 0) && ([obj getiVV] == 0)) {
break; }
}
if (obj) {
if (([obj getiHH] == 0) && ([obj getiVV] == 0)) {
[obj setParams:prescan :hh :vv :pagenum :lasthh :lastvv :last_pagenum
:screendpi];
}
} else {
id newpt;
/*Make new tag object and insert it in*/
newpt = [[Htag new] init];
[newpt setParams:prescan :hh :vv :pagenum :lasthh :lastvv :last_pagenum
: screendpi];
[newpt setMyName:real_name];[newpt setIsExternal:isexternal];
[page insertKey:ptexp value:newpt];
free(real_name);
return;
}
} else
{
id newpt;
/*Make new tag object and insert it in*/
newpt = [[Htag new] init];
[newpt setParams:prescan :hh :vv :pagenum :lasthh :lastvv :last_pagenum
:screendpi];
[newpt setMyName:real_name];[newpt setIsExternal:isexternal];
[page insertKey:ptexp value:newpt];
free(real_name);
return;
}
free(real_name);
free(ptexp);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.