[U2] So long and other thoughs
I am moving on to a venture outside of the multi-value space. (For those interested, check out CloudVaults.com to see what I am doing now.) Sometime ago, you may recall my notice that the line of decompiler products and services for UniVerse and PI/open from srs4uv.com were being withdrawn. I have had discussions with several parties familiar to us on this list, including a representative of Rocket Software. Unfortunately, there is insufficient interest in acquiring the decompiler tool chain and giving it a new home. The srs4uv.com domain including the web site and email will go off-line in a few days. As well, the decompiler and service is no longer available. It has been fun and rewarding to be a part of this group over the decades and I leave with fond memories of its members. Best regards to all, Gyle Iverson ___ U2-Users mailing list U2-Users@listserver.u2ug.org http://listserver.u2ug.org/mailman/listinfo/u2-users
Re: [U2] srs4uv.com status [Was: Corrupted object in global catalog]
You are spot on Ian. It was a fun and tedious exercise. And you are right. The internals of each interpreter and its op codes are quite different. I wanted to answer the same question of how does one thing turn into another. And, can I reverse that? history The first decompiler was for Prime INFORMATION in 1982. There wasn't documentation available to me per se. However, looking through their compiled libraries you could glean the names of the op codes. Returning the statements and functions was straight forward. Recovering the logical structure of the program was the heavy lift. Way back then, what discussions I could find on logical structure recovery all said it was impossible. I discovered a way to take the distinct graph patterns associated with each compiled structure and reconstruct the original structure. That was a fun puzzle. Still today, most decompilers only return GOTO-filled source code. I always insisted on no-GOTOs (unless the original code was a pile of spaghetti originally) and there was no other way to reconstruct the program. The UniVerse decompiler came out in 1992. VMark was nice enough to leave a lot of useful information in some C language header files distributed with the product. I briefly looked at doing a UniData decompiler and never found sufficient time to dedicate to cracking that. Lee Leitner had a UniData decompiler on the market for a while. /history -Original Message- From: u2-users-boun...@listserver.u2ug.org [mailto:u2-users-boun...@listserver.u2ug.org] On Behalf Of McGowan, Ian Sent: Friday, January 04, 2013 8:00 PM To: U2 Users List Subject: Re: [U2] srs4uv.com status [Was: Corrupted object in global catalog] Seems like a fun, if tedious, exercise in understanding the internals of compiled code. Surely different between ud and uv, given their lineage. Are there any tools or documentation available to give a head start? Does the debugger leak any information on the internals? It comes down to the question of how does: # cat IAN.TEST PRINT HELLO Turn into: # od -c _IAN.TEST 000 001 ? ÿ ÿ \0 p \0 001 \0 \0 \0 \0 \0 \0 \0 \0 020 \0 003 \0 001 \0 \0 \0 0 \0 \0 \0 \0 \0 \0 \0 040 / i n f o / D E V E L / B P . D 060 E V / I A N . T E S T \0 - 1 \0 H 100 E L L O \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 120 \0 004 \0 033 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 140 \0 005 \0 002 \0 \0 \0 034 ÿ ÿ ÿ ÿ \0 \0 \0 \0 160 \0 004 \0 005 \0 \0 \0 037 \0 \0 \0 \0 \0 \0 \0 \0 200 001 214 \0 001 \0 001 \0 005 \0 \0 \0 020 \0 001 \0 , 220 \0 001 \0 020 \0 002 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 -Original Message- From: u2-users-boun...@listserver.u2ug.org [mailto:u2-users-boun...@listserver.u2ug.org] On Behalf Of David Wolverton Sent: Friday, January 04, 2013 3:11 PM To: 'U2 Users List' Subject: Re: [U2] srs4uv.com status [Was: Corrupted object in global catalog] Question on the Source Code Recovery -- is the logic such that it could be 'open sourced' or GPL'd? Or is there another way to do the source recovery? That is, were the mechanics sold to Rocket Software Professional Services? If not, could they be sold to another company is someone wanted to keep the product active? While I don't have a need now, I like to think there is a place to go for 'the unthinkable' if it happened! Just wondering!! I don't know the circumstances that led to withdrawing this service -- I would think it would rarely be needed, but when it was, would be invaluable. Seems a loss if it's now got to be re-written from scratch!! -Original Message- From: u2-users-boun...@listserver.u2ug.org [mailto:u2-users-boun...@listserver.u2ug.org] On Behalf Of Gyle Iverson Sent: Thursday, January 03, 2013 7:04 AM To: u2-users@listserver.u2ug.org Subject: [U2] srs4uv.com status [Was: Corrupted object in global catalog] Thanks for your comments David. I left http://srs4uv.com/ on-line for now. The hosting expires 2012/02/21 and the domain expires 2012/02/28. I added a Donate button to the main page in case people want to keep the site around and the links to it from breaking. Otherwise, the site vanishes next month. Gyle ___ U2-Users mailing list U2-Users@listserver.u2ug.org http://listserver.u2ug.org/mailman/listinfo/u2-users - IMPORTANT NOTICE: This message is intended only for the addressee and may contain confidential, privileged information. If you are not the intended recipient, you may not use, copy or disclose any information contained in the message. If you have received this message in error, please notify the sender by reply e-mail and delete the message. ___ U2-Users mailing list U2-Users@listserver.u2ug.org http
Re: [U2] srs4uv.com status [Was: Corrupted object in global catalog]
I don't desire to give the technology away. Anyone interested in purchasing or licensing the technology should contact me directly. Last year I recovered one program. Not enough activity to keep my interest. While we all appreciate the potential value of having the service, it is no longer economically viable. Connected by DROID on Verizon Wireless -Original message- From: David Wolverton dwolv...@flash.net To: 'U2 Users List' u2-users@listserver.u2ug.org Sent: 2013 Jan, Fri, 4 23:11:16 GMT+00:00 Subject: Re: [U2] srs4uv.com status [Was: Corrupted object in global catalog] Question on the Source Code Recovery -- is the logic such that it could be 'open sourced' or GPL'd? Or is there another way to do the source recovery? That is, were the mechanics sold to Rocket Software Professional Services? If not, could they be sold to another company is someone wanted to keep the product active? While I don't have a need now, I like to think there is a place to go for 'the unthinkable' if it happened! Just wondering!! I don't know the circumstances that led to withdrawing this service -- I would think it would rarely be needed, but when it was, would be invaluable. Seems a loss if it's now got to be re-written from scratch!! -Original Message- From: u2-users-boun...@listserver.u2ug.org [mailto:u2-users-boun...@listserver.u2ug.org] On Behalf Of Gyle Iverson Sent: Thursday, January 03, 2013 7:04 AM To: u2-users@listserver.u2ug.org Subject: [U2] srs4uv.com status [Was: Corrupted object in global catalog] Thanks for your comments David. I left http://srs4uv.com/ on-line for now. The hosting expires 2012/02/21 and the domain expires 2012/02/28. I added a Donate button to the main page in case people want to keep the site around and the links to it from breaking. Otherwise, the site vanishes next month. Gyle ___ U2-Users mailing list U2-Users@listserver.u2ug.org http://listserver.u2ug.org/mailman/listinfo/u2-users ___ U2-Users mailing list U2-Users@listserver.u2ug.org http://listserver.u2ug.org/mailman/listinfo/u2-users
[U2] srs4uv.com status [Was: Corrupted object in global catalog]
Thanks for your comments David. I left http://srs4uv.com/ on-line for now. The hosting expires 2012/02/21 and the domain expires 2012/02/28. I added a Donate button to the main page in case people want to keep the site around and the links to it from breaking. Otherwise, the site vanishes next month. Gyle -Original Message- From: u2-users-boun...@listserver.u2ug.org [mailto:u2-users-boun...@listserver.u2ug.org] On Behalf Of Hona, David Sent: Wednesday, January 02, 2013 9:47 PM To: U2 Users List Subject: Re: [U2] [UV]Corrupted object in global catalog Here's some options for you... 1. Verify it is cataloged in Global Catalog The subroutine !EXIST subroutine was created for Prime INFORMATION compatibility and does a simple check to verify the program is catalogued only. Check out the source code in UV account APP.PROGS, EXIST. 2. Verify Object code matches The VCATALOG verb is also used to verify the compiled object in your BP object file and the Global Catalog space are the same. (Interestingly, on my UV11.1.9/AIX system, VCATALOG isn't working! :-( ). 3. Extract detailed object code header data Finally, writing your own custom verification utility combining VLIST verb and/or Gyle Iversons' excellent (NB: I understand he will soon close down this website) SRS.UV.HEADER subroutine to extract header information from the global catdir and your BP object file for comparison purposes. URL: http://www.srs4uv.com/srs_uv_header.htm ___ U2-Users mailing list U2-Users@listserver.u2ug.org http://listserver.u2ug.org/mailman/listinfo/u2-users
[U2] [AD] srs4uv.com is going out of business
Those of you that utilized the Source Recovery Service for UV or TAD, the Adaptable Decompiler may be interested to know that I am shutting down the srs4uv.com web site and the services December 31, 2012. After December 31, 2012, the products and services will no longer be available. If you need to recover the source code for a program I suggest doing that before the end of this year. Thanks to all of you that have used my products and services over the years. Sincerely, Gyle Iverson ___ U2-Users mailing list U2-Users@listserver.u2ug.org http://listserver.u2ug.org/mailman/listinfo/u2-users
RE: [U2] curious EQUATE issue - SOLVED Just want to know if anyone understands WHY?
Richard Nuckolls wrote: the compiler is evaluating VALID.CC.TYPES1,1 as A':@VM:'B':@VM:'D':@VM:'M':@VM:'S':@VM:'V'1,1 The precedence of concatenation is lower than dynamic array extraction. Try placing parenthesis characters around the equate definition. E.g. EQU VALID.CC.TYPES TO ('A':@VM:'B':@VM:'D':@VM:'M':@VM:'S':@VM:'V'). It might be necessary to use the EQUATE LITERALLY form to maintain the parenthesis characters. Best regards, Gyle --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] How do you find out about file operation within an index?
I'm wondering if there is a way to identify, within a file index, what type of file operation has occurred. Hello, Jeff. Listed below is a program that uses the index like a trigger. It can only detect WRITE and DELETE statements though. I used this approach with PI and PI/open as they never supported triggers (unless one considered the AKUFS a trigger). I have not tried this approach on UniVerse so I can not speak to its performance, however, I suspect it will work reasonably well. If you do give it a try, please let me know your results. Ask me questions about what it is doing if things are unclear. I published an article in Infocus and an NPUG proceedings that describes the algorithm in detail but I do not have that in electronic form. :-( Best regards, Gyle ** SUBROUTINE BUILD.POD.INDEX(result) * This program projects a nested Purchase Order into a normalized form suitable for reporting purposes. $INCLUDE PO.EQUATE.INS.IBAS $INCLUDE POD.EQUATE.INS.IBAS DIM temporary.pod.record(2000) DIM purchase.order.record(100) EQUATE TRUE TO 1 EQUATE FALSE TO 0 EQUATE ADD TO 1 EQUATE DELETING TO 2 EQUATE UPDATE.FIRST.CALL TO 3 EQUATE UPDATE.SECOND.CALL TO 4 EQUATE NEEDLESS.WRITE.PERFORMED TO 5 EQUATE BUILDING.INDEX TO 6 COMMON /PO.POD/ Po.File.Variable, Pod.File.Variable, Last.Updated.Id, Last.Mode, Last.Added.Id, Build.Time result = IF NOT(FILEINFO(Po.File.Variable, 0)) THEN OPEN , PO TO Po.File.Variable ELSE PRINT PRINT Unable to open the PO file! (BUILD.POD.INDEX) RETURN END Last.Updated.Id = Last.Added.Id = Last.Mode = Build.Time = 0 END IF NOT(FILEINFO(Pod.File.Variable, 0)) THEN OPEN , POD TO Pod.File.Variable ELSE PRINT PRINT Unable to open the POD file! (BUILD.POD.INDEX) RETURN END Last.Updated.Id = Last.Added.Id = Last.Mode = Build.Time = 0 END IF @SENTENCE[1, 11] = BUILD.INDEX THEN Last.Mode = BUILDING.INDEX END ELSE Build.Time = 0 READ temporary.record FROM Po.File.Variable, @ID THEN IF temporary.record = @RECORD THEN BEGIN CASE CASE @ID = Last.Updated.Id Last.Mode = UPDATE.SECOND.CALL Last.Added.Id = CASE @ID = Last.Added.Id Last.Mode = NEEDLESS.WRITE.PERFORMED Last.Added.Id = CASE TRUE Last.Mode = ADD Last.Added.Id = @ID END CASE Last.Updated.Id = END ELSE Last.Mode = UPDATE.FIRST.CALL Last.Added.Id = Last.Updated.Id = @ID END END ELSE Last.Mode = DELETING Last.Updated.Id = Last.Added.Id = temporary.record = END END display.error.messages = TRUE ON Last.Mode GOSUB add:, delete:, update:, update.phase.2:, needless.write.performed:, build: RETURN add: GOSUB build.pod.records: IF result # ERROR THEN GOSUB write.pod.records: END RETURN delete: display.error.messages = FALSE GOSUB build.pod.records: GOSUB delete.pod.records: RETURN update: display.error.messages = FALSE GOSUB build.pod.records: IF result # ERROR THEN GOSUB write.pod.records: END RETURN update.phase.2: GOSUB delete.pod.records: GOSUB build.pod.records: IF result # ERROR THEN GOSUB write.pod.records: END RETURN needless.write.performed: display.error.messages = FALSE GOSUB build.pod.records: RETURN build: IF Build.Time = 0 THEN PRINT Clearing the POD file. (BUILD.POD.INDEX) CLEARFILE Pod.File.Variable Build.Time = 1 END GOSUB build.pod.records: IF result # ERROR THEN GOSUB write.pod.records: END RETURN build.pod.records: MATPARSE purchase.order.record FROM @RECORD, @FM detail.record.counter = 0 errors = result = number.of.backordered.line.items = 0 number.of.excess.receipt.line.items = 0 customer.id = purchase.order.record(PO.VENDOR.NUMBER) IF customer.id = THEN customer.id = purchase.order.record(6) END customer.po = purchase.order.record(PO.PURCHASE.ORDER.NUMBER) current.order.status = purchase.order.record(PO.STATUS) hold = purchase.order.record(14) purchase.order.type = purchase.order.record(27) work.order.sequense =
RE: [U2] [UV] Forcing Subroutine to be Re-read
Does anyone know of a way that I can force the background job to reread the subroutine? Hello, Scott. There is no method to do this without making changes to the subroutine caller. If you use the CALL form of: Foo = Foo . . Call @Foo(stuff) Reassigning Foo = Foo abandons a previously cached image of Foo and loads the latest version of Foo. One can do this reassignment preceding every call (careful, this could negatively impact performance) or periodically test a lock or read a specific field from a file record to control the reassignment. Best regards, Gyle --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] Decompiler
Hello, David. Information about UniVerse source recovery can be found at http://www.srs4uv.com. Contact me off-list for additional information. Best regards, Gyle -Original Message- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of David Katz Sent: Monday, April 17, 2006 3:59 PM To: u2-users@listserver.u2ug.org Subject: [U2] Decompiler Does anyone know if there is a decompiler out there for Universe source code? Thanks David. --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/ --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] Speaking of TIME...
Hello, David. The TIMEDATE() function result is coherent. You just need to separate the date from the time. Best regards, Gyle --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] [UV] Resize error
I suggest using oh.exe to find the process that has the file open. Sometimes I have seen explorer.exe as the culprit. You can download oh.exe from msdn.microsoft.com. Best regards, Gyle --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] Vlist Header Information
Does anyone know another way to get the header information from the first 10 or so lines of a vlist? (other than by using a vlist). Hello, Stuart. You can use the SRS.UV.HEADER subroutine to get at all the header information shown by VLIST and much more. The SRS.UV.HEADER source code may be downloaded from http://www.srs4uv.com/srs_uv_header.htm. Hope this helps. Best regards, Gyle --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] [UD] Best practices
Brian Leach wrote... Unlike the A/S type dictionaries, there is no standard way of separating base and synonym dictionaries using D types, which can lead to dictionary listing that takes forever to plough through to get to the definitions of later fields, and makes writing automated routines to build BASIC include files more complex. So the convention they adopted was to use D types for all the 'base' fields (one D type per field) and make all synonyms into I types of the form: I Base_Field_Name That way they could see the file layout more easily. I thought that was pretty smart. Here are some things I have seen and used on UniVerse that perhaps applies to UniData as well. Using I types in the way described above seems to move the problem of noise from the D types to the I types area. Also, it incurrs additional reporting overhead as an ITYPE() function is far more expensive than an EXTRACT() function. Other approaches include using custom D types or PHrases. The letters following the D in field 1 of the dictionary defintion are treated as comments, where the first space delimits the Type from the Description. Defining additional D types is easy. One site used DP to indicate the Primary field definition and the plain D types were considered synonyms. The DP types had good descriptions for the field whereas the D types descriptions were typically silent. Use PHrases to create customized D types on the fly for use with reporting. E.g. F1 6 lines D 1 10L S TF1 2 lines PH F1 FMT 33T Of course, the PHrase solution only works with the report writer. The nice thing about both of these approaches is that they retain the performance of the EXTRACT(). Best regards, Gyle --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] Record count from an I-descriptor in the VOC
Wendy Smoak A coworker suggested basically the same thing, but with READLIST/FORMLIST instead of SAVE.LIST/GET.LIST. That is a lot of mucking about with select-list 0. For more efficiency without changing your subroutine, try: SELECT VOC WITH criteria TO 1 LIST VOC FROM 1 A51.COUNT.FILE A51.COUNT.DICT No work arounds are required with this approach, though I suggest adding a test to your subroutine to abort if select-list 0 is active. Best regards, Gyle --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] UniVerse server socket issues
Thanks to all who responded. The VAR is not motivated to pay me to change the architecture of their client-server model to work around flaws in the initServerSocket() function. The VAR has a solution today using the GCI which implements server (listener) sockets in the C language. Ultimately they want to simplify the solution by porting the code into BASIC, however, there is no reason to force the fit now. The VAR will report the issues to IBM support and wait for the fix in a future release. Thanks again. Best regards, Gyle They call me Mr. Iverson --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] global catdir question
Hello, John. john reid asked... I notice that an ls -lt in the u1 /uv /catdir directory indicates that the *PROGRAM.NAME is updated apparently each time an execution happens, at least that is what it looks like to me. Anyone know if or why that is happening? UniVerse updates the record to keep track of the number of times the program has been loaded from the catalog. This information appears as the Ref column when you list the MAP file. Best regards, Gyle --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
[U2] UniVerse server socket issues
I am trying to help a U2 VAR migrate their custom-developed socket interface that uses the GCI to a pure BASIC solution using the U2 socket functions. They realize that by doing this their customers will need to license additional U2 seats, but they hate the UV GCI support issue on UNIX as UV must be re-linked. Unfortunately, the initServerSocket() function has a few flaws that stopped this project. 1) The initServerSocket() function precludes using the standard socket behavior of letting the socket sub-system assign any available port number when the port number 0 is specified. The initServerSocket() function translates all port numbers less than 1 to port 40001. This behavior of forcing port 40001 breaks an important standard feature often used when a server process is spawned to provide a cooperative service for another process. As long as the two cooperative processes can agree and communicate the randomly assigned port number, there is no reason to hard-code the port for either process. In fact, when it is possible to have an indeterminate number of these cooperative processes, trying to assign and track which ports are available, raises to the application level something that is otherwise handled at the kernel layer. That is never a good thing. I can not imagine why U2 restricts a valuable server socket feature. This reminds me of a documentation error that made it into code. 2) The other issue with the initServerSocket() is that it does not recognize when another process already has a given port open for listening. The example program below demonstrates this issue. This flaw prevents the application level from randomly assigning the port number and knowing that the port is actually available. Of course, this would not have been an issue if number 1 above let the socket kernel assign random port numbers. This is an ugly flaw as a program could wait forever for a port, never knowing that another process already has the port in use. I am using UV 10.1.11 PE on Windows. I am hoping someone has developed a work-around (other than GCI) or knows when the fix is scheduled. Best regards, Gyle Program SERVER.SOCKET Print Select a port number that is already in use on the system to test for contention : Input listenPort If listenPort = Then Stop End result = initServerSocket( , listenPort, 1, listenerSocket ) If result Then function = initServerSocket() Gosub DisplaySocketError: Stop End Else Print initServerSocket(): listening on port : listenPort End result = getSocketInformation( listenerSocket, -1, socketInformation ) If result Then function = getSocketInformation() Gosub DisplaySocketError: Stop End Print Server socket information Print --- Print Status : : socketInformation1,1 Print Host : : socketInformation1,2 Print Port : : socketInformation1,3 Print Secure : : socketInformation1,4 Print Mode : : socketInformation1,5 Print SERVER.SOCKET ready. Gosub CloseListenSocket: Stop CloseListenSocket: * Close the listen socket result = closeSocket( listenerSocket ) If result Then function = closeSocket() Gosub DisplaySocketError: Stop End Return DisplaySocketError: internalResult = getSocketErrorMessage( result, errorMessage ) Print function : returned: : result Print errorMessage Return End --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] UniVerse server socket issues
Hello, Tony. Tony Gravagno opined... Clients need to know the port of a server, so a server absolutely requires a fixed and well-known port. A server can have a randomly assigned port that is fixed and well-known only between the client and the server. If the server only exists for the benefit of one client, it is up to them to figure out how to assign and communicate the port dynamically. The fixed and well-known port requirement does not imply that the assignment is permanent. Why do you need an assigned port for a server? Think about the problem of a client needing to spawn a unique server on demand of the client. Each client may spawn a server dedicated to that client. Certainly if one were using real UNIX/Windows processes, one could single-thread through a central process and fork a new process, however, U2 products do not allow forking of processes. 2) The other issue with the initServerSocket() is that it does not recognize when another process already has a given port open for listening. I haven't read the specs for initServerSocket but if it doesn't return a non-zero for an attachment failure then yes, it's probably broken. Yep. However, in general, a given service should only have one listening process. Not always true. There are dynamic services too. It is valid to have a range of ports which all respond to inbound connections as a single service - that is, multiple servers will be listening to different socket ports, even if they support the same application/transport service. Interesting idea but it does not help with this issue. Have you tried supporting multiple listening sockets in U2? You can not get anywhere without a select() or poll() function analogue. While one could spawn numerous phantoms, each listening on a unique port, one is left with how to coordinate data and such between the phantoms. Not a pretty solution. Coordination of what ports are in use for a given service should be done by the application, so you should never really get to a failure in initServerSocket. Try the replication program using port 80. On my system initServerSocket returns success even though IIS is currently bound to that port. If nothing else you can use netstat to see what ports are in use and use a recognized port that is unallocated. Yes, but not a solution for this issue. Again, if you randomly generate a socket port for a service, how will any client know what port to connect to? They communicate the port number behind the scenes. Good luck. Tony Gravagno Thanks, Tony. Best regards, Gyle --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] Comparing object code [Was: Deciphering Pick UniBasic statement]
Hello, Jacques. Jacques G. wrote... From one horror story I read on the site about a programmer that had sabotaged source code: The company used the SRS on the object code they were running. In addition, they compiled the suspect source code and used the SRS on that set. By comparing the two source code result sets they figured out which programs had been sabotaged. Why not simply compare the binaries ? Unix has a small program called: cmp that can compare two files and Windows has comp. You can tell which ones have been changed that way. There are several challenges with binary comparison of object code. Different releases of a compiler may generate slightly different object code. The code will execute properly, but the differences foil the comparison. Here are some of the most frequent differences encountered: 1) The way the UV compiler allocates temporary registers has changed many times over the releases. 2) The way the UV compiler issues NOP instructions to maintain alignment has changed from release to release. 3) Newer op-codes may be used by later compilers. 4) The flavor of the account, the $OPTIONS that are set, or the compiler command line options may cause the use of different op-codes. 5) The path to the original source code, stored in the object code may be different and cause the comparison to fail otherwise identical object code. I have been developing a program that analyzes all of the source code, object code and cataloged programs on a system, trying to determine if any of the object code or cataloged programs are missing their source code. For the reasons listed above, this is not a trivial exercise. If any end-users are interested in being an alpha site come February 2006, drop me a note off-list. You can also know when the files were last compiled by looking at the dates with ls -al on the binary. That works as long as the files have not been touched. Still I think the decompiler can be a useful tool. I've worked with a client who purchased a package some years back and they only have the binaries. If the supplier ever goes out of business they are in trouble. We provide the source recovery service to help end-users when their application supplier is unable, for whatever reason. Some of our customers are actually application suppliers. They bring us in when they are unable to help the client. They work with us to help the customer become whole or self-sufficient. Best regards, Gyle www.srs4uv.com --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] Deciphering Pick UniBasic statement
Hello, Charles. Charles Stevenson wrote... I have not had occasion to use the srs4uv.com decompiler service. Probably worth the price when you really need it. It can be. Just imagine programs with hundreds of lines of code like Caleb's. It could take days to unravel the code by hand versus the few minutes needed to send it out to www.srs4uv.com. I am thankful for the wonderful www.srs4uv.com freebie download, SRS.UV.HEADER, that allows access to info about the object file from an I-descriptor subroutine. Thank you for the comments. I am glad to hear you like it. Best regards, Gyle P.S. I corrected the web address and the program name. --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] Deciphering Pick UniBasic statement
Hello, Charles. Charles Stevenson wrote... Everyone's going to jump in with the answer, but here's a way to figure it out yourself (on UV, but not UD): Use VLIST. I don't know which is more painful, the original code or the VLIST output. ;-) I decompiled Caleb's code using the srs4uv.com decompiler and got the following result in under a second. A few customers use the SRS recovery service for just this reason. IF P(2) - AR(12) = 28 THEN CC += 1 INS 0 BEFORE AR(14)1, 1 DEL AR(14)1, 9 END ELSE IF AR(13) = DATE() THEN CC = CC END ELSE INS 1 BEFORE AR(14)1, 1 DEL AR(14)1, 9 END END Best regards, Gyle www.srs4uv.com --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] PI/UV: Decompiler
AD When you need to recover the BASIC source code for PI/open or UniVerse systems, your ultimate source is found at www.srs4uv.com. The srs4uv team has helped companies, government agencies and learning institutions around the globe with their source recoveries for over 22 years. Many srs4uv customers tried IBM's PI/open decompiler beforehand and seem amazed at how easy the recovered programs are to read and maintain. /AD While the PI/open decompiler provided by IBM was a technically accurate utility, the maintainability of their recovered source code leaves much to be desired. IBM's decompiler failed to perform logical structure recovery, the most important quality, as this impacts the long-term maintainability of the programs. (There are other deficiencies with IBM's decompiler, such as, maintainable common member naming, reversing equated variable expressions, and recovering programs with certain internal-use statements. Please contact me directly for additional information on these PI/open recovery issues.) The logical structure for LOOP-REPEAT, FOR-NEXT and CASE statements, like IF-THEN-ELSE statements, are translated by a BASIC compiler into conditional and unconditional branch instructions. IBM's PI/open decompiler took the lazy-mans approach to decompiling, returning conditional branches as IF-THEN statements and unconditional branches as GOTO statements. As you might imagine, IBM's results look like a pile of spaghetti code. The srs4uv decompilers analyze the branch patterns to recover all of the high-level logical structures, making the recovered source code look as good, if not better, than the original source code. Best regards, Gyle mailto:[EMAIL PROTECTED] www.srs4uv.com --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] I'm in an Array quandry, any suggestions...
Will Johnson postulated: This would imply that not only would the run-time engine have to maintain a pointer to the last cell referenced, but also it would have to maintain a register telling it the cell number of this cell (not just its offset). So it needs two variables. I've never heard that it actually uses two variables to accomplish this. Yes, Will. There are two variables. The descriptor definition found in $UVHOME/gcidir/include/DATUM.h states: struct Dstring { /* This are my comments. GI */ STRING str; /* This is the entire dynamic array. */ int lastfield; /* This is the last field accessed. */ uchar *lastfptr; /* This is a pointer into str.text */ /* where the last field field accessed */ /* begins. */ }; Best regards, Gyle --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] I'm in an Array quandry, any suggestions...
Charles Stevenson says: [snipped a bunch of good stuff] If you have a program that manipulates many attributes many times, then it makes sense to matread them into a dimensioned array up front, and matwrite them in the end, thereby limiting big string manipulations. People forget or newbies don't know that CUST.REC117 is really EXTRACT( CUST.REC, 117,0,0) or REPLACE(...,CUST.REC,117,0,0). That can be very expensive when you do that for many attributes many times, with large dynamic arrays. By contrast, each dimensioned array element has its own memory address, so references and assignments can jump straight to it. Good point! Large dynamic arrays take longer to perform insertions, deletions and replacements. Why? The whole record must be copied to a new memory location with the changes. With dimensioned arrays, only the affected element is manipulated. Another related and fundamental difference exists between the two array types that should not be overlooked. The dynamic array can only store string data. Numeric values convert to a string before being stored in a dynamic array. Subsequent extraction of that just-stored data returns as a string and converts back to numeric as necessary. However, each dimensioned array element has its own unique memory descriptor (variable). A dynamic array element may store any type of data (though only string or numeric is appropriate for records). By using dimensioned arrays, numeric values are stored in the array without conversion. The conversion from numeric to string occurs only once, at the point when writing the record. Using dimensioned arrays can improve throughput when repeatedly performing mathematical operations on record elements. Best regards, Gyle P.S. I designed the URMA run machine to treat dynamic arrays as though they were dimensioned arrays internally, providing direct access any field, value or sub-value. Accessing record1000, 1000, 1000 is nearly as fast as accessing record1, 1, 1. I believe Robert Colquhoun took a similar approach with MaVerick too. Do not expect U2 to do anything like this anytime soon. The descriptor management foundation needs to support this concept and is not easily retrofitted. --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] Dymanic vs Dimensioned
Charles Stevenson goes on: [snipping the bit about tolerance] Do you know why dimensioned arrays were first limited to only 1 or 2 dimensions in Pick or Info-Basic? There was probably some concern about memory consumption way back when MD and Pick ran with only 64KB of core. I think it was just simpler for the designers to set a low limit. It looks like the subsequent designers never anticipated adding more dimensions, rather they focused on backward compatibility (which in this case has multiple interpretations). Would it be a terrible complication to the compiler to allow as many dimensions as the programmer needs? There are two complications: modifying the compiler and modifying the run machine. Modifying any of the compilers to support additional dimensionality would be easy. Modifying the existing op-code structures, descriptors, and run machines are likely a huge challenge these days. This type of extensibility needs to be thought of in the early development stages. Best regards, Gyle P.S. I designed URMA with support for 2^31 dimensions. Yeah, I know, after about 9 dimensions, you probably run out of memory today. Who knows, maybe terabytes of memory will be cheap tomorrow. The motto was, do not limit the design to today's technology. --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] [UV] Release 3.2 of the SRS_UV_HEADER program now available
Hello, Tony. The SRS.UV.HEADER program is nearly public domain. Anyone can do anything they want with the source code. All I ask is that they distribute the source code and keep the attributions. A license is not required where conscience will suffice. Best regards, Gyle Tony Gravagno says: Might be good to post SRS4UV to mvdevcentral.com as an offical open source project for discussion, bug/feature tracking, and of course community download and maintenance. You can select from many open source licenses that reflects your intent and the rights/obligations of those who use the code. Gyle Iverson wrote: Hundreds of U2UG members downloaded prior releases of the SRS_UV_HEADER program source code. We recently updated the program based on feedback we received from several members. Release 3.2 of the SRS_UV_HEADER program is available at http://www.srs4uv.com/srs_uv_header.htm. --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
[U2] [UV] Release 3.2 of the SRS_UV_HEADER program now available
Hundreds of U2UG members downloaded prior releases of the SRS_UV_HEADER program source code. We recently updated the program based on feedback we received from several members. Release 3.2 of the SRS_UV_HEADER program is available at http://www.srs4uv.com/srs_uv_header.htm. What does the SRS_UV_HEADER program do? It lets you use the SELECT verb with files containing compiled UniVerse BASIC programs, including the catalog directory. The program is useful when trying to find the location of the source code for the object code, or when trying to find programs that use a particular named common area. There are dozens of useful pieces of information the program returns. After you download the source, look at the program's source code to see other hidden information it returns. Enjoy, Gyle --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] [UV] Resize problems
Hello, Clif. Try OH.exe from Microsoft at http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/oh-o.asp . OH is great at answering the question, Who or what has this file open?. Best regards, Gyle --- u2-users mailing list u2-users@listserver.u2ug.org To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] Un-compiler/Un-Basic UniVerse Basic Code
Hello, Clif. Thank you for pointing the folks to me. I appreciate it. Best regards, Gyle -Original Message- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Clifton Oliver Sent: Sunday, December 05, 2004 8:13 PM To: [EMAIL PROTECTED] Subject: Re: [U2] Un-compiler/Un-Basic UniVerse Basic Code For Unidata, try Lee Leitner at http://www.infocus50.com/products/xtrico.html. For UniVerse, try Gyle Iverson at http://home.socal.rr.com/srs4uv/ For IT Goverance procedures so they don't lose source code, try me at http://www.oliver.com wink -- Regards, Clif --- u2-users mailing list [EMAIL PROTECTED] To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] UniBasic DeBug - Text After END [Message too long (40000 chars)]
Brutzman, Bill wrote In trying to smash two separate [working] programs together into a single program [attached], I obtain the pesky UniBasic complier error...Text found after END. Have you tried using the FORMAT or FANCY.FORMAT commands on your program? The reformatted indentation of the statements should make it visible where the logical structure is amiss. Gyle --- u2-users mailing list [EMAIL PROTECTED] To unsubscribe please visit http://listserver.u2ug.org/
RE: [U2] Program Object arguments
From: Adrian Matthews Don't know of a way to do it real-time as such. IBM provides the EXIST subroutine in the APP.PROGS directory for such. Best regards, Gyle --- u2-users mailing list [EMAIL PROTECTED] To unsubscribe please visit http://listserver.u2ug.org/
[U2] CC'ing to the list
The list is not handling posts with cc addresses properly. I have seen LeRoy's posting seven times. The last five were sent to [EMAIL PROTECTED] and cc'd to [EMAIL PROTECTED] and [EMAIL PROTECTED] I have seen Sara's posting three times. The first one was sent to '[EMAIL PROTECTED]' and cc'd to [EMAIL PROTECTED] The other two were sent to [EMAIL PROTECTED] and cc'd to [EMAIL PROTECTED] Best regards, Gyle -Original Message- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Dave Walker Sent: Wednesday, May 05, 2004 3:24 AM To: [EMAIL PROTECTED] Subject: [U2] Multiple receipts of latest messages Anyone else receiving multiple copies of the latest messages? I've received Sara Burn's reply three times, and Leroy Dreyfuss has hit my mailbox 6 times with his reply about windows directory permissions being reset. Just wondering. -- Dave Walker ..7 )) -::- -::-.7 .7)) ((.7 ..7 -::- ((.7 * Peace --- u2-users mailing list [EMAIL PROTECTED] http://www.u2ug.org/listinfo/u2-users --- u2-users mailing list [EMAIL PROTECTED] http://www.u2ug.org/listinfo/u2-users