-Bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
- char line[1024], label[1024], command[1024];
-
- while (! feof(file)) {
- memset(line, 0, 1024);
- memset(label, 0, 1024);
- memset(command, 0, 1024);
-
- if (fgets(line, 1024, file)) {
- if (line[0] != '#') {
- register int i, key = 0, parse = 0, index = -1,
- line_length = strlen(line),
- label_length = 0, command_length = 0;
-
- // determine the keyword
- key = 0;
- for (i = 0; i < line_length; i++) {
- if (line[i] == '[') parse = 1;
- else if (line[i] == ']') break;
- else if (line[i] != ' ')
- if (parse)
- key += tolower(line[i]);
- }
-
- // get the label enclosed in ()'s
- parse = 0;
-
- for (i = 0; i < line_length; i++) {
- if (line[i] == '(') {
- index = 0;
- parse = 1;
- } else if (line[i] == ')') break;
- else if (index++ >= 0) {
- if (line[i] == '\\' && i < line_length - 1) i++;
- label[index - 1] = line[i];
- }
- }
-
- if (parse) {
- label[index] = '\0';
- label_length = index;
- } else {
- label[0] = '\0';
- label_length = 0;
- }
-
- // get the command enclosed in {}'s
- parse = 0;
- index = -1;
- for (i = 0; i < line_length; i++) {
- if (line[i] == '{') {
- index = 0;
- parse = 1;
- } else if (line[i] == '}') break;
- else if (index++ >= 0) {
- if (line[i] == '\\' && i < line_length - 1) i++;
- command[index - 1] = line[i];
- }
- }
-
- if (parse) {
- command[index] = '\0';
- command_length = index;
- } else {
- command[0] = '\0';
- command_length = 0;
- }
-
- switch (key) {
- case 311: //end
- return ((menu->getCount() == 0) ? True : False);
-
- break;
-
- case 333: // nop
- menu->insert(label);
-
- break;
-
- case 421: // exec
- if ((! *label) && (! *command)) {
- fprintf(stderr, i18n->getMessage(ScreenSet, ScreenEXECError,
- "BScreen::parseMenuFile: [exec] error, "
- "no menu label and/or command defined\n"));
- continue;
- }
-
- menu->insert(label, BScreen::Execute, command);
-
- break;
-
- case 442: // exit
- if (! *label) {
- fprintf(stderr, i18n->getMessage(ScreenSet, ScreenEXITError,
- "BScreen::parseMenuFile: [exit] error, "
- "no menu label defined\n"));
- continue;
- }
-
- menu->insert(label, BScreen::Exit);
-
- break;
-
- case 561: // style
- {
- if ((! *label) || (! *command)) {
- fprintf(stderr, i18n->getMessage(ScreenSet, ScreenSTYLEError,
- "BScreen::parseMenuFile: [style] error, "
- "no menu label and/or filename defined\n"));
- continue;
- }
-
- char style[MAXPATHLEN];
-
- // perform shell style ~ home directory expansion
- char *homedir = 0;
- int homedir_len = 0;
- if (*command == '~' && *(command + 1) == '/') {
- homedir = getenv("HOME");
- homedir_len = strlen(homedir);
- }
-
- if (homedir && homedir_len != 0) {
- strncpy(style, homedir, homedir_len);
-
- strncpy(style + homedir_len, command + 1,
- command_length - 1);
- *(style + command_length + homedir_len - 1) = '\0';
- } else {
- strncpy(style, command, command_length);
- *(style + command_length) = '\0';
- }
-
- menu->insert(label, BScreen::SetStyle, style);
- }
-
- break;
-
- case 630: // config
- if (! *label) {
- fprintf(stderr, i18n->getMessage(ScreenSet, ScreenCONFIGError,
- "BScreen::parseMenufile: [config] error, "
- "no label defined"));
- continue;
- }
-
- menu->insert(label, configmenu);
-
- break;
-
- case 740: // include
- {
- if (! *label) {
- fprintf(stderr, i18n->getMessage(ScreenSet, ScreenINCLUDEError,
- "BScreen::parseMenuFile: [include] error, "
- "no filename defined\n"));
- continue;
- }
-
- char newfile[MAXPATHLEN];
-
- // perform shell style ~ home directory expansion
- char *homedir = 0;
- int homedir_len = 0;
- if (*label == '~' && *(label + 1) == '/') {
- homedir = getenv("HOME");
- homedir_len = strlen(homedir);
- }
-
- if (homedir && homedir_len != 0) {
- strncpy(newfile, homedir, homedir_len);
-
- strncpy(newfile + homedir_len, label + 1,
- label_length - 1);
- *(newfile + label_length + homedir_len - 1) = '\0';
- } else {
- strncpy(newfile, label, label_length);
- *(newfile + label_length) = '\0';
- }
-
- if (newfile) {
- FILE *submenufile = fopen(newfile, "r");
-
- if (submenufile) {
- struct stat buf;
- if (fstat(fileno(submenufile), &buf) ||
- (! S_ISREG(buf.st_mode))) {
- fprintf(stderr,
- i18n->getMessage(ScreenSet, ScreenINCLUDEErrorReg,
- "BScreen::parseMenuFile: [include] error: "
- "'%s' is not a regular file\n"), newfile);
- break;
- }
+ Bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
+ char line[1024], label[1024], command[1024];
+
+ while (! feof(file)) {
+ memset(line, 0, 1024);
+ memset(label, 0, 1024);
+ memset(command, 0, 1024);
+
+ if (fgets(line, 1024, file)) {
+ if (line[0] != '#') {
+ register int i, key = 0, parse = 0, index = -1,
+ line_length = strlen(line),
+ label_length = 0, command_length = 0;
+
+ // determine the keyword
+ key = 0;
+ for (i = 0; i < line_length; i++) {
+ if (line[i] == '[') parse = 1;
+ else if (line[i] == ']') break;
+ else if (line[i] != ' ')
+ if (parse)
+ key += tolower(line[i]);
+ }