Eliot Miranda uploaded a new version of ImageFormat to project VM Maker: http://source.squeak.org/VMMaker/ImageFormat-eem.44.mcz ==================== Summary ==================== Name: ImageFormat-eem.44 Author: eem Time: 28 July 2020, 2:00:42.760999 pm UUID: 700ba6ea-81f3-4754-975b-dc2ca3283048 Ancestors: ImageFormat-dtl.43 Conditionalize version stamping of ckformat.c so that in VMMaker.oscog it uses a Monticello stamp, not a generation-time stamp. =============== Diff against ImageFormat-dtl.43 =============== Item was changed: ----- Method: ImageFormat class>>generateCkFormatProgram:on: (in category 'ckformat') ----- generateCkFormatProgram: programName on: stream "Generate source code for an image format version reader. The program is intended for testing image file format from a unix shell script such that the shell script can decide what VM to run based on image requirements." + | fileID formatNumber | + fileID := (CCodeGenerator respondsTo: #monticelloDescriptionFor:) + ifTrue: [CCodeGenerator monticelloDescriptionFor: self] "VMMaker.oscog style..." + ifFalse: [self name, ' ', DateAndTime now asString]. "VMMaker style..." - | formatNumber | stream nextPutAll: '/* ', programName, ': Print the image format number on standard output */'; cr; nextPutAll: '/* for use in a shell script to test image format requirements. */'; cr; nextPutAll: '/* A non-zero return status code indicates failure. */'; cr; cr; nextPutAll: '/* Usage: ', programName, ' imageFileName */'; cr; cr; nextPutAll: '/* --- DO NOT EDIT THIS FILE --- */'; cr; + nextPutAll: '/* --- Automatically generated from class ', fileID, '--- */'; cr; - nextPutAll: '/* --- Automatically generated from class ', self name, ' ', DateAndTime now asString, '--- */'; cr; nextPutAll: '/* --- Source code is in package ImageFormat in the VMMaker repository --- */'; cr; nextPutAll: '/* --- DO NOT EDIT THIS FILE --- */'; cr; cr; nextPutAll: '#include <stdio.h>'; cr; nextPutAll: '#include <stdlib.h>'; cr; nextPutAll: '#include <string.h>'; cr; cr; nextPutAll: 'int main(int argc, char **argv) {'; cr; tab; nextPutAll: 'FILE *f;'; cr; tab; nextPutAll: 'unsigned char buf[8];'; cr; tab; nextPutAll: 'int formatNumber;'; cr; tab; nextPutAll: 'unsigned char c;'; cr; tab; nextPutAll: 'int match;'; cr; tab; nextPutAll: 'if (argc !!= 2) {'; cr; tab; tab; nextPutAll: 'printf("usage: ', programName, ' imageFileName\n");'; cr; tab; tab; nextPutAll: 'printf("answer the image format number for an image file or 0 if not known\n");'; cr; tab; tab; nextPutAll: 'printf("known image formats:\n");'; cr. KnownVersionNumbers do: [ :e | | s | s := String streamContents: [ :strm | strm nextPutAll: e asString, ': '. (self fromInteger: e) printDescriptionOn: strm withVersionNumber: false ]. stream tab; tab; nextPutAll: 'printf("', s, '\n");'; cr ]. stream tab; tab; nextPutAll: 'exit(1);'; cr; tab; nextPutAll: '}'; cr; tab; nextPutAll: 'f = fopen(argv[1], "r");'; cr; tab; nextPutAll: 'if (f == NULL) {'; cr; tab; tab; nextPutAll: 'perror(argv[1]);'; cr; tab; tab; nextPutAll: 'exit(2);'; cr; tab; nextPutAll: '}'; cr. { 0. 512 } do: [:offset | stream tab; nextPutAll: 'if(fseek(f, '; nextPutAll: offset asString; nextPutAll: 'L, SEEK_SET) !!= 0) {';cr; tab; tab; nextPutAll: 'fprintf(stderr, "cannot go to pos %d in %s\n", '; nextPutAll: offset asString; nextPutAll: ', argv[1]);'; cr; tab; tab; nextPutAll: 'exit(3);'; cr; tab; nextPutAll: '}'; cr; tab; nextPutAll: 'if (fread(buf, 1, 8, f) < 8) {'; cr; tab; tab; nextPutAll: 'fprintf(stderr, "cannot read %s\n", argv[1]);'; cr; tab; tab; nextPutAll: 'exit(3);'; cr; tab; nextPutAll: '}'; cr. self versionNumberByteArrays withIndexDo: [ :v :tag | | b | formatNumber := (self fromBytes: v) asInteger. b := 'b_', formatNumber asString, '_', tag asString. stream tab; nextPutAll: '{'; cr; tab; nextPutAll: 'unsigned char ', b, '[', v size asString, ']= { '. v inject: true into: [:first : elem | first ifFalse: [stream nextPutAll: ', ']. stream nextPutAll: elem asString. false]. stream nextPutAll: '};'; cr; tab; nextPutAll: 'if (memcmp(buf, ', b, ', ', v size asString, ') == 0) {'; cr; tab; tab; nextPutAll: 'printf("%d\n", ', formatNumber, ');'; cr; tab; tab; nextPutAll: 'exit(0);'; cr; tab; nextPutAll: '}'; cr; tab; nextPutAll: '}'; cr]]. stream tab; nextPutAll: 'printf("0\n"); /* print an invalid format number */';cr; tab; nextPutAll: 'exit (-1); /* not found, exit with error code */'; cr; nextPutAll: '}'; cr ! |
Free forum by Nabble | Edit this page |