Annotation of researchv9/jtools/src/pi/srctext.c, revision 1.1

1.1     ! root        1: #include "symbol.h"
        !             2: #include "srctext.pri"
        !             3: #include "core.pub"
        !             4: #include "symtab.pub"
        !             5: #include "process.pub"
        !             6: #include "bpts.pub"
        !             7: #include "expr.pub"
        !             8: #include "format.pub"
        !             9: #include "frame.pri"
        !            10: #include <CC/sys/types.h>
        !            11: #include <CC/sys/stat.h>
        !            12: #include <sys/dir.h>
        !            13: SRCFILE("srctext.c")
        !            14: 
        !            15: SrcText::SrcText(Source *s, long c)
        !            16: {
        !            17:        trace( "%d.SrcText(%d,%d)", this, s, c ); VOK;
        !            18:        source = s;
        !            19:        compiletime = c;
        !            20:        path = source->_text;
        !            21:        prevpat = "<no pattern>";
        !            22: }
        !            23: 
        !            24: Core *SrcText::core() { return source->symtab->core(); }
        !            25: 
        !            26: Process *SrcText::process() { return core()->process(); }
        !            27: 
        !            28: void DoNothing(){}
        !            29: 
        !            30: void SrcText::promote()
        !            31: {
        !            32:        Menu m;
        !            33:        trace( "%d.promote()", this ); VOK;
        !            34:        if( promoted ){
        !            35:                process()->openglobals();
        !            36:                return;
        !            37:        }
        !            38:        Var *v;
        !            39:        BlkVars bv(source->blk);
        !            40:        int limit = 25;
        !            41:        while( limit-->0 && (v = bv.gen()) )
        !            42:                m.sort(sf("%s\240Sta",v->_text), (Action)&Frame::pickvar, (long)v);
        !            43:        char *t = sf("\276 %s", basename(source->text()));
        !            44:        m.first( t, (Action)&DoNothing );
        !            45:        process()->openglobals(&m);
        !            46:        promoted = 1;
        !            47: }
        !            48:        
        !            49: char *SrcText::read(Menu &m)
        !            50: {
        !            51:        Func *fun;
        !            52:        register int l;
        !            53:        struct stat fdstat;
        !            54:        register char *p;
        !            55:        Menu sub;
        !            56: 
        !            57:        trace("%d.read(%d) path=%s", this, m, path);    OK("SrcText::read");
        !            58:        if( edge ) return 0;
        !            59:        if( fstat(fd, &fdstat) )
        !            60:                return SysErr("cannot stat");
        !            61:        if( fdstat.st_size == 0 )
        !            62:                return "null file";
        !            63:        if( !compiletime ) compiletime = source->symtab->modtime();
        !            64:        if( modified(fd) > compiletime && !warned ){
        !            65:                ++warned;
        !            66:                trace( "%d>%d", modified(fd), compiletime );
        !            67:                return sf("modified since compilation at %24s",ctime(&compiletime));
        !            68:        }
        !            69:        warned = 0;
        !            70:        fun = (Func*)source->child;
        !            71:        long n = 0;
        !            72:        while( fun  ){
        !            73:                Bls toc;
        !            74:                if( lastline < fun->lines.hi ) lastline = fun->lines.hi;
        !            75:                if( strlen(fun->text())<=32 && fun->lines.lo>0  ){
        !            76:                        toc.af( "%s\256%d", fun->text(), fun->lines.lo );
        !            77:                        sub.sort( toc.text, (Action) &SrcText::select, fun->lines.lo );
        !            78:                        ++n;
        !            79:                }
        !            80:                fun = (Func*)fun->rsib;
        !            81:        }
        !            82:        if( lastline <= 0 )
        !            83:                return "not referenced by symbol table (cc -g?)";
        !            84:        m.last(sub.index(n>4 ? "index by fcn " : 0));
        !            85:        edge = new char*[lastline+1];
        !            86:        body = new char[fdstat.st_size];
        !            87:        if( !ReadOK( fd, body, fdstat.st_size ) )
        !            88:                return SysErr( "read error" );
        !            89:        l = 1;
        !            90:        p = body;
        !            91:        while( l <= lastline && *p ){           /* should check p stays in body */
        !            92:                edge[l++] = p;
        !            93:                while( *p && *p != '\n' ) ++p;
        !            94:                *p++ = '\0';
        !            95:                trace( "%d %s", l-1, edge[l-1] );
        !            96:        }
        !            97:        pad->lines(l-1);
        !            98:        return 0;
        !            99: }
        !           100: 
        !           101: void SrcText::open()
        !           102: {
        !           103:        Menu m;
        !           104:        char *error = 0;
        !           105:        struct stat stbuf;
        !           106: 
        !           107:        trace( "%d.open() path=%s", this, path );       VOK;
        !           108:        if( pad && edge ){
        !           109:                pad->makecurrent();
        !           110:                return;
        !           111:        }
        !           112:        if( !pad ) pad = new Pad( (PadRcv*) this );
        !           113:        pad->options( TRUNCATE );
        !           114:        pad->banner( "Source Text: %s", process()->prefix(path) );
        !           115:        pad->name( basename(path) );
        !           116:        pad->tabs(4);
        !           117:        pad->error(0);
        !           118:        if( !edge ){
        !           119:                pad->menu( ZIndex );
        !           120:                pad->lines(0);
        !           121:                if( (fd = ::open(process()->prefix(path),0)) < 0 )
        !           122:                        error=  SysErr( "cannot open:" );
        !           123:                if( !error ){
        !           124:                        if( ::fstat( fd, &stbuf ) )
        !           125:                                error = "cannot stat"; 
        !           126:                        else if( (stbuf.st_mode&S_IFMT) == S_IFDIR )
        !           127:                                error = "is a directory";
        !           128:                }
        !           129:                if( !error ) error = read(m);
        !           130:                if( fd >= 0 ) close(fd);
        !           131:                if( !error ){
        !           132:                        if( core()->online() ){
        !           133:                                Action a = (Action)&SrcText::stmtstep;
        !           134:                                Menu sub;
        !           135:                                for( long i = 5; i <= 50; i += 5 )
        !           136:                                        sub.last(sf("step %3d stmts",i), a, i);
        !           137:                                sub.last("step 100 stmts", a, 100);
        !           138:                                sub.last("step 500 stmts", a, 500);
        !           139:                                m.first("step into fcn", (Action)&SrcText::stepinto   );
        !           140:                                m.first(sub.index("step >4 stmts"));
        !           141:                                m.first("step 4 stmts ",  a, 4);
        !           142:                                m.first("step 3 stmts ",  a, 3);
        !           143:                                m.first("step 2 stmts ",  a, 2);
        !           144:                                m.first("step 1 stmt  ",  a, 1);
        !           145:                        }
        !           146:                        m.first( "current stmt",  (Action)&SrcText::currentstmt );
        !           147:                        if( core()->online() )
        !           148:                                m.first( "run",           (Action)&SrcText::go          );
        !           149:                }
        !           150:        }
        !           151:        m.first( sf( "reopen %s",basename(path)) ,(Action)&SrcText::reopen );
        !           152:        pad->menu(m);
        !           153:        pad->error( error );
        !           154:        pad->makecurrent();
        !           155: }
        !           156: 
        !           157: void SrcText::reopen()
        !           158: {
        !           159:        trace( "%d.reopen()", this );   VOK;
        !           160:        free();
        !           161:        open();
        !           162: }
        !           163: 
        !           164: void SrcText::free()
        !           165: {
        !           166:        trace( "%d.free()", this );     VOK;
        !           167:        if( edge ) { delete edge; edge = 0; }
        !           168:        if( body ) { delete body; body = 0; }
        !           169: }
        !           170: 
        !           171: void SrcText::userclose()
        !           172: {
        !           173:        trace( "%d.userclose()", this );        VOK;
        !           174:        free();
        !           175:        if( pad ){
        !           176:                delete pad;
        !           177:                pad = 0;
        !           178:        }
        !           179: }
        !           180: 
        !           181: #define NONBPT 0
        !           182: #define SETBPT 1
        !           183: #define SETCLR 2
        !           184: #define CLRBPT 3
        !           185: 
        !           186: void SrcText::linereq(long i, Attrib a)        /* profile hot spot ... */
        !           187: {
        !           188:        Stmt *stmt = 0;
        !           189:        Bls t;
        !           190:        static Index *ix;
        !           191:        int bpty;
        !           192: 
        !           193:        trace( "%d.linereq(%d,0x%X)", this, i, a ); VOK;
        !           194:        if (!ix) {
        !           195:                ix = new Index[4];
        !           196:                for(int i = 0; i < 4; i++)
        !           197:                        ix[i] = Index(0,0);
        !           198:        }
        !           199:        if( ix[0].null() ){             /* ... that's better */
        !           200:                Menu m[4];
        !           201:                for( bpty = NONBPT; bpty <= CLRBPT; ++bpty ){
        !           202:                      m[bpty].last( "assembler",   (Action) &Stmt::asmblr    );
        !           203:                      m[bpty].last( "open frame",  (Action) &Stmt::openframe );
        !           204:                }
        !           205:                m[SETBPT].first( "cond bpt",    (Action) &Stmt::conditional, (long)Q_BPT);
        !           206:                m[SETBPT].first( "trace on",    (Action) &Stmt::settrace );
        !           207:                m[SETBPT].first( "set  bpt",    (Action) &Stmt::dobpt, 1 );
        !           208: 
        !           209:                m[SETCLR].first( "trace on",    (Action) &Stmt::settrace );
        !           210:                m[SETCLR].first( "set   bpt",   (Action) &Stmt::dobpt, 1 );
        !           211:                m[SETCLR].first( "clear bpt",   (Action) &Stmt::dobpt, 0 );
        !           212: 
        !           213:                m[CLRBPT].first( "clear bpt",   (Action) &Stmt::dobpt, 0 );
        !           214:                for( bpty = NONBPT; bpty <= CLRBPT; ++bpty )
        !           215:                        ix[bpty] = m[bpty].index();
        !           216:        }
        !           217:        if( !edge ) open();
        !           218:        if( !edge ) return;
        !           219:        if( i<1 || i>lastline ) return;
        !           220:        bpty = NONBPT;
        !           221:        stmt = source->stmtafter(i);
        !           222:        if( stmt && core()->online() ){
        !           223:                if( !process()->bpts()->isbpt(stmt) ){
        !           224:                        bpty = SETBPT;
        !           225:                        if( stmt->lineno==i && stmt->condition==Q_BPT ){
        !           226:                                bpty = SETCLR;
        !           227:                                t.af( "if( ? ) >>>" );
        !           228:                        }
        !           229:                } else {
        !           230:                        bpty = CLRBPT;
        !           231:                        if( stmt->lineno == i ){
        !           232:                                if( stmt->condition )
        !           233:                                        t.af("if(%s)", stmt->condtext->text);
        !           234:                                t.af( ">>>" );
        !           235:                        }
        !           236:                }
        !           237:        }
        !           238:        t.af("%s", edge[i] ? edge[i] : "");
        !           239:        pad->insert(i, (Attrib)a|ACCEPT_KBD, (PadRcv*)stmt, ix[bpty], "%s", t.text);
        !           240: }
        !           241: 
        !           242: char *SrcText::srcline(long i)
        !           243: {
        !           244:        trace( "%d.srcline(%d)", this, i ); OK("SrcText::srcline");
        !           245:        if( !edge || i<1 || i>lastline ) return "";
        !           246:        return edge[i];
        !           247: }
        !           248: 
        !           249: void SrcText::select(long i, long svp)
        !           250: {
        !           251:        trace( "%d.select(%d,%d)", this, i, svp ); VOK;
        !           252:        if( svp!=SVP || edge ) linereq(i, SELECTLINE);
        !           253: }
        !           254: 
        !           255: void SrcText::go()
        !           256: {
        !           257:        trace( "%d.go()", this ); VOK;
        !           258:        process()->go();
        !           259: }
        !           260: 
        !           261: void SrcText::currentstmt()
        !           262: {
        !           263:        trace( "%d.currentstmt()", this ); VOK;
        !           264:        core()->process()->currentstmt();
        !           265: }
        !           266: 
        !           267: void SrcText::stmtstep(long i)
        !           268: {
        !           269:        trace( "%d.stmtstep()", this ); VOK;
        !           270:        process()->stmtstep(i);
        !           271: }
        !           272: 
        !           273: void SrcText::stepinto()
        !           274: {
        !           275:        trace( "%d.stepinto()", this ); VOK;
        !           276:        process()->stepinto();
        !           277: }
        !           278: 
        !           279: char *SrcText::kbd(char *s)
        !           280: {
        !           281:        trace( "%d.kbd(%s)", this, s );         OK("kbd");
        !           282:        if( edge ){
        !           283:                if( *s == '/' )
        !           284:                        return contextsearch( lastline, s+1, 1 );
        !           285:                else if( *s == '?' )
        !           286:                        return contextsearch( 1, s+1, -1 );
        !           287:                else if( alldigits(s) )
        !           288:                        select( atoi(s) );
        !           289:                else
        !           290:                        return help();
        !           291:        } else {
        !           292:                path = sf("%s",s);
        !           293:                reopen();
        !           294:        }
        !           295:        return 0;
        !           296: }
        !           297: 
        !           298: char *SrcText::help()
        !           299: {
        !           300:        trace( "%d.help()", this );             OK("SrcText::help");
        !           301:        return edge ? "<line number> {display line} | [/?]<string> {search}"
        !           302:                    : "<path> {change source file name}";
        !           303: }
        !           304: 
        !           305: char *SrcText::contextsearch(int from, char *pat, int dir)
        !           306: {
        !           307:        trace( "%d.contextsearch(%d,%s,%d)", this, from, pat?pat:"", dir );
        !           308:        OK("contextsearch");
        !           309:        if( !pat || !*pat || !strcmp(pat,"?") || !strcmp(pat,"/") )
        !           310:                pat = prevpat;
        !           311:        prevpat = sf("%s", pat);
        !           312:        int patlen = strlen(pat);
        !           313:        register char pat0 = *pat;
        !           314:        for( int probe = from+dir; probe != from; probe += dir ){
        !           315:                if( probe == 0 ) probe = lastline;
        !           316:                if( probe == lastline+1 ) probe = 1;
        !           317:                register char *p;
        !           318:                for( p = edge[probe]; *p; ++p ){
        !           319:                        if( *p == pat0 && !strncmp(p, pat, patlen) ){
        !           320:                                linereq(probe, SELECTLINE);
        !           321:                                return 0;
        !           322:                        }
        !           323:                }
        !           324:        }
        !           325:        return sf("%s: not found", pat);
        !           326: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.