void removeUserJobs(char *user, int argc, char *argv[]) /* Remove jobs associated with user. */ { struct jobInfo *jobList = getJobList(), *job; char *wildCard = NULL; if (!sameString(user, userName) && !sameString("root", userName)) errAbort("You can only remove your own jobs (unless you are root)."); if (argc > 0) wildCard = argv[0]; slReverse(&jobList); /* Improves performance to remove from tail first. */ for (job = jobList; job != NULL; job = job->next) { if (sameString(user, job->user) && (wildCard == NULL || wildMatch(wildCard, job->command))) { removeJob(job->id); } } jobInfoFreeList(&jobList); }
BTSpecialOperation *BTEditor::editSpecialOperation(BTDisplay &d, BTSpecialOperation *special) { BTDisplay::selectItem cmds[BT_SPECIALCOMMANDS + BT_CONDITIONALCOMMANDS]; for (int i = 0; i < BT_CONDITIONALCOMMANDS; ++i) { cmds[i].name = std::string("if ") + conditionalCommands[i]; cmds[i].value = i; } for (int i = 0; i < BT_SPECIALCOMMANDS; ++i) { cmds[i + BT_CONDITIONALCOMMANDS].name = specialCommands[i]; cmds[i + BT_CONDITIONALCOMMANDS].value = i + BT_CONDITIONALCOMMANDS; } std::sort(cmds, cmds + BT_SPECIALCOMMANDS + BT_CONDITIONALCOMMANDS); int start(0); int current(0); { BTSpecialConditional *specialCond = dynamic_cast<BTSpecialConditional*>(special); if (NULL != specialCond) { for (int i = 0; i < BT_SPECIALCOMMANDS + BT_CONDITIONALCOMMANDS; i++) { if (cmds[i].value == specialCond->getType()) { current = i; break; } } } BTSpecialCommand *specialCom = dynamic_cast<BTSpecialCommand*>(special); if (NULL != specialCom) { for (int i = 0; i < BT_SPECIALCOMMANDS + BT_CONDITIONALCOMMANDS; i++) { if (cmds[i].value == specialCom->getType() + BT_CONDITIONALCOMMANDS) { current = i; break; } } } } int original = current; d.addSelection(cmds, BT_SPECIALCOMMANDS + BT_CONDITIONALCOMMANDS, start, current); int key = d.process(); d.clearText(); if (key == 27) return NULL; std::string text; int number[3] = {0, 0, 0}; int count = 0; const char *cmd = NULL; if (cmds[current].value < BT_CONDITIONALCOMMANDS) { cmd = conditionalCommands[cmds[current].value]; if (original == current) { BTSpecialConditional *specialCond = dynamic_cast<BTSpecialConditional*>(special); if (NULL != specialCond) { for (int i = 0; i < specialCond->getArgumentCount(); i++) { number[i] = specialCond->getNumber(i); } text = specialCond->getText(); } } } else { cmd = specialCommands[cmds[current].value - BT_CONDITIONALCOMMANDS]; if (original == current) { BTSpecialCommand *specialCom = dynamic_cast<BTSpecialCommand*>(special); if (NULL != specialCom) { for (int i = 0; i < 3; i++) { number[i] = specialCom->getNumber(i); } text = specialCom->getText(); } } } const char *dollarSign; std::string newMap; int facingDir = -1; while (dollarSign = strchr(cmd, '$')) { switch (dollarSign[1]) { case 'S': { int len = levelMap->getNumOfSpecials(); BTDisplay::selectItem list[len]; for (int i = 0; i < len; ++i) { list[i].name = levelMap->getSpecial(i)->getName(); } int specialStart(0); d.addSelection(list, len, specialStart, number[count]); int key = d.process(); d.clearText(); if (key == 27) return NULL; count++; break; } case 'I': { BTFactory<BTItem> &itemList = getItemList(); BTDisplay::selectItem items[itemList.size()]; for (size_t i = 0; i < itemList.size(); ++i) items[i].name = itemList[i].getName(); int itemStart(0); d.addSelection(items, itemList.size(), itemStart, number[count]); int key = d.process(); d.clearText(); if (key == 27) return NULL; count++; break; } case 'A': case 'M': { BTFactory<BTMonster> &monsterList = getMonsterList(); BTDisplay::selectItem monsters[monsterList.size()]; for (size_t i = 0; i < monsterList.size(); ++i) monsters[i].name = monsterList[i].getName(); int monsterStart(0); d.addSelection(monsters, monsterList.size(), monsterStart, number[count]); int key = d.process(); d.clearText(); if (key == 27) return NULL; count++; break; } case 'X': { BTFactory<BTSpell, BTSpell1> &spellList = getSpellList(); BTDisplay::selectItem spells[spellList.size()]; for (size_t i = 0; i < spellList.size(); ++i) spells[i].name = spellList[i].getName(); int spellStart(0); d.addSelection(spells, spellList.size(), spellStart, number[count]); int key = d.process(); d.clearText(); if (key == 27) return NULL; count++; break; } case 'L': { if ((newMap.empty()) || (0 != PHYSFS_exists(newMap.c_str()))) { int origX = xPos; int origY = yPos; int origFacing = facing; bool toggle = false; if ((!newMap.empty()) && (newMap != levelMap->getFilename())) { toggleMap(); loadMap(newMap.c_str()); toggle = true; } BTDisplayConfig *oldConfig = d.getConfig(); BTDisplayConfig config; XMLSerializer parser; config.serialize(&parser); parser.parse(BTDisplay::applyDisplayDir("data/mapedit.xml").c_str(), true); d.setConfig(&config); xPos = number[count] % levelMap->getXSize(); yPos = levelMap->getYSize() - 1 - (number[count + 1] % levelMap->getYSize()); facing = number[count + 2]; p3dConfig = d.setWallGraphics(levelMap->getType()); unsigned char key = ' '; while (key != '\r') { if (levelMap->getSquare(yPos, xPos).getSpecial() > -1) d.drawLabel("main", levelMap->getSpecial(levelMap->getSquare(yPos, xPos).getSpecial())->getName()); else d.drawLabel("main", ""); d.drawView(); key = d.readChar(); switch (key) { case BTKEY_UP: if (yPos > 0) yPos--; else yPos = getYSize() - 1; break; case BTKEY_LEFT: if (xPos > 0) xPos--; else xPos = getXSize() - 1; break; case BTKEY_DOWN: if (yPos < getYSize() - 1) yPos++; else yPos = 0; break; case BTKEY_RIGHT: if (xPos < getXSize() - 1) xPos++; else xPos = 0; break; case BTKEY_PGDN: if (facing < 3) facing++; else facing = 0; break; case BTKEY_END: if (facing > 0) facing--; else facing = 3; break; default: break; } } number[count++] = xPos; number[count++] = levelMap->getYSize() - 1 - yPos; facingDir = facing; d.clearText(); d.setConfig(oldConfig); if (toggle) { toggleMap(); p3dConfig = d.setWallGraphics(levelMap->getType()); } xPos = origX; yPos = origY; facing = origFacing; break; } // Fall through to $O processing if map file does not exist. } case 'O': { std::string val; if (number[count] != 0) { char convert[30]; sprintf(convert, "%d", number[count]); val = convert; } d.addReadString("X>", 100, val); key = d.process(); d.clearText(); if (27 == key) return NULL; number[count++] = atol(val.c_str()); val = ""; if (number[count] != 0) { char convert[30]; sprintf(convert, "%d", number[count]); val = convert; } d.addReadString("Y>", 100, val); key = d.process(); d.clearText(); if (27 == key) return NULL; number[count++] = atol(val.c_str()); break; } case 'T': { BTDisplay::selectItem damage[BT_MONSTEREXTRADAMAGE]; for (int i = 0; i < BT_MONSTEREXTRADAMAGE; ++i) damage[i].name = extraDamage[i]; int damageStart(0); d.addSelection(damage, BT_MONSTEREXTRADAMAGE, damageStart, number[count]); int key = d.process(); d.clearText(); if (key == 27) return NULL; count++; break; } case 'C': { BTJobList &jobList = getJobList(); BTDisplay::selectItem jobs[jobList.size()]; for (size_t i = 0; i < jobList.size(); ++i) jobs[i].name = jobList[i]->name; int jobStart(0); d.addSelection(jobs, jobList.size(), jobStart, number[count]); int key = d.process(); d.clearText(); if (key == 27) return NULL; count++; break; } case 'R': { BTRaceList &raceList = getRaceList(); BTDisplay::selectItem races[raceList.size()]; for (size_t i = 0; i < raceList.size(); ++i) races[i].name = raceList[i]->name; int raceStart(0); d.addSelection(races, raceList.size(), raceStart, number[count]); int key = d.process(); d.clearText(); if (key == 27) return NULL; count++; break; } case 'D': { if (facingDir != -1) { number[count++] = facingDir; } else { BTDisplay::selectItem dir[BT_DIRECTIONS]; for (int i = 0; i < BT_DIRECTIONS; ++i) dir[i].name = directions[i]; int dirStart(0); d.addSelection(dir, BT_DIRECTIONS, dirStart, number[count]); int key = d.process(); d.clearText(); if (key == 27) return NULL; count++; } break; } case '#': case 'G': case 'F': case '!': case 'J': { std::string val; if (number[count] != 0) { char convert[30]; sprintf(convert, "%d", number[count]); val = convert; } d.addReadString("Number>", 100, val); key = d.process(); d.clearText(); if (27 == key) return NULL; number[count++] = atol(val.c_str()); break; } case 'P': { BTDisplayConfig *oldConfig = d.getConfig(); BTDisplayConfig config; XMLSerializer parser; config.serialize(&parser); parser.parse(BTDisplay::applyDisplayDir("data/pictureselect.xml").c_str(), true); d.setConfig(&config); d.clearText(); d.addText("Select Image"); int val(number[count]); d.addSelectImage(val); key = d.process(); d.clearText(); d.clearImage(); d.setConfig(oldConfig); if (27 == key) return NULL; number[count++] = val; break; } case 'E': { BTDisplay::selectItem effects[BT_SPELLTYPES_FULL]; for (int i = 0; i < BT_SPELLTYPES_FULL; ++i) effects[i].name = spellTypes[i]; int effectStart(0); d.addSelection(effects, BT_SPELLTYPES_FULL, effectStart, number[count]); int key = d.process(); d.clearText(); if (key == 27) return NULL; count++; break; } case 'N': { char **files = PHYSFS_enumerateFiles(""); char **i; int count(1); for (i = files; *i != NULL; i++) { if (checkSkipFiles(*i)) continue; int len = strlen(*i); if ((len > 4) && (strcmp(".MAP", (*i) + (len - 4)) == 0)) { char tmp[len + 1]; strcpy(tmp, (*i)); strcpy(tmp + len - 3, "xml"); if (0 == PHYSFS_exists(tmp)) { count++; } } else if ((len > 4) && (strcmp(".xml", (*i) + (len - 4)) == 0)) { count++; } } BTDisplay::selectItem *list = new BTDisplay::selectItem[count]; int current = 0; for (i = files; *i != NULL; i++) { if (checkSkipFiles(*i)) continue; int len = strlen(*i); if ((len > 4) && (strcmp(".MAP", (*i) + (len - 4)) == 0)) { char tmp[len + 1]; strcpy(tmp, (*i)); strcpy(tmp + len - 3, "xml"); if (0 == PHYSFS_exists(tmp)) { list[current].name = *i; current++; } } else if ((len > 4) && (strcmp(".xml", (*i) + (len - 4)) == 0)) { list[current].name = *i; current++; } } list[current].name = "<New Map>"; PHYSFS_freeList(files); int start(0); int select(0); d.clearElements(); d.addSelection(list, count, start, select); unsigned int key = d.process(); d.clearText(); if (27 == key) return NULL; else if (count - 1 != select) text = list[select].name; else { d.addReadString(">", 100, text); key = d.process(); d.clearText(); if (27 == key) return NULL; } newMap = text; break; } case 'K': { BTSkillList &skillList = getSkillList(); BTDisplay::selectItem items[skillList.size()]; for (size_t i = 0; i < skillList.size(); ++i) items[i].name = skillList[i]->name; int itemStart(0); d.addSelection(items, skillList.size(), itemStart, number[count]); int key = d.process(); d.clearText(); if (key == 27) return NULL; count++; break; } case '$': default: d.addReadString(">", 100, text); key = d.process(); d.clearText(); if (27 == key) return NULL; break; } cmd = dollarSign + 2; } if (cmds[current].value < BT_CONDITIONALCOMMANDS) { BTSpecialConditional *opNew = new BTSpecialConditional(cmds[current].value, text.c_str()); for (int i = 0; i < count; ++i) opNew->addNumber(number[i]); BTSpecialConditional *opOld = dynamic_cast<BTSpecialConditional*>(special); if (opOld) { opNew->getThenClause()->moveFrom(opOld->getThenClause()); opNew->getElseClause()->moveFrom(opOld->getElseClause()); } return opNew; } else { BTSpecialCommand *opNew = new BTSpecialCommand(cmds[current].value - BT_CONDITIONALCOMMANDS); opNew->setText(text); for (int i = 0; i < count; ++i) opNew->setNumber(i, number[i]); return opNew; } }