main(int argc, char **argv) { int i; char name[1024]; char rsrc[5]="NFNT"; char s[5]; char *p; unsigned short n; int rsrconly=0; FILE *in,*out; unsigned long dforklen,rforklen,pos; if(argc!=2 && argc!=3) err("getmacfont filename [RSRC]\n" " This extracts all the bitmapped font (NFNT) resources\n" " from the specified MacBinary encoded file.\n" " You can also use it to extract any other type of resource\n" " by supplying the resource type on the commandline,\n" " for instance: getmacfont input.bin FOND.\n" " Each resource found gets saved into a separate file with\n" " filename ending in .data.\n"); strcpy(name,argv[1]); if(strlen(argv[1])>5 && !strcmp(argv[1]+strlen(argv[1])-5,".rsrc")) rsrconly=1; if(argc==3) { if(strlen(argv[2])!=4) err("Resource name should be four characters.\n"); strcpy(rsrc,argv[2]); } in=myfopen(name,"rb"); strcpy(thename,name); if((p=strrchr(thename,'.'))!=NULL) *p=0; if(!rsrconly) { myseek(in,83); dforklen=getdword(in); rforklen=getdword(in); printf("Data fork length = %lu\n" "Resource fork length = %lu\n", dforklen,rforklen); myseek(in,rforkpos=128+dforklen); } else { rforkpos=0; } rdatapos=rforkpos+getdword(in); rmappos=rforkpos+getdword(in); rdatalen=getdword(in); rmaplen=getdword(in); myseek(in,rmappos+16+4+2+2); /* printf("%lx\n",rmappos); */ rtypepos=rmappos+getword(in); /* printf("%lx\n",rtypepos); */ rnamepos=rmappos+getword(in); /* printf("%lx\n",rnamepos); */ myseek(in,rtypepos); numtypes=getword(in)+1; for(i=0;i<numtypes;i++) { read4bytes(in,s); if(!strcmp(rsrc,s)) break; getword(in); getword(in); } if(i==numtypes) err("Cannot find resources of type %s.\n",rsrc); myresnum=1+getword(in); myreflistpos=rtypepos+getword(in); myseek(in,myreflistpos); for(i=0;i<(int)myresnum;i++) { getword(in); /* Resource ID */ mynamepos=rnamepos+(n=getword(in)); getbyte(in); /* Resource attributes */ mydatapos=rdatapos+get3bytes(in); getdword(in); pos=ftell(in); process(in,n==65535?-1:mynamepos,mydatapos); myseek(in,pos); } fclose(in); return 0; }
/* * Handle [FORMAT] item. * */ dodiform() { extern char bootstop; extern char bootend; int dev, v, w, i, br; int modesel; /* flag for mode select */ long cnt, hdsiz; char *s, *d, *wgetstr(); char buf[10], bs[512], sendata[32]; char pnam[128]; char *seldev = "X", *id = "XXXXX"; HINFO hinfo; char devnames[NAMSIZ]; /* device type name buffer */ long nbad; extern long gbslsiz(), nument(), dsmarkbad(); long pattern, temp; long longrandom(); char pr_id[10]; /* partition scheme id */ int mask = 0x0001; int set, scsidrv, bsiz, other = 0; /* * Throw up generic formatting/partition warning, * then get physical dev they want to clobber. */ yesscan = 0; noinfo = 0; for (i = 0; i < NAMSIZ; i++) devnames[i] = "\0"; fwarning[FWARNCN].ob_state = NORMAL; fwarning[FWARNOK].ob_state = NORMAL; if (execform(fwarning) != FWARNOK) return BAILOUT; if ((dev = gphysdev()) < 0) { return BAILOUT; } strcpy(id, "mn"); br = 0; /* display doing SCSI massage */ if (dev > 7) { /* do the SCSI drive */ noinfo = 1; goto stfm; } inqfmt: /* Get all available disk types from wincap 'mn' entries */ wallents(devnames, id); if (!*devnames) { noinfo = 1; goto stfm; } /* Shove format name text into buttons */ for (i = 0, s = devnames; i < 14 && *s; ++i) { dsknames[pfmt[i]].ob_type = G_BUTTON; /* button */ dsknames[pfmt[i]].ob_spec = (long)s; dsknames[pfmt[i]].ob_state = NORMAL; dsknames[pfmt[i]].ob_flags = SELECTABLE | RBUTTON; while (*s++) ; } other = i; /* the other button */ dsknames[pfmt[i]].ob_type = G_BUTTON; /* button */ dsknames[pfmt[i]].ob_spec = "OTHER"; dsknames[pfmt[i]].ob_state = NORMAL; dsknames[pfmt[i]].ob_flags = SELECTABLE | RBUTTON; i++; /* rest of buttons are invisible and untouchable */ for (; i < 16; ++i) { dsknames[pfmt[i]].ob_type = G_IBOX; /* invisible box */ dsknames[pfmt[i]].ob_spec = 0; /* no thickness */ dsknames[pfmt[i]].ob_state = DISABLED; /* nobody home */ dsknames[pfmt[i]].ob_flags = NONE; /* disabled */ } /* clean up rest of the form and throw it up */ dsknames[PFOK].ob_state = NORMAL; dsknames[PFCN].ob_state = NORMAL; if (execform(dsknames) != PFOK) return BAILOUT; /* search for format they picked */ for (i = 0; i < 16; ++i) if (dsknames[pfmt[i]].ob_state & SELECTED) break; if (i >= 16) { /* nothing picked */ return BAILOUT; } else if (other == i) { /* the OTHER button was selected */ noinfo = 1; goto stfm; } if ((!br) && (dev < 8)) { if (wgetent(dsknames[pfmt[i]].ob_spec, "mn") == ERROR) { nofmt[NOSCHFMT].ob_spec = dsknames[pfmt[i]].ob_spec; nofmt[NOSCHFMT].ob_state = NORMAL; execform(nofmt, 0); return ERROR; } if ((s = wgetstr("br")) != NULL) { strcpy(id, s); br = 1; /* processing the branch */ goto inqfmt; /* start over */ } } stfm: modesel = 1; if (gfparm(dev, noinfo, &modesel, &hinfo, dsknames[pfmt[i]].ob_spec,id)!= 0) { return ERROR; } /* get data pattern to test the disk */ if (wgetnum("dp", &pattern) != OK) { pattern = longrandom(); /* can't find pattern from wincap, make one */ } else { temp = pattern; pattern <<= 16; /* shift pattern to hi word */ pattern |= temp; } br = (dev > 7) ? (dev-8) : (dev); /* minus 8 for the scsi drive number */ /* * One last chance to bail out. */ *seldev = br + '0'; (fmtfnl[FUNIT].ob_spec)->te_ptext = seldev; fmtfnl[FMTYES].ob_state = NORMAL; fmtfnl[FMTNO].ob_state = NORMAL; if (execform(fmtfnl) != FMTYES) return BAILOUT; /* For REAL !! */ dsplymsg(fmtmsg); bsl = 0L; /* Get size of Bad Sector List */ if ((bslsiz = gbslsiz(dev)) > 0L) { /* Allocate memory for existing BSL */ if ((bsl = (BYTE *)mymalloc((int)bslsiz*512)) <= 0) { ret = err(nomemory); goto formend; } /* Read in BSL */ if ((ret = rdbsl(dev)) != OK) { /* Create a new BSL if current one is unusable */ if (creabsl(dev, NEW, 0L) != OK) { ret = ERROR; goto formend; } } else { /* Remove USER BSL */ if (creabsl(dev, EXPAND, nument(VENDOR)) != OK) { ret = ERROR; goto formend; } } } else if (bslsiz == 0L || bslsiz == ERROR) { /* no bsl or read error */ if (creabsl(dev, NEW, 0L) != OK) { ret = ERROR; goto formend; } } else { /* bslsiz == MDMERR; medium changed error */ ret = ERROR; goto formend; } /* * In supervisor mode * set disk format parameters * and format the disk. */ ostack = Super(NULL); v = OK; /* assume everything is OK */ w = -1; if (modesel) { /* normal mode select ? */ v = ms(dev, &hinfo); /* Yes, do noprmal mode set */ if (v == OK) w = OK; /* Find formatted capacity of drive */ hdsiz = (long)hinfo.hi_cc * (long)hinfo.hi_dhc * (long)hinfo.hi_spt; } else { /* No, do special mode set */ set = typedev & (mask << dev); scsidrv = typedrv & (mask << dev); bsiz = ((set) || (scsidrv)) ? (16) : (22); for (i = 0; i < 32; i++) sendata[i] = 0; if ((set) || (scsidrv)) { v = mdsense(dev, 4, 0, 32, sendata); for (i = 0; i < 32; i++) /* the lenght of sendata */ if (sendata[i]) break; if (i == 32) { /* no infomations returned */ ret = 111; delay(); goto jjj; } hdsiz = get3bytes(sendata+5); delay(); /* kludge delay */ v = sqms(dev, sendata); delay(); goto kkk; } jjj: if ((v = mdsense(dev, 0, 0, bsiz, sendata)) == OK) { for (i = 0; i < bsiz; i++) if (sendata[i]) break; if (i == bsiz) { /* no infomations returned */ ret = 111; delay(); Super(ostack); goto formend; } hdsiz = get3bytes(sendata+5); delay(); /* kludge delay */ v = sqms(dev, sendata); } else { for (i = 0; i < bsiz; i++) if (sendata[i]) break; if (i == bsiz) { /* no infomations returned */ ret = 111; delay(); Super(ostack); goto formend; } } kkk: delay(); /* kludge delay */ w = OK; if (dev > 7) /* the drive is scsi */ if ((w = readcap(dev, 0, (long)0, buf)) == OK) hdsiz = get4bytes(buf) + 1; } disksiz = hdsiz; delay(); /* kludge delay */ if ((v == OK) || (w == OK)) v = format(dev, (UWORD)hinfo.hi_in); /* format */ delay(); /* kludge delay */ Super(ostack); if ((v != 0) || (w != 0)) { ret = errcode(dev); if (tsterr(ret) != OK) formaterr(dev); ret = ERROR; goto formend; } ret = OK; rebootp = 1; formend: erasemsg(); /* Erase formatting box */ if (ret == 111) /* HDX may not support this drive */ ret = err(needinfo); if (ret < 0) { if (bsl > 0) free(bsl); return ERROR; } /*------------------------------------------* * Markbad the device destructively. * * Bad Sectors found are added to the BSL. * * Write BSL to device. * *------------------------------------------*/ if ((nbad = dsmarkbad(dev, hdsiz, 1, pattern)) < 0) { free(bsl); return ERROR; } if (wrbsl(dev) != OK) { free(bsl); return ERROR; } free(bsl); /* * Install boot-stopper in sector image; * write root sector to device. * 6-13-88 Setting of soft format parameters in root sector sets * the hard disk size only. */ fillbuf(bs, 512L, 0L); /* create new root sector */ sbslparm(bs); /* set BSL parameters */ if (modesel) { sfmtparm(bs, &hinfo); } else { sdisksiz(bs, disksiz); } for (d = bs, s = &bootstop, cnt = (long)(&bootend - &bootstop); --cnt;) *d++ = *s++; Protobt(bs, -1L, -1, 1); /* make root sector executable */ if ((ret = putroot(dev, bs, (SECTOR)0)) != OK) { if (tsterr(ret) != OK) err(rootwrit); return ERROR; } /* * Make a copy of the default partition name. * Figure out the partition scheme id. */ if (!noinfo) { s = wgetstr("pt"); strcpy(pnam, s); } /* ?? figprid(disksiz, pr_id); */ dodipart(dev, pnam, disksiz); return OK; }
int convert_S_records( FILE *ifp, char *inm, FILE *ofp, char *onm) { char buff[512]; char *p; u8 cksum; int incksum; int c; int len; /* data length of current line */ int rectype; /* record type */ u32 addr; bool endrecord = FALSE; buffer_rec tb; while ( ! endrecord && (fgets(buff, sizeof(buff), ifp))) { p = &buff[0]; if (p[strlen(p)-1] == '\n') /* get rid of newline */ p[strlen(p)-1] = '\0'; if (p[strlen(p)-1] == '\r') /* get rid of any CR */ p[strlen(p)-1] = '\0'; tb.dl_count = 0; if (*p != 'S') badformat(p, inm, BADFMT); p++; if ((rectype = getnibble(&p)) == -1) /* record type */ badformat(buff, inm, BADTYPE); if ((len = getbyte(&p)) == -1) /* record len */ badformat(buff, inm, BADLEN); cksum = len; switch (rectype) { case 0x00: /* comment field, ignored */ goto write_it; case 0x01: /* data record, 16 bit addr */ if ((addr = get2bytes(&p)) == -1L) badformat(buff, inm, BADADDR); len -= 3; goto doit; case 0x02: /* ... 24 bit addr */ if ((addr = get3bytes(&p)) == -1L) badformat(buff, inm, BADADDR); len -= 4; goto doit; case 0x03: /* ... 32 bit addr */ if ((addr = get4bytes(&p)) == -1L) badformat(buff, inm, BADADDR); len -= 5; doit: cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr); tb.dl_destaddr = addr; while (len--) { if ((c = getbyte(&p)) == -1) badformat(buff, inm, BADDATA); cksum += c; filesum += c; tb.dl_buf[tb.dl_count++] = c; } break; case 0x07: /* 32 bit end record */ if ((addr = get4bytes(&p)) == -1L) badformat(buff, inm, BADADDR); goto end_rec; case 0x08: /* 24 bit end record */ if ((addr = get3bytes(&p)) == -1L) badformat(buff, inm, BADADDR); goto end_rec; case 0x09: /* 16 bit end record */ if ((addr = get2bytes(&p)) == -1L) badformat(buff, inm, BADADDR); end_rec: cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr); tb.dl_jumpaddr = addr; break; default: error(0, "unknown Motorola-S record type: 0x%02x", rectype); badformat(buff, inm, BADTYPE); break; } /* * Verify checksums are correct in file. */ cksum = (~cksum) & 0xff; if ((incksum = getbyte(&p)) == -1) badformat(buff, inm, BADCSUM); if (((u8) incksum) != cksum) badformat(buff, inm, MISCSUM); write_it: if (tb.dl_count) write_record(&tb, ofp); } return 0; }