/* (Previously) The main routine called from Haskell. It gathers * all information about identifiers from the file and pretty-prints * the data in columns. */ void observableInfo (int width) { int err; if (!Globals) { fprintf(stdout,"Searching...\n"); q_position = 0x10; fseek(HatFileSeq,q_position,SEEK_SET); map1 = FM_new((FMComparison)fileoffset_compare,0); map2 = FM_new((FMComparison)fileoffset_compare,0); do { q_oneNode(); } while (!feof(HatFileSeq)); globals = FM_new((FMComparison)strcmp,0); locals = FM_new((FMComparison)strcmp,0); constrs = FM_new((FMComparison)strcmp,0); FM_traverse(map1,(FMTraversal)item_sort,InOrder); FM_traverse(globals,(FMTraversal)item_print,InOrder); fprintf(stdout,"[A[K"); /* cursor up and clear-to-eol */ } columnate(width); /* note: some data-structure clean-up needed? */ }
void threadmain(int argc, char *argv[]) { int i; int lineset; int ifd; lineset = 0; Binit(&bout, 1, OWRITE); while(argc > 1 && argv[1][0] == '-'){ --argc; argv++; switch(argv[0][1]){ case '\0': colonflag = 1; break; case 't': tabflag = 0; break; default: linewidth = atoi(&argv[0][1]); if(linewidth <= 1) linewidth = WIDTH; lineset = 1; break; } } if(lineset == 0) getwidth(); cbuf = cbufp = malloc(ALLOC_QUANTA*(sizeof *cbuf)); word = malloc(WORD_ALLOC_QUANTA*(sizeof *word)); if(word == 0 || cbuf == 0) error("out of memory"); if(argc == 1) readbuf(0); else{ for(i = 1; i < argc; i++){ if((ifd = open(*++argv, OREAD)) == -1) fprint(2, "mc: can't open %s (%r)\n", *argv); else{ readbuf(ifd); Bflush(&bin); close(ifd); } } } columnate(); Bflush(&bout); threadexitsall(0); }
void readbuf(int fd) { int lastwascolon = 0; long c; int linesiz = 0; Binit(&bin, fd, OREAD); do{ if(nchars++ >= nalloc) morechars(); *cbufp++ = c = Bgetrune(&bin); linesiz++; if(c == '\t') { cbufp[-1] = L' '; while(linesiz%TAB != 0) { if(nchars++ >= nalloc) morechars(); *cbufp++ = L' '; linesiz++; } } if(colonflag && c == ':') lastwascolon++; else if(lastwascolon){ if(c == '\n'){ --nchars; /* skip newline */ *cbufp = L'\0'; while(nchars > 0 && cbuf[--nchars] != '\n') ; if(nchars) nchars++; columnate(); if (nchars) Bputc(&bout, '\n'); Bprint(&bout, "%S", cbuf+nchars); nchars = 0; cbufp = cbuf; } lastwascolon = 0; } if(c == '\n') linesiz = 0; }while(c >= 0); }