void zCmdParseCommandLine( int argc, char **argv, ZHashTable &hash ) { int nonOptionArgCount=0; for( int i=0; i<argc; i++ ) { if( argv[i][0] == '-' ) { // Does the option have a value assignment? char *valPtr = 0; for( int j=0; argv[i][j]; j++ ) { if( argv[i][j] == '=' ) { valPtr = &argv[i][j+1]; argv[i][j] = 0; break; } } hash.putS( argv[i], valPtr ? valPtr : (char *)"*novalue*" ); int len = strlen( argv[i] ); char *indexKey = new char[len + 16]; strcpy( indexKey, argv[i] ); strcat( indexKey, "-index" ); hash.putI( indexKey, i ); } else { char key[32]; sprintf( key, "nonOptionArg%d", nonOptionArgCount++ ); hash.putS( key, argv[i] ); } } }
void startup() { // get the compartments definition from the .cfg file, // we expect it to be a series of halftime:maxLoad pairs // separated by commas (e.g. 120:90,60:80,45:50 etc) char *compartDef = options.getS( "compartments" ); if( !compartDef ) { compartDef = "120:90,60:80,45:50,30:30,20:20,15:15,10:10"; trace( "no comparments defined; using builtin values.\n" ); } trace( "compartments set to: %s\n", compartDef ); char *tok = strtok( compartDef, "," ); while( tok ) { int htime; double maxload; sscanf( tok, "%d:%lf", &htime, &maxload ); //maxload *= 3.2808399; // convert meters to feet //maxload /= 10.0; // convert meters of seawater to bars Compartment *c = new Compartment( htime, maxload ); compartments.add( c ); trace( "New compartment added: time %d minutes, maxload %g fsw\n", htime, maxload ); tok = strtok( NULL, "," ); } zglFontLoad( "verdana60", zlabCorePath( "verdana.ttf" ), 60 ); /* ZUI *zui = ZUI::factory( 0, "ZUIVar" ); zui->putS( "text", "Depth" ); zui->putS( "val", "1.0" ); ZUI *plug = ZUI::zuiFindByName( "pluginPanel" ); if( plug ) { zui->attachTo( plug ); } */ }
int main() { char *test1[] = { "A bunch of,stuff,divided by,commas", "A line with no commas", "A line with one field and an empty trailing field,", ",A line with trailing field", ",,A,B", ",,,", ",", "", NULL }; int test1Lens[] = { 4, 1, 2, 2, 4, 4, 2, 1, 1 }; char *test2[] = { "This is a test", "This is a test", "This is a test ", " ", "", NULL, }; for( int i=0; i<sizeof(test1)/sizeof(test1[0]); i++ ) { ZStr *z = zStrSplit( ",", test1[i] ); assert( zStrCount( z ) == test1Lens[i] ); char *join = zStrJoin(",",z); assert( !test1[i] || !strcmp( join, test1[i] ) ); } for( i=0; i<sizeof(test2)/sizeof(test2[0]); i++ ) { ZStr *z = zStrSplit( " +", test2[i] ); switch( i ) { case 0: case 1: assert( z && !strcmp( *z, "This" ) ); z=z->next; assert( z && !strcmp( *z, "is" ) ); z=z->next; assert( z && !strcmp( *z, "a" ) ); z=z->next; assert( z && !strcmp( *z, "test" ) ); z=z->next; assert( !z ); break; case 2: assert( z && !strcmp( *z, "This" ) ); z=z->next; assert( z && !strcmp( *z, "is" ) ); z=z->next; assert( z && !strcmp( *z, "a" ) ); z=z->next; assert( z && !strcmp( *z, "test" ) ); z=z->next; assert( z && !strcmp( *z, "" ) ); z=z->next; assert( !z ); break; case 3: assert( z && !strcmp( *z, "" ) ); z=z->next; assert( z && !strcmp( *z, "" ) ); z=z->next; assert( !z ); break; case 4: case 5: assert( z && !strcmp( *z, "" ) ); z=z->next; assert( !z ); break; } } char *test3[] = { "key1=val1 key2=val2", "key1=val1", "", "=", "key1", "key1='val1'", "key1='val1' key2='val2' key3 = 'val3'", "key1='val1' key2=\"val2\" key3 = \"val3\"", "'key1'=val1 \"key2\"=\"val2\" key3 = \"val3\"", }; for( i=0; i<sizeof(test3)/sizeof(test3[0]); i++ ) { ZHashTable hash; zStrHashSplit( test3[i], &hash ); char *v1 = hash.get( "key1" ); char *v2 = hash.get( "key2" ); char *v3 = hash.get( "key3" ); char *_v1, *_v2, *_v3; switch( i ) { case 0: _v1="val1"; _v2="val2"; _v3=""; break; case 1: _v1="val1"; _v2=""; _v3=""; break; case 2: _v1=""; _v2=""; _v3=""; break; case 3: _v1=""; _v2=""; _v3=""; break; case 4: _v1=""; _v2=""; _v3=""; break; case 5: _v1="val1"; _v2=""; _v3=""; break; case 6: _v1="val1"; _v2="val2"; _v3="val3"; break; case 7: _v1="val1"; _v2="val2"; _v3="val3"; break; case 8: _v1="val1"; _v2="val2"; _v3="val3"; break; } assert( (!v1 || !strcmp(v1,_v1)) && (!v2 || !strcmp(v2,_v2)) && (!v3 || !strcmp(v3,_v3)) ); } return 0; }
int main( int argc, char **argv ) { ZHashTable options; //ZHashTable test; //test.putS( "type", "Login" ); //zHashTablePack( test ); // LOAD options zConfigLoadFile( "diwos.cfg", options ); zCmdParseCommandLine( argc, argv, options ); // cmdline may override .cfg files loadAll(); int listenPort = options.getI("--port",59997); if( listenPort ) { trace( "Server listening on port: %d\n", listenPort ); ZMsgZocket test; // OPEN the listening zocket ZMsgZocket *server = new ZMsgZocket( ZTmpStr("tcp://*:%d", listenPort), ZO_LISTENING ); assert( server && server->isOpen() ); } zMsgSetHandler( "default", ZMsgZocket::dispatch ); int cmdLen = 0; char cmd[1024] = {0,}; zconsoleCharMode(); while( 1 ) { zMsgDispatch(); ZMsgZocket::wait( 1000, 1 ); ZMsgZocket::readList(); update(); if( zconsoleKbhit() ) { char c = zconsoleGetch(); if( cmdLen < sizeof(cmd)-1 ) { if( c == '\r' || c == '\n' ) { cmdLen = 0; ZMsg *z = new ZMsg; z->putS( "type", "Command" ); z->putS( "cmd", cmd ); zMsgQueue( z ); printf( "\n" ); } else { cmd[cmdLen++] = c; cmd[cmdLen] = 0; } } } } return 0; }
void GUIAttrEdit::render() { GUIPanel::render(); float lineH = getLineH(); int scroll = getAttrI( "scroll" ); glDisable( GL_BLEND ); float y = myH - lineH; for( int extra=scroll; extra<0; extra++ ) { y -= lineH; if( y < 0 ) break; } int textColor = getAttrI( "textColor" ); int selectedTextColor = getAttrI( "selectedTextColor" ); int highlightedTextColor = getAttrI( "highlightedTextColor" ); ZHashTable *hash = (ZHashTable *)attributeTable->getp( "hashPtr" ); if( !hash ) return; for( int i=0; i<view.count; i++ ) { int highlighted = (i == mouseOver && mouseWasInside); if( i == selected ) { setColorI( selectedTextColor ); } else if( highlighted ) { setColorI( highlightedTextColor ); } else { setColorI( textColor ); } if( i >= scroll ) { char buf[1024]; char *val = hash->getS( view[i] ); sprintf( buf, "%s = %s", view[i], val ); print( buf, 12, y ); y -= lineH; } if( y <= 0 ) { break; } } if( !optMenuUp && selected != -1 ) { glDisable( GL_LINE_SMOOTH ); glLineWidth( 1.f ); glColor3ub( 0xff, 0, 0 ); glBegin( GL_LINES ); glVertex2f( selectX, selectY ); glVertex2f( selectX, mouseY ); float sign = mouseY > selectY ? -1.f : 1.f; glVertex2f( selectX, mouseY ); glVertex2f( selectX-5, mouseY + sign*5 ); glVertex2f( selectX, mouseY ); glVertex2f( selectX+5, mouseY + sign*5 ); glEnd(); } }
void GUIAttrEdit::handleMsg( ZMsg *msg ) { float lineH = getLineH(); int scroll = getAttrI( "scroll" ); float x = zmsgF(localX); float y = zmsgF(localY); if( zmsgIs(type,Key) && zmsgIs(which,wheelforward) ) { if( contains(x,y) ) { scroll-=2; scroll = max( -10, scroll ); scroll = min( view.count-5, scroll ); setAttrI( "scroll", scroll ); mouseOver = (int)( (myH-y) / lineH ); mouseOver += scroll; mouseOver = selected > view.count-1 ? view.count-1 : mouseOver; zMsgUsed(); } } else if( zmsgIs(type,Key) && zmsgIs(which,wheelbackward) ) { if( contains(x,y) ) { scroll+=2; scroll = max( -10, scroll ); scroll = min( view.count-5, scroll ); setAttrI( "scroll", scroll ); mouseOver = (int)( (myH-y) / lineH ); mouseOver += scroll; mouseOver = selected > view.count-1 ? view.count-1 : mouseOver; zMsgUsed(); } } else if( zmsgIs(type,MouseMove) ) { mouseOver = (int)( (myH-y) / lineH ); mouseOver += scroll; mouseOver = selected > view.count-1 ? view.count-1 : mouseOver; } else if( zmsgIs(type,MouseClickOn) && zmsgIs(dir,D) && zmsgI(ctrl) && zmsgI(shift) ) { //ADJUST the linIncrement if( zmsgIs(which,L) ) { linIncrement *= 2.f; } else if( zmsgIs(which,R) ) { linIncrement /= 2.f; } } else if( zmsgIs(type,MouseClickOn) && zmsgIs(dir,D) && zmsgIs(which,L) ) { selected = (int)( (myH-y) / lineH ); selected += scroll; selected = selected > view.count-1 ? view.count-1 : selected; ZHashTable *hash = (ZHashTable *)getAttrp( "hashPtr" ); if( !hash ) return; char *val = hash->getS( view[selected] ); char *end; double valD = strtod( val, &end ); if( end != val ) { // This is a number that can be manipulated // if( zmsgI(shift) && !zmsgI(ctrl) ) { // linMode = 0; // zMsgQueue( "type=GUIAttrEdit_CreateOptionMenu key=%s val=%lf toGUI=%s", selectVarPtr->name, selectVarPtr->getDouble(), getAttrS("name") ); // } // else { if( zmsgI(ctrl) && !zmsgI(shift) ) { linMode = 1; } else { linMode = 0; } selectX = x; selectY = y; mouseX = x; mouseY = y; startVal = valD; requestExclusiveMouse( 1, 1 ); // } } else { selected = -1; } /* ZVarPtr *selectVarPtr = getSelectedVar( selected ); if( selectVarPtr ) { if( zmsgI(shift) && !zmsgI(ctrl) ) { linMode = 0; zMsgQueue( "type=GUIAttrEdit_CreateOptionMenu key=%s val=%lf toGUI=%s", selectVarPtr->name, selectVarPtr->getDouble(), getAttrS("name") ); } else { if( zmsgI(ctrl) && !zmsgI(shift) ) { linMode = 1; } else { linMode = 0; } selectX = x; selectY = y; mouseX = x; mouseY = y; switch( selectVarPtr->type ) { case zVarTypeINT: startVal = (double)*(int *)selectVarPtr->ptr + 0.4; break; case zVarTypeSHORT: startVal = (double)*(short *)selectVarPtr->ptr + 0.4; break; case zVarTypeFLOAT: startVal = (double)*(float *)selectVarPtr->ptr; break; case zVarTypeDOUBLE: startVal = (double)*(double *)selectVarPtr->ptr; break; } requestExclusiveMouse( 1, 1 ); } } */ zMsgUsed(); return; } else if( zmsgIs(type,MouseReleaseDrag) ) { if( selected >= 0 ) { // ZVarPtr *selectVarPtr = getSelectedVar( selected ); // if( selectVarPtr ) { // zMsgQueue( "type=GUIAttrEdit_VarDoneChange key=%s val=%lf", selectVarPtr->name, selectVarPtr->getDouble() ); // } } requestExclusiveMouse( 1, 0 ); selected = -1; zMsgUsed(); return; } else if( zmsgIs(type,MouseDrag) && zmsgI(l) ) { int last = -1; int count = 0; //while( count++ != selected+1 && zVarsEnum( last, selectVarPtr, regExp ) ); ZHashTable *hash = (ZHashTable *)getAttrp( "hashPtr" ); double val = hash->getD( view[selected] ); mouseX = x; mouseY = y; if( linMode ) { val = startVal + (mouseY-selectY) * linIncrement; } else{ val = startVal * exp( (mouseY-selectY) / 50.0 ); } hash->putS( view[selected], ZTmpStr("%4.3le",val) ); } else if( zmsgIs(type,MouseClickOn) && zmsgIs(dir,D) && zmsgIs(which,R) ) { selectX = x; selectY = y; startScroll = scroll; requestExclusiveMouse( 1, 1 ); zMsgUsed(); return; } else if( zmsgIs(type,MouseDrag) && zmsgI(r) ) { scroll = (int)( startScroll + ( y - selectY ) / lineH ); scroll = max( -10, scroll ); scroll = min( view.count-5, scroll ); setAttrI( "scroll", scroll ); } else if( zmsgIs(type,GUIAttrEdit_Clear) ) { clearView(); } // else if( zmsgIs(type,GUIAttrEdit_Add) ) { // if( zmsgHas(regexp) ) { // addVarsByRegExp( zmsgS(regexp) ); // } // else if( zmsgHas(name) ) { // addVar( zmsgS(name) ); // } // } else if( zmsgIs(type,GUIAttrEdit_Sort) ) { if( zmsgIs(which,name) ) { sortViewByName(); } // else if( zmsgIs(which,order) ) { // sortViewByDeclOrder(); // } } else if( zmsgIs(type,GUIAttrEdit_CreateOptionMenu) ) { ZHashTable hash; hash.putS( "who", getAttrS("name") ); hash.putS( "key", zmsgS(key) ); hash.putS( "val", ZTmpStr("%1.2e", zmsgF(val)) ); createOptionMenu( &hash ); optMenuUp = 1; zMsgQueue( "type=GUILayout toGUI=varEditOptMenu" ); zMsgQueue( "type=GUIMoveNear who=%s where=T x=4 y=%f toGUI=varEditOptMenu", getAttrS("name"), -(mouseOver-scroll)*lineH ); zMsgQueue( "type=GUISetModal val=1 toGUI=varEditOptMenu" ); } else if( zmsgIs(type,GUIAttrEdit_CreateOptionMenuDone) ) { optMenuUp = 0; selected = -1; } else if( zmsgIs(type,GUIAttrEdit_CreateOptionMenuDirectEntry) ) { GUIObject *obj = guiFind( zmsgS(fromGUI) ); if( obj ) { zMsgQueue( "type=SetVar key=%s val=%f", zmsgS(key), atof(obj->getAttrS("text")) ); } } // else if( zmsgIs(type,GUIAttrEdit_ResetAll) ) { // for( int i=0; i<view.count; i++ ) { // ZVarPtr *v = zVarsLookup( varsView.vec[i] ); // v->resetDefault(); // } // } else if( zmsgIs(type,GUIAttrEdit_Clear) ) { clearView(); } else if( zmsgIs(type,GUIAttrEdit_Add) ) { addVar( zmsgS(key) ); } else if( zmsgIs(type,GUIAttrEdit_ViewAll) ) { if( zmsgI(clear) ) { clearView(); } addAllVars(); } GUIPanel::handleMsg( msg ); }