static void pbl_parser(char *name) { FILE *fd = NULL; char *line = NULL; char *token, *saveptr1, *saveptr2; size_t len = 0; fname = name; fd = fopen(name, "r"); if (fd == NULL) { printf("Error:%s - Can't open\n", fname); exit(EXIT_FAILURE); } while ((getline(&line, &len, fd)) > 0) { lineno++; token = strtok_r(line, "\r\n", &saveptr1); /* drop all lines with zero tokens (= empty lines) */ if (token == NULL) continue; for (line = token;; line = NULL) { token = strtok_r(line, " \t", &saveptr2); if (token == NULL) break; /* Drop all text starting with '#' as comments */ if (token[0] == '#') break; check_get_hexval(token); } } if (line) free(line); fclose(fd); }
/* * this function sets the kwbimage header by- * 1. Abstracting input command line arguments data * 2. parses the kwbimage configuration file and update extebded header data * 3. calculates header, extended header and image checksums */ static void kwdimage_set_ext_header (struct kwb_header *kwbhdr, char* name) { bhr_t *mhdr = &kwbhdr->kwb_hdr; extbhr_t *exthdr = &kwbhdr->kwb_exthdr; FILE *fd = NULL; int j; char *line = NULL; char * token, *saveptr1, *saveptr2; size_t len = 0; enum kwbimage_cmd cmd; fname = name; /* set dram register offset */ exthdr->dramregsoffs = (intptr_t)&exthdr->rcfg - (intptr_t)mhdr; if ((fd = fopen (name, "r")) == 0) { printf ("Error:%s - Can't open\n", fname); exit (EXIT_FAILURE); } /* Simple kwimage.cfg file parser */ lineno=0; while ((getline (&line, &len, fd)) > 0) { lineno++; token = strtok_r (line, "\r\n", &saveptr1); /* drop all lines with zero tokens (= empty lines) */ if (token == NULL) continue; for (j = 0, cmd = CMD_INVALID, line = token; ; line = NULL) { token = strtok_r (line, " \t", &saveptr2); if (token == NULL) break; /* Drop all text starting with '#' as comments */ if (token[0] == '#') break; /* Process rest as valid config command line */ switch (j) { case CFG_COMMAND: cmd = get_table_entry_id (kwbimage_cmds, "Kwbimage command", token); if (cmd == CMD_INVALID) goto INVL_CMD; break; case CFG_DATA0: kwbimage_check_cfgdata (token, cmd, kwbhdr); break; case CFG_DATA1: if (cmd != CMD_DATA) goto INVL_CMD; if (datacmd_cnt > KWBIMAGE_MAX_CONFIG ) { printf ("Error:%s[%d] - Found more " "than max(%zd) allowed " "data configurations\n", fname, lineno, KWBIMAGE_MAX_CONFIG); exit (EXIT_FAILURE); } else{ exthdr->rcfg[datacmd_cnt].rdata = check_get_hexval (token); datacmd_cnt++; } break; default: goto INVL_CMD; } j++; } } if (line) free (line); fclose (fd); return; /* * Invalid Command error reporring * * command CMD_DATA needs three strings on a line * whereas other commands need only two. * * if more than two/three (as per command type) are observed, * then error will be reported */ INVL_CMD: printf ("Error:%s[%d] - Invalid command\n", fname, lineno); exit (EXIT_FAILURE); }
static void kwbimage_check_cfgdata (char *token, enum kwbimage_cmd cmdsw, struct kwb_header *kwbhdr) { bhr_t *mhdr = &kwbhdr->kwb_hdr; extbhr_t *exthdr = &kwbhdr->kwb_exthdr; int i; switch (cmdsw) { case CMD_BOOT_FROM: i = get_table_entry_id (kwbimage_bootops, "Kwbimage boot option", token); if (i < 0) goto INVL_DATA; mhdr->blockid = i; printf ("Preparing kirkwood boot image to boot " "from %s\n", token); break; case CMD_NAND_ECC_MODE: i = get_table_entry_id (kwbimage_eccmodes, "NAND ecc mode", token); if (i < 0) goto INVL_DATA; mhdr->nandeccmode = i; printf ("Nand ECC mode = %s\n", token); break; case CMD_NAND_PAGE_SIZE: mhdr->nandpagesize = (uint16_t) check_get_hexval (token); printf ("Nand page size = 0x%x\n", mhdr->nandpagesize); break; case CMD_SATA_PIO_MODE: mhdr->satapiomode = (uint8_t) check_get_hexval (token); printf ("Sata PIO mode = 0x%x\n", mhdr->satapiomode); break; case CMD_DDR_INIT_DELAY: mhdr->ddrinitdelay = (uint16_t) check_get_hexval (token); printf ("DDR init delay = %d msec\n", mhdr->ddrinitdelay); break; case CMD_DATA: exthdr->rcfg[datacmd_cnt].raddr = check_get_hexval (token); break; case CMD_INVALID: goto INVL_DATA; default: goto INVL_DATA; } return; INVL_DATA: printf ("Error:%s[%d] - Invalid data\n", fname, lineno); exit (EXIT_FAILURE); }