VM Maker: ImageFormat-dtl.46.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: ImageFormat-dtl.46.mcz

commits-2
 
David T. Lewis uploaded a new version of ImageFormat to project VM Maker:
http://source.squeak.org/VMMaker/ImageFormat-dtl.46.mcz

==================== Summary ====================

Name: ImageFormat-dtl.46
Author: dtl
Time: 28 July 2020, 7:26:36.004 pm
UUID: c105c2f9-ab5a-4289-8785-f7e439342da5
Ancestors: ImageFormat-eem.45

Let version stamping in ckformat work in VMMaker the same as VMMaker.oscog, using old style only if CCodeGenerator is not present in the image to avoid package dependency.

=============== Diff against ImageFormat-eem.45 ===============

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 := (Smalltalk classNamed: #CCodeGenerator)
+ ifNotNil: [ :ccg | ccg monticelloDescriptionFor: self ]
+ ifNil: [ self name, ' ', DateAndTime now asString ].
- fileID := (CCodeGenerator respondsTo: #monticelloDescriptionFor:)
- ifTrue: [CCodeGenerator monticelloDescriptionFor: self] "VMMaker.oscog style..."
- ifFalse: [self name, ' ', DateAndTime now asString]. "VMMaker style..."
  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: '/* --- 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
  !