X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=debugger%2Fmcs51%2Fcmd.c;h=da4a2e45214e772659a2d03dadd4fa6834c1e6c1;hb=ddba1eef4ec147af4bfedb50e6b3bc02ac66f952;hp=0a14e2b8f0c65c69beb198364314a720a529182c;hpb=89abf15734e43f91069394872c69e8384efea752;p=fw%2Fsdcc diff --git a/debugger/mcs51/cmd.c b/debugger/mcs51/cmd.c index 0a14e2b8..da4a2e45 100644 --- a/debugger/mcs51/cmd.c +++ b/debugger/mcs51/cmd.c @@ -27,6 +27,7 @@ #include "simi.h" #include "break.h" #include "cmd.h" +#include "newalloc.h" /* default number of lines to list out */ int listLines = 16; @@ -45,292 +46,293 @@ static char *warranty= {" NO WARRANTY"}; #else static char *copying= -" GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. -^L - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The \"Program\", below, -refers to any such program or work, and a \"work based on the Program\" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term \"modification\".) Each licensee is addressed as \"you\". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. -^L - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and \"any -later version\", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. -"; +" GNU GENERAL PUBLIC LICENSE\n" +" Version 2, June 1991\n" +"\n" +" Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n" +" 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA\n" +" Everyone is permitted to copy and distribute verbatim copies\n" +" of this license document, but changing it is not allowed.\n" +"\n" +" Preamble\n" +"\n" +" The licenses for most software are designed to take away your\n" +"freedom to share and change it. By contrast, the GNU General Public\n" +"License is intended to guarantee your freedom to share and change free\n" +"software--to make sure the software is free for all its users. This\n" +"General Public License applies to most of the Free Software\n" +"Foundation's software and to any other program whose authors commit to\n" +"using it. (Some other Free Software Foundation software is covered by\n" +"the GNU Library General Public License instead.) You can apply it to\n" +"your programs, too.\n" +"\n" +" When we speak of free software, we are referring to freedom, not\n" +"price. Our General Public Licenses are designed to make sure that you\n" +"have the freedom to distribute copies of free software (and charge for\n" +"this service if you wish), that you receive source code or can get it\n" +"if you want it, that you can change the software or use pieces of it\n" +"in new free programs; and that you know you can do these things.\n" +"\n" +" To protect your rights, we need to make restrictions that forbid\n" +"anyone to deny you these rights or to ask you to surrender the rights.\n" +"These restrictions translate to certain responsibilities for you if you\n" +"distribute copies of the software, or if you modify it.\n" +"\n" +" For example, if you distribute copies of such a program, whether\n" +"gratis or for a fee, you must give the recipients all the rights that\n" +"you have. You must make sure that they, too, receive or can get the\n" +"source code. And you must show them these terms so they know their\n" +"rights.\n" +"\n" +" We protect your rights with two steps: (1) copyright the software, and\n" +"(2) offer you this license which gives you legal permission to copy,\n" +"distribute and/or modify the software.\n" +"\n" +" Also, for each author's protection and ours, we want to make certain\n" +"that everyone understands that there is no warranty for this free\n" +"software. If the software is modified by someone else and passed on, we\n" +"want its recipients to know that what they have is not the original, so\n" +"that any problems introduced by others will not reflect on the original\n" +"authors' reputations.\n" +"\n" +" Finally, any free program is threatened constantly by software\n" +"patents. We wish to avoid the danger that redistributors of a free\n" +"program will individually obtain patent licenses, in effect making the\n" +"program proprietary. To prevent this, we have made it clear that any\n" +"patent must be licensed for everyone's free use or not licensed at all.\n" +"\n" +" The precise terms and conditions for copying, distribution and\n" +"modification follow.\n" +"^L\n" +" GNU GENERAL PUBLIC LICENSE\n" +" TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" +"\n" +" 0. This License applies to any program or other work which contains\n" +"a notice placed by the copyright holder saying it may be distributed\n" +"under the terms of this General Public License. The \"Program\", below,\n" +"refers to any such program or work, and a \"work based on the Program\"\n" +"means either the Program or any derivative work under copyright law:\n" +"that is to say, a work containing the Program or a portion of it,\n" +"either verbatim or with modifications and/or translated into another\n" +"language. (Hereinafter, translation is included without limitation in\n" +"the term \"modification\".) Each licensee is addressed as \"you\".\n" +"\n" +"Activities other than copying, distribution and modification are not\n" +"covered by this License; they are outside its scope. The act of\n" +"running the Program is not restricted, and the output from the Program\n" +"is covered only if its contents constitute a work based on the\n" +"Program (independent of having been made by running the Program).\n" +"Whether that is true depends on what the Program does.\n" +"\n" +" 1. You may copy and distribute verbatim copies of the Program's\n" +"source code as you receive it, in any medium, provided that you\n" +"conspicuously and appropriately publish on each copy an appropriate\n" +"copyright notice and disclaimer of warranty; keep intact all the\n" +"notices that refer to this License and to the absence of any warranty;\n" +"and give any other recipients of the Program a copy of this License\n" +"along with the Program.\n" +"\n" +"You may charge a fee for the physical act of transferring a copy, and\n" +"you may at your option offer warranty protection in exchange for a fee.\n" +"\n" +" 2. You may modify your copy or copies of the Program or any portion\n" +"of it, thus forming a work based on the Program, and copy and\n" +"distribute such modifications or work under the terms of Section 1\n" +"above, provided that you also meet all of these conditions:\n" +"\n" +" a) You must cause the modified files to carry prominent notices\n" +" stating that you changed the files and the date of any change.\n" +"\n" +" b) You must cause any work that you distribute or publish, that in\n" +" whole or in part contains or is derived from the Program or any\n" +" part thereof, to be licensed as a whole at no charge to all third\n" +" parties under the terms of this License.\n" +"\n" +" c) If the modified program normally reads commands interactively\n" +" when run, you must cause it, when started running for such\n" +" interactive use in the most ordinary way, to print or display an\n" +" announcement including an appropriate copyright notice and a\n" +" notice that there is no warranty (or else, saying that you provide\n" +" a warranty) and that users may redistribute the program under\n" +" these conditions, and telling the user how to view a copy of this\n" +" License. (Exception: if the Program itself is interactive but\n" +" does not normally print such an announcement, your work based on\n" +" the Program is not required to print an announcement.)\n" +"\n" +"These requirements apply to the modified work as a whole. If\n" +"identifiable sections of that work are not derived from the Program,\n" +"and can be reasonably considered independent and separate works in\n" +"themselves, then this License, and its terms, do not apply to those\n" +"sections when you distribute them as separate works. But when you\n" +"distribute the same sections as part of a whole which is a work based\n" +"on the Program, the distribution of the whole must be on the terms of\n" +"this License, whose permissions for other licensees extend to the\n" +"entire whole, and thus to each and every part regardless of who wrote it.\n" +"\n" +"Thus, it is not the intent of this section to claim rights or contest\n" +"your rights to work written entirely by you; rather, the intent is to\n" +"exercise the right to control the distribution of derivative or\n" +"collective works based on the Program.\n" +"\n" +"In addition, mere aggregation of another work not based on the Program\n" +"with the Program (or with a work based on the Program) on a volume of\n" +"a storage or distribution medium does not bring the other work under\n" +"the scope of this License.\n" +"\n" +" 3. You may copy and distribute the Program (or a work based on it,\n" +"under Section 2) in object code or executable form under the terms of\n" +"Sections 1 and 2 above provided that you also do one of the following:\n" +"\n" +" a) Accompany it with the complete corresponding machine-readable\n" +" source code, which must be distributed under the terms of Sections\n" +" 1 and 2 above on a medium customarily used for software interchange; or,\n" +"\n" +" b) Accompany it with a written offer, valid for at least three\n" +" years, to give any third party, for a charge no more than your\n" +" cost of physically performing source distribution, a complete\n" +" machine-readable copy of the corresponding source code, to be\n" +" distributed under the terms of Sections 1 and 2 above on a medium\n" +" customarily used for software interchange; or,\n" +"\n" +" c) Accompany it with the information you received as to the offer\n" +" to distribute corresponding source code. (This alternative is\n" +" allowed only for noncommercial distribution and only if you\n" +" received the program in object code or executable form with such\n" +" an offer, in accord with Subsection b above.)\n" +"\n" +"The source code for a work means the preferred form of the work for\n" +"making modifications to it. For an executable work, complete source\n" +"code means all the source code for all modules it contains, plus any\n" +"associated interface definition files, plus the scripts used to\n" +"control compilation and installation of the executable. However, as a\n" +"special exception, the source code distributed need not include\n" +"anything that is normally distributed (in either source or binary\n" +"form) with the major components (compiler, kernel, and so on) of the\n" +"operating system on which the executable runs, unless that component\n" +"itself accompanies the executable.\n" +"\n" +"If distribution of executable or object code is made by offering\n" +"access to copy from a designated place, then offering equivalent\n" +"access to copy the source code from the same place counts as\n" +"distribution of the source code, even though third parties are not\n" +"compelled to copy the source along with the object code.\n" +"^L\n" +" 4. You may not copy, modify, sublicense, or distribute the Program\n" +"except as expressly provided under this License. Any attempt\n" +"otherwise to copy, modify, sublicense or distribute the Program is\n" +"void, and will automatically terminate your rights under this License.\n" +"However, parties who have received copies, or rights, from you under\n" +"this License will not have their licenses terminated so long as such\n" +"parties remain in full compliance.\n" +"\n" +" 5. You are not required to accept this License, since you have not\n" +"signed it. However, nothing else grants you permission to modify or\n" +"distribute the Program or its derivative works. These actions are\n" +"prohibited by law if you do not accept this License. Therefore, by\n" +"modifying or distributing the Program (or any work based on the\n" +"Program), you indicate your acceptance of this License to do so, and\n" +"all its terms and conditions for copying, distributing or modifying\n" +"the Program or works based on it.\n" +"\n" +" 6. Each time you redistribute the Program (or any work based on the\n" +"Program), the recipient automatically receives a license from the\n" +"original licensor to copy, distribute or modify the Program subject to\n" +"these terms and conditions. You may not impose any further\n" +"restrictions on the recipients' exercise of the rights granted herein.\n" +"You are not responsible for enforcing compliance by third parties to\n" +"this License.\n" +"\n" +" 7. If, as a consequence of a court judgment or allegation of patent\n" +"infringement or for any other reason (not limited to patent issues),\n" +"conditions are imposed on you (whether by court order, agreement or\n" +"otherwise) that contradict the conditions of this License, they do not\n" +"excuse you from the conditions of this License. If you cannot\n" +"distribute so as to satisfy simultaneously your obligations under this\n" +"License and any other pertinent obligations, then as a consequence you\n" +"may not distribute the Program at all. For example, if a patent\n" +"license would not permit royalty-free redistribution of the Program by\n" +"all those who receive copies directly or indirectly through you, then\n" +"the only way you could satisfy both it and this License would be to\n" +"refrain entirely from distribution of the Program.\n" +"\n" +"If any portion of this section is held invalid or unenforceable under\n" +"any particular circumstance, the balance of the section is intended to\n" +"apply and the section as a whole is intended to apply in other\n" +"circumstances.\n" +"\n" +"It is not the purpose of this section to induce you to infringe any\n" +"patents or other property right claims or to contest validity of any\n" +"such claims; this section has the sole purpose of protecting the\n" +"integrity of the free software distribution system, which is\n" +"implemented by public license practices. Many people have made\n" +"generous contributions to the wide range of software distributed\n" +"through that system in reliance on consistent application of that\n" +"system; it is up to the author/donor to decide if he or she is willing\n" +"to distribute software through any other system and a licensee cannot\n" +"impose that choice.\n" +"\n" +"This section is intended to make thoroughly clear what is believed to\n" +"be a consequence of the rest of this License.\n" +"\n" +" 8. If the distribution and/or use of the Program is restricted in\n" +"certain countries either by patents or by copyrighted interfaces, the\n" +"original copyright holder who places the Program under this License\n" +"may add an explicit geographical distribution limitation excluding\n" +"those countries, so that distribution is permitted only in or among\n" +"countries not thus excluded. In such case, this License incorporates\n" +"the limitation as if written in the body of this License.\n" +"\n" +" 9. The Free Software Foundation may publish revised and/or new versions\n" +"of the General Public License from time to time. Such new versions will\n" +"be similar in spirit to the present version, but may differ in detail to\n" +"address new problems or concerns.\n" +"\n" +"Each version is given a distinguishing version number. If the Program\n" +"specifies a version number of this License which applies to it and \"any\n" +"later version\", you have the option of following the terms and conditions\n" +"either of that version or of any later version published by the Free\n" +"Software Foundation. If the Program does not specify a version number of\n" +"this License, you may choose any version ever published by the Free Software\n" +"Foundation.\n" +"\n" +" 10. If you wish to incorporate parts of the Program into other free\n" +"programs whose distribution conditions are different, write to the author\n" +"to ask for permission. For software which is copyrighted by the Free\n" +"Software Foundation, write to the Free Software Foundation; we sometimes\n" +"make exceptions for this. Our decision will be guided by the two goals\n" +"of preserving the free status of all derivatives of our free software and\n" +"of promoting the sharing and reuse of software generally.\n"; + static char *warranty= -" NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. -"; +" NO WARRANTY\n" +"\n" +" 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n" +"FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n" +"OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n" +"PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n" +"OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n" +"MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n" +"TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n" +"PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n" +"REPAIR OR CORRECTION.\n" +"\n" +" 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n" +"WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n" +"REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n" +"INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n" +"OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n" +"TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n" +"YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n" +"PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n" +"POSSIBILITY OF SUCH DAMAGES.\n"; #endif static void printTypeInfo(link *); static void printValAggregates (symbol *,link *,char,unsigned int); +static void setSymValue(symbol *sym, char *val, context *cctxt); int srcMode = SRC_CMODE ; +static set *dispsymbols = NULL ; /* set of displayable symbols */ /*-----------------------------------------------------------------*/ /* funcWithName - returns function with name */ @@ -436,6 +438,35 @@ static void clearBPatModLine (module *mod, int line) return; } +/*-----------------------------------------------------------------*/ +/* moduleLineWithAddr - finds and returns a line with a given address */ +/*-----------------------------------------------------------------*/ +DEFSETFUNC(moduleLineWithAddr) +{ + module *mod = item; + int i; + + V_ARG(unsigned int,addr); + V_ARG(module **,rmod); + V_ARG(int *,line); + + if (*rmod) + return 0; + + for (i=0; i < mod->nasmLines; i++ ) + { + if ( mod->asmLines[i]->addr == addr) + { + *rmod = mod ; + if (line ) + *line = mod->ncLines; + return 1; + } + } + + return 0; +} + /*-----------------------------------------------------------------*/ /* funcWithNameModule - returns functions with a name module combo */ /*-----------------------------------------------------------------*/ @@ -447,7 +478,7 @@ DEFSETFUNC(funcWithNameModule) V_ARG(function **,funcp); if (*funcp) - return 0; + return 0; if (strcmp(func->sym->name,fname) == 0 && strcmp(func->mod->c_name,mname) == 0) { @@ -553,31 +584,66 @@ DEFSETFUNC(lineAtAddr) } +/*-----------------------------------------------------------------*/ +/* lineNearAddr - for execution points returns the one with addr */ +/*-----------------------------------------------------------------*/ +DEFSETFUNC(lineNearAddr) +{ + exePoint *ep = item; + V_ARG(unsigned int,addr); + V_ARG(int *,line); + V_ARG(int *,block); + V_ARG(int *,level); + + /* the line in which the address is */ + if (ep->addr <= addr) { + *line = ep->line; + if (block) + *block = ep->block ; + if (level) + *level = ep->level ; + return 1; + } + + return 0; + +} + /*-----------------------------------------------------------------*/ /* discoverContext - find out the current context of the bp */ /*-----------------------------------------------------------------*/ context *discoverContext (unsigned addr) { function *func = NULL; + module *mod = NULL; int line = 0; /* find the function we are in */ if (!applyToSet(functions,funcInAddr,addr,&func)) { - fprintf(stderr, "Error?:discoverContext: cannot apply to set!\n"); - return NULL; + if (!applyToSet(functions,funcWithName,"main") || + !applyToSet(modules,moduleLineWithAddr,addr,&mod,&line)) + { + fprintf(stderr, "Error?:discoverContext: cannot apply to set!\n"); + return NULL; + } + currCtxt->func = func; + currCtxt->addr = addr; + currCtxt->modName = mod->name; + currCtxt->cline = func->exitline; } - - currCtxt->func = func; - currCtxt->addr = func->laddr = addr; - currCtxt->modName = func->modName; - - /* find the c line number */ - if(applyToSet(func->cfpoints,lineAtAddr,addr, - &line,&currCtxt->block,&currCtxt->level)) - currCtxt->cline = func->lline = line; else - currCtxt->cline = func->exitline; + { + currCtxt->func = func; + currCtxt->addr = func->laddr = addr; + currCtxt->modName = func->modName; + /* find the c line number */ + if(applyToSet(func->cfpoints,lineNearAddr,addr, + &line,&currCtxt->block,&currCtxt->level)) + currCtxt->cline = func->lline = line; + else + currCtxt->cline = func->exitline; + } /* find the asm line number */ line = 0; if (applyToSet(func->afpoints,lineAtAddr,addr, @@ -601,6 +667,11 @@ void simGo (unsigned int gaddr) static int initial_break_flag = 0; top: + if ( userinterrupt ) + { + userinterrupt = 0; + return; + } addr = simGoTillBp (gaddr); /* got the pc for the break point now first @@ -610,7 +681,6 @@ void simGo (unsigned int gaddr) /* dispatch all the break point call back functions */ rv = dispatchCB (addr,ctxt); - ret: /* the dispatch call back function will return @@ -653,6 +723,162 @@ void simGo (unsigned int gaddr) } +static int printAsmLine( function *func, module *m, long saddr, long eaddr) +{ + int i,j,delta; + int symaddr; + int lastaddr = saddr+1; + char *symname; + + if ( func ) + { + symaddr = func->sym->addr; + symname = func->sym->name; + } + else + { + symaddr = saddr; + symname = "" ; + } + for (j=0,i=0; i < m->nasmLines; i++ ) + { + if ( saddr >= 0 && m->asmLines[i]->addr < saddr) + { + continue; + } + if ( eaddr >= 0 && m->asmLines[i]->addr > eaddr) + { + continue; + } + if ( func && + (m->asmLines[i]->addr < func->sym->addr || + m->asmLines[i]->addr > func->sym->eaddr )) + { + continue; + } + delta = m->asmLines[i]->addr - symaddr; + if ( delta >= 0 ) + { + j++; + lastaddr = m->asmLines[i]->addr; + printf("0x%08x <%s",lastaddr,symname); + if (delta > 0) printf("+%d",delta); + printf(">:\t%s",m->asmLines[i]->src); + } + } + return lastaddr; +} + +/*-----------------------------------------------------------------*/ +/* cmdDisasm - disassemble asm instruction */ +/*-----------------------------------------------------------------*/ +static int cmdDisasm (char *s, context *cctxt, int args) +{ + function *func = NULL; + long saddr = -1; + long eaddr = -1; + int found = 0; + module *modul; + /* white space skip */ + + if ( args > 0 ) + { + while (*s && isspace(*s)) s++; + + if ( isdigit(*s)) + { + saddr = strtol(s,&s,0); + if ( args > 1 ) + { + while (*s && isspace(*s)) s++; + + if ( isdigit(*s)) + eaddr = strtol(s,0,0); + } + else + eaddr = saddr+1; + } + } + + if ( eaddr == -1 ) + { + /* no start or only start so dump function */ + if ( saddr == -1 ) + { + func = cctxt->func; + } + else + { + applyToSet(functions,funcInAddr,saddr,&func); + } + if ( func ) + { + printf("Dump of assembler code for function %s:\n",func->sym->name); + printAsmLine(func,func->mod,-1,-1); + printf("End of assembler dump.\n"); + return 0; + } + else + { + if (applyToSet(modules,moduleLineWithAddr,saddr,&modul,NULL)) + { + eaddr = saddr + 5; + printf("Dump of assembler code:\n"); + printAsmLine(NULL,modul,saddr,eaddr); + printf("End of assembler dump.\n"); + return 0; + } + } + } + else + { + if ( args > 1 ) + printf("Dump of assembler code from 0x%08x to 0x%08x:\n",saddr,eaddr); + found = 0; + while ( saddr < eaddr ) + { + func = NULL; + if (applyToSet(functions,funcInAddr,saddr,&func)) + { + found = 1; + modul = func->mod; + } + else + { + if ( found ) + break; + if (!applyToSet(modules,moduleLineWithAddr,saddr,&modul,NULL)) + break; + } + saddr = printAsmLine(func,modul,saddr,eaddr) + 1; + } + if( saddr >= eaddr) + { + if ( args > 1 ) + printf("End of assembler dump.\n"); + return 0; + } + + } + fprintf(stderr,"No function contains specified address.\n"); + return 0; +} +/*-----------------------------------------------------------------*/ +/* cmdDisasm1 - disassemble one asm instruction */ +/*-----------------------------------------------------------------*/ +int cmdDisasm1 (char *s, context *cctxt) +{ + return cmdDisasm( s, cctxt, 1); +} + +/*-----------------------------------------------------------------*/ +/* cmdDisasmF - disassemble asm instructions */ +/*-----------------------------------------------------------------*/ +int cmdDisasmF(char *s, context *cctxt) +{ + return cmdDisasm( s, cctxt, 2); +} + /*-----------------------------------------------------------------*/ /* cmdSetUserBp - set break point at the user specified location */ /*-----------------------------------------------------------------*/ @@ -668,6 +894,7 @@ int cmdSetUserBp (char *s, context *cctxt) c) filename:lineno - line number of the given file e) filename:function- function X in file Y (useful for static functions) f) function - function entry point + g) *addr - break point at address */ if (!cctxt) { @@ -703,7 +930,34 @@ int cmdSetUserBp (char *s, context *cctxt) goto ret ; } - + /* case g) *addr */ + if ( *s == '*' && isdigit(*(s+1))) + { + int line = 0; + long braddr = strtol(s+1,0,0); + if (!applyToSet(functions,funcInAddr,braddr,&func)) + { + module *modul; + if (!applyToSet(modules,moduleLineWithAddr,braddr,&modul,&line)) + { + fprintf(stderr,"Address 0x%08x not exists in code.\n",braddr); + } + else + { + setBreakPoint ( braddr , CODE , USER , userBpCB , + modul->c_name,line); + } + goto ret ; + } + else + { + int line = func->exitline; + applyToSet(func->cfpoints,lineNearAddr,braddr,&line,NULL,NULL); + setBreakPoint ( braddr , CODE , USER , userBpCB , + func->mod->c_name,line); + } + goto ret ; + } /* case b) lineno */ /* check if line number */ if (isdigit(*s)) { @@ -788,7 +1042,13 @@ int cmdSetUserBp (char *s, context *cctxt) /*-----------------------------------------------------------------*/ int cmdListAsm (char *s, context *cctxt) { - fprintf(stderr,"'listasm' command not yet implemented\n"); + if ( cctxt && cctxt->func) + { + /* actual line */ + if (printAsmLine(cctxt->func,cctxt->func->mod, + (long)cctxt->addr,(long)cctxt->addr)) + return 0; + } return 0; } @@ -807,7 +1067,34 @@ int cmdSetOption (char *s, context *cctxt) (srcMode == SRC_CMODE ? "C" : "asm")); return 0; } - + + if (strncmp(s,"variable ",9) == 0) + { + symbol *sym ; + char *val; + s += 9; + while (isspace(*s)) s++; + if (!*s) return 0; + + val = s; + while (*val && !isspace(*val) && *val != '=') val++; + while (isspace(*val)) *val++ = '\0'; + if (*val) *val++ = '\0'; + if (*val) + { + if ((sym = symLookup(s,cctxt))) + { + setSymValue(sym,val,cctxt); + return 0; + } + fprintf(stdout,"No symbol \"%s\" in current context.\n",s); + } + else + fprintf(stdout,"No new value for \"%s\".\n",s); + return 0; + } + + fprintf(stderr,"'set %s' command not yet implemented\n",s); return 0; } @@ -824,6 +1111,7 @@ int cmdContinue (char *s, context *cctxt) fprintf(stdout,"Continuing.\n"); simGo(-1); + showfull = 1; return 0; } @@ -864,6 +1152,9 @@ int cmdStep (char *s, context *cctxt) if (!cctxt || !cctxt->func || !cctxt->func->mod) fprintf(stdout,"The program is not being run.\n"); else { + int origSrcMode = srcMode; + if ( *s == 'i' ) + srcMode = SRC_AMODE; /* if we are @ the end of a function then set break points at execution points of the function in the call stack... */ @@ -929,7 +1220,9 @@ int cmdStep (char *s, context *cctxt) } } + srcMode = origSrcMode; simGo(-1); + showfull = 1; } return 0; } @@ -946,6 +1239,9 @@ int cmdNext (char *s, context *cctxt) if (!cctxt || !cctxt->func || !cctxt->func->mod) fprintf(stdout,"The program is not being run.\n"); else { + int origSrcMode = srcMode; + if ( *s == 'i' ) + srcMode = SRC_AMODE; /* if we are @ the end of a function then set break points at execution points of the @@ -999,8 +1295,11 @@ int cmdNext (char *s, context *cctxt) func->aexitline); } } + srcMode = origSrcMode; simGo(-1); + showfull = 1; } + srcMode = origSrcMode; } return 0; } @@ -1013,6 +1312,11 @@ int cmdRun (char *s, context *cctxt) char buff[10]; if (!cctxt || !cctxt->func || !cctxt->func->mod) { fprintf(stdout,"Starting program\n"); + if ( ! simactive ) + { + fprintf(stdout,"No executable file specified.\nUse the \"file\" command.\n"); + return 0; + } simGo(0); } else { @@ -1027,7 +1331,7 @@ int cmdRun (char *s, context *cctxt) simGo(0); } } - + showfull = 1; return 0; } @@ -1095,8 +1399,8 @@ int cmdListFunctions (char *s, context *cctxt) if (f == NULL) break; if (our_verbose) { - printf(" %d) sym:%x, modName:%s, mod:%x\n", i, - f->sym, f->modName, f->mod); + printf(" %d) sym:%x, fname:%s, modName:%s, mod:%x\n", i, + f->sym, f->sym->name, f->modName, f->mod); printf(" entryline:%d, aentryline:%d, exitline:%d, aexitline:%d\n", f->entryline, f->aentryline, f->exitline, f->aexitline); printf(" cfpoints:%x, afpoints:%x, laddr:%x, lline:%d\n", @@ -1143,29 +1447,25 @@ int cmdListModules (char *s, context *cctxt) printf(" cLines:%x, asmLines:%x\n", m->cLines, m->asmLines); } - if (our_verbose > 2) { - i = 0; - if (m->cLines) { - cs = m->cLines[i++]; + if (our_verbose >= 2) { + if (m->ncLines) { printf(" [cLines] "); - while (cs) { - if (our_verbose) + if ( our_verbose) + for (i=0; incLines; i++ ) { + cs = m->cLines[i]; printf(" (%d) addr:%x, block:%d, level:%d, src:%s\n", i, cs->addr, cs->block, cs->level, cs->src); - cs = m->cLines[i++]; } if (!our_verbose) printf("%d records", i); } - i = 0; - if (m->asmLines) { - as = m->asmLines[i++]; + if (m->nasmLines) { printf(" [asmLines] "); - while (as) { - if (our_verbose) + if ( our_verbose) + for (i=0; inasmLines; i++ ) { + as = m->asmLines[i]; printf(" (%d) addr:%x, block:%d, level:%d, src:%s\n", i, as->addr, as->block, as->level, as->src); - as = m->asmLines[i++]; } if (!our_verbose) printf("%d records", i); @@ -1319,6 +1619,33 @@ static void infoStack(context *ctxt) } +/*-----------------------------------------------------------------*/ +/* cmdWhere - where command */ +/*-----------------------------------------------------------------*/ +int cmdWhere(char *s, context *cctxt) +{ + infoStack(cctxt); + showfull = 1; + return 0; +} + +/*-----------------------------------------------------------------*/ +/* cmdUp - Up command */ +/*-----------------------------------------------------------------*/ +int cmdUp(char *s, context *cctxt) +{ + return 0; +} + +/*-----------------------------------------------------------------*/ +/* cmdDown - down command */ +/*-----------------------------------------------------------------*/ +int cmdDown(char *s, context *cctxt) +{ + return 0; +} + +static int infomode = 0; /*-----------------------------------------------------------------*/ /* cmdInfo - info command */ /*-----------------------------------------------------------------*/ @@ -1327,7 +1654,7 @@ int cmdInfo (char *s, context *cctxt) while (isspace(*s)) s++; /* list all break points */ - if (strcmp(s,"break") == 0) { + if (strncmp(s,"break",5) == 0) { listUSERbp(); return 0; } @@ -1335,12 +1662,20 @@ int cmdInfo (char *s, context *cctxt) /* info frame same as frame */ if (strcmp(s,"frame") == 0) { cmdFrame (s,cctxt); + showfull = 1; + return 0; + } + + if (strncmp(s,"line",4) == 0) { + infomode=1; + cmdListSrc (s+4,cctxt); return 0; } /* info stack display call stack */ if (strcmp(s,"stack") == 0) { infoStack(cctxt); + showfull = 1; return 0; } @@ -1350,6 +1685,16 @@ int cmdInfo (char *s, context *cctxt) return 0; } + /* info stack display call stack */ + if (strcmp(s,"all-registers") == 0) { + fprintf(stdout,"%s",simRegs()); + fprintf(stdout,"Special Function Registers:\n"); + sendSim("ds 0x80 0x100\n"); + waitForSim(100,NULL); + fprintf(stdout,simResponse()); + return 0; + } + /* info stack display call stack */ if (strcmp(s,"symbols") == 0) { /* dump out symbols we have read in */ @@ -1358,6 +1703,13 @@ int cmdInfo (char *s, context *cctxt) return 0; } + if (strcmp(s,"variables") == 0) { + /* dump out symbols we have read in */ + fprintf(stdout,"Dumping symbols...\n"); + infoSymbols(cctxt); + return 0; + } + fprintf(stdout,"Undefined info command: \"%s\". Try \"help\n",s); return 0; @@ -1487,6 +1839,13 @@ int cmdListSrc (char *s, context *cctxt) if (llines > listLines) llines = listLines; + if ( infomode ) + { + fprintf(stdout,"Line %d of \"%s\" starts at address 0x%08x.\n",pline, + list_mod->c_name, list_mod->cLines[pline]->addr); + infomode=0; + return 0; + } for ( i = 0 ; i < llines ; i++ ) { if (srcMode == SRC_CMODE) { if ( (pline + i) >= list_mod->ncLines ) @@ -1504,6 +1863,51 @@ int cmdListSrc (char *s, context *cctxt) return 0; } +static void setValBasic(symbol *sym, char *val) +{ + union + { + float f; + unsigned long val; + long sval; + struct { + short lo; + short hi; + } i; + unsigned char b[4]; + }v; + + if (IS_FLOAT(sym->type)) + v.f = strtof(val,NULL); + else + if (IS_PTR(sym->type)) + v.sval = strtol(val,NULL,0); + else + { + if (IS_SPEC(sym->type) && IS_INTEGRAL(sym->type)) + { + if (IS_CHAR(sym->etype)) + { + v.b[0] = val[0]; + } + else + if (IS_INT(sym->etype)) + if (IS_LONG(sym->etype)) + if (SPEC_USIGN(sym->etype)) + v.val = strtol(val,NULL,0); + else + v.sval = strtol(val,NULL,0); + else + v.i.lo = strtol(val,NULL,0); + else + v.sval = strtol(val,NULL,0); + } + else + v.sval = strtol(val,NULL,0); + } + simSetValue(sym->addr,sym->addrspace,sym->size,v.sval); +} + /*-----------------------------------------------------------------*/ /* printValBasic - print value of basic types */ /*-----------------------------------------------------------------*/ @@ -1532,9 +1936,14 @@ static void printValBasic(symbol *sym,unsigned addr,char mem, int size) fprintf(stdout,"0x%x",v.val); else if (IS_SPEC(sym->type) && IS_INTEGRAL(sym->type)) { - if (IS_CHAR(sym->etype)) - fprintf(stdout,"'%c' %d 0x%x",v.val,v.val,v.val); - else + if (IS_CHAR(sym->etype)) + { + if ( isprint(v.val)) + fprintf(stdout,"%d 0x%x '%c'",v.val,v.val,v.val); + else + fprintf(stdout,"%d 0x%x '\\%o'",v.val,v.val,v.val); + } + else if (IS_INT(sym->etype)) if (IS_LONG(sym->etype)) if (SPEC_USIGN(sym->etype)) @@ -1556,7 +1965,7 @@ static void printValBasic(symbol *sym,unsigned addr,char mem, int size) /*-----------------------------------------------------------------*/ static void printValFunc (symbol *sym) { - fprintf(stdout,"print function not yet implemented\n"); + fprintf(stdout,"print function not yet implemented"); } /*-----------------------------------------------------------------*/ @@ -1579,7 +1988,7 @@ static void printArrayValue (symbol *sym, char space, unsigned int addr) fprintf(stdout,","); } - fprintf(stdout,"}\n"); + fprintf(stdout,"}"); } /*-----------------------------------------------------------------*/ @@ -1600,7 +2009,7 @@ static void printStructValue (symbol *sym,link *type, char space, unsigned int a addr += getSize(fields->type); fields = fields->next; } - fprintf(stdout,"}\n"); + fprintf(stdout,"}"); } /*-----------------------------------------------------------------*/ @@ -1620,10 +2029,42 @@ static void printValAggregates (symbol *sym, link *type,char space,unsigned int } } +/*-----------------------------------------------------------------*/ +/* setSymValue - set value of a symbol */ +/*-----------------------------------------------------------------*/ +static void setSymValue(symbol *sym, char *val, context *cctxt) +{ + if (sym->isonstack) + { + symbol *bp = symLookup("bp",cctxt); + if (!bp) + { + fprintf(stdout,"cannot determine stack frame\n"); + return ; + } + + sym->addr = simGetValue(bp->addr,bp->addrspace,bp->size) + + sym->offset ; + } + /* arrays & structures first */ + if (IS_AGGREGATE(sym->type)) + { + } + else + /* functions */ + if (IS_FUNC(sym->type)) + { + } + else + { + setValBasic(sym,val); + } +} + /*-----------------------------------------------------------------*/ /* printSymValue - print value of a symbol */ /*-----------------------------------------------------------------*/ -static void printSymValue (symbol *sym, context *cctxt) +static void printSymValue (symbol *sym, context *cctxt, int flg, int dnum) { static int stack = 1; unsigned long val; @@ -1641,7 +2082,18 @@ static void printSymValue (symbol *sym, context *cctxt) /* get the value from the simulator and print it */ - fprintf(stdout,"$%d = ",stack++); + switch (flg) + { + case 0: + default: + break; + case 1: + fprintf(stdout,"$%d = ",stack++); + break; + case 2: + fprintf(stdout,"%d: %s = ",dnum,sym->name); + break; + } /* arrays & structures first */ if (IS_AGGREGATE(sym->type)) printValAggregates(sym,sym->type,sym->addrspace,sym->addr); @@ -1649,11 +2101,11 @@ static void printSymValue (symbol *sym, context *cctxt) /* functions */ if (IS_FUNC(sym->type)) printValFunc(sym); - else { + else printValBasic(sym,sym->addr,sym->addrspace,sym->size); - fprintf(stdout,"\n"); + if ( flg > 0 ) fprintf(stdout,"\n"); //fprintf(stdout,"(BASIC %x,%c,%d)\n",sym->addr,sym->addrspace,sym->size); - } + } /*-----------------------------------------------------------------*/ @@ -1771,7 +2223,7 @@ int cmdPrint (char *s, context *cctxt) *bp = '\0'; if ((sym = symLookup(s,cctxt))) { - printSymValue(sym,cctxt); + printSymValue(sym,cctxt,1,0); } else { fprintf(stdout, "No symbol \"%s\" in current context.\n", @@ -1780,6 +2232,133 @@ int cmdPrint (char *s, context *cctxt) return 0; } +/*-----------------------------------------------------------------*/ +/* cmdOutput - print value of variable without number and newline */ +/*-----------------------------------------------------------------*/ +int cmdOutput (char *s, context *cctxt) +{ + symbol *sym ; + char *bp = s+strlen(s) -1; + + while (isspace(*s)) s++; + if (!*s) return 0; + while (isspace(*bp)) bp--; + bp++ ; + *bp = '\0'; + + if ((sym = symLookup(s,cctxt))) { + printSymValue(sym,cctxt,0,0); + } else { + fprintf(stdout, + "No symbol \"%s\" in current context.", + s); + } + return 0; +} + +typedef struct _dsymbol +{ + char *name; + int dnum; +} dsymbol; + +/** find display entry with this number */ + +DEFSETFUNC(dsymWithNumber) +{ + dsymbol *dsym = item; + V_ARG(int , dnum); + V_ARG(dsymbol **,dsymp); + + if ( dsym->dnum == dnum ) + { + *dsymp = dsym; + return 1; + } + return 0; +} + +/*-----------------------------------------------------------------*/ +/* displayAll - display all valid variables */ +/*-----------------------------------------------------------------*/ +void displayAll(context *cctxt) +{ + dsymbol *dsym; + symbol *sym; + if ( !dispsymbols ) + return; + for (dsym = setFirstItem(dispsymbols); + dsym ; + dsym = setNextItem(dispsymbols)) + { + if ( (sym = symLookup(dsym->name,cctxt))) + printSymValue(sym,cctxt,2,dsym->dnum); + } +} + +/*-----------------------------------------------------------------*/ +/* cmdDisplay - display value of variable */ +/*-----------------------------------------------------------------*/ +int cmdDisplay (char *s, context *cctxt) +{ + symbol *sym ; + char *bp = s+strlen(s) -1; + static int dnum = 1; + + while (isspace(*s)) s++; + if (!*s) + { + displayAll(cctxt); + return 0; + } + while (isspace(*bp)) bp--; + bp++ ; + *bp = '\0'; + + if ((sym = symLookup(s,cctxt))) + { + dsymbol *dsym = (dsymbol *)Safe_calloc(1,sizeof(dsymbol)); + dsym->dnum = dnum++ ; + dsym->name = sym->name; + addSetHead(&dispsymbols,dsym); + } + else + { + fprintf(stdout,"No symbol \"%s\" in current context.\n", + s); + } + return 0; +} + +/*-----------------------------------------------------------------*/ +/* cmdUnDisplay - undisplay value of variable */ +/*-----------------------------------------------------------------*/ +int cmdUnDisplay (char *s, context *cctxt) +{ + dsymbol *dsym; + int dnum; + + while (isspace(*s)) s++; + if (!*s) + { + deleteSet(&dispsymbols); + return 0; + } + while ( s && *s ) + { + dnum = strtol(s,&s,10); + if (applyToSetFTrue(dispsymbols,dsymWithNumber,dnum,&dsym)) + { + deleteSetItem(&dispsymbols,dsym); + } + else + { + fprintf(stdout,"Arguments must be display numbers.\n"); + } + } + return 0; +} + /*-----------------------------------------------------------------*/ /* cmdPrintType - print type of a variable */ /*-----------------------------------------------------------------*/ @@ -1925,7 +2504,7 @@ int cmdSimulator (char *s, context *cctxt) strcpy(tmpstr, s); strcat(tmpstr, "\n"); sendSim(tmpstr); - waitForSim(); + waitForSim(200,NULL); fprintf(stdout,"%s",simResponse()); return 0; }