/* Written by Afsheen Ghorashy October 9, 2013 A large script might open hundreds of modules, some more than once. Since using the close function on a module closes all open instances of a module, such a call can be catastrophic to other parts of the script which still require the module to be open. These functions keep track of the numer of times each module is opened so that it is only truly closed when a module receives as many closeOpenModule(Module) calls as read(Module), edit(Module) or share(Module) calls. swa a, Afsheen Usage example: for m in f do { read m addOpenModule(m) for m2 in f2 do { read m2 addOpenModule(m2) closeOpenModule(m2) } closeOpenModule(m) } */ string openedModules[1000] int x = 0 for (x = 0; x < sizeof(openedModules); x++) openedModules[x] = "" void addOpenModule(Module m) { int i = 0 for (i=0; i < sizeof(openedModules); i++) { if (openedModules[i] == "-") { openedModules[i] = fullName(m) return } else if (openedModules[i] == "") { openedModules[i] = fullName(m) return } } } void closeOpenModule(Module m) { int i = 0 int count = 0 int lastPositivePos = 0 for (i=0; i < sizeof(openedModules); i++) { if (openedModules[i] == fullName(m)) { count++ lastPositivePos = i } else if (openedModules[i] == "") { break } } if (count > 0) { openedModules[lastPositivePos] = "-" if (count == 1) { close m } } }