Annotation of generator/src/ui-console.c, revision 1.1.1.1

1.1       root        1: /*****************************************************************************/
                      2: /*     Generator - Sega Genesis emulation - (c) James Ponder 1997-2000       */
                      3: /*****************************************************************************/
                      4: /*                                                                           */
                      5: /* ui-console - generic 640x480 console emulation                            */
                      6: /*                                                                           */
                      7: /*****************************************************************************/
                      8: 
                      9: #include <stdlib.h>
                     10: #include <stdio.h>
                     11: #include <stdarg.h>
                     12: #include <time.h>
                     13: #include <string.h>
                     14: 
                     15: #include "generator.h"
                     16: 
                     17: #include "cpu68k.h"
                     18: #include "cpuz80.h"
                     19: #include "ui.h"
                     20: #include "vdp.h"
                     21: #include "reg68k.h"
                     22: #include "gensound.h"
                     23: #include "mem68k.h"
                     24: #include "logo.h"
                     25: #include "font.h"
                     26: #include "uip.h"
                     27: #include "ui-console.h"
                     28: 
                     29: #define UI_LOGLINESIZE 128
                     30: #define UI_LOGLINES 64
                     31: 
                     32: uint8 ui_vdpsimple = 0;          /* 0=raster, 1=cell based plotter */
                     33: uint8 ui_clearnext = 0;          /* flag indicating redraw required */
                     34: uint8 ui_info = 1;               /* does the user want info onscreen or not */
                     35: uint8 ui_vsync = 0;              /* does the user want us to wait for vsync */
                     36: 
                     37: /*** forward reference declarations ***/
                     38: 
                     39: void ui_endframe(void);
                     40: void ui_exithandler(void);
                     41: void ui_printlog(void);
                     42: void ui_newframe(void);
                     43: void ui_convertdata(uint8 *indata, uint8 *outdata, unsigned int pixels);
                     44: void ui_plotsprite_acorn(uint16 *logo, uint16 width, uint16 height,
                     45:                         uint16 x, uint16 y);
                     46: int ui_unpackfont(void);
                     47: uint16 ui_plotstring(const char *text, uint16 xpos, uint16 ypos);
                     48: uint16 ui_plotint2(uint8 num, uint16 xpos, uint16 ypos);
                     49: void ui_plotsettings(void);
                     50: void ui_drawbox(uint16 colour, uint16 x, uint16 y, uint16 width,
                     51:                uint16 height);
                     52: 
                     53: /*** static variables ***/
                     54: 
                     55: static uint8 ui_vga = 0;         /* flag for whether in VGA more or not */
                     56: static uint8 ui_frameskip = 0;   /* 0 for dynamic */
                     57: static uint8 ui_actualskip = 0;  /* the last skip we did (1..) */
                     58: static uint8 ui_state = 0;       /* 0=stop, 1=paused, 2=play */
                     59: static uint32 ui_palcache[192];
                     60: static char *ui_initload = NULL; /* filename to load on init */
                     61: static char ui_loglines[UI_LOGLINES][UI_LOGLINESIZE];
                     62: static uint32 ui_logline = 0;
                     63: static uint8 ui_plotframe;       /* flag indicating plotting this frame */
                     64: static uint16 *ui_font;          /* unpacked font */
                     65: static uint8 bigbuffer[8192];    /* stupid no-vsnprintf platforms */
                     66: static uint16 ui_logcount = 0;   /* log counter */
                     67: static t_uipinfo ui_uipinfo;     /* uipinfo filled in by uip 'sub-system' */
                     68: 
                     69: /*** Program entry point ***/
                     70: 
                     71: int ui_init(int argc, char *argv[])
                     72: {
                     73:   int i;
                     74: 
                     75:   for(i = 0; i < UI_LOGLINES; i++) {
                     76:     ui_loglines[i][0] = '\0';
                     77:   }
                     78:   if (ui_unpackfont() == -1) {
                     79:     fprintf(stderr, "Failed to unpack font, out of memory?\n");
                     80:     return 1;
                     81:   }
                     82:   if (argc == 2) {
                     83:     if ((ui_initload = malloc(strlen(argv[1])+1)) == NULL) {
                     84:       fprintf(stderr, "Out of memory\n");
                     85:       return 1;
                     86:     }
                     87:     strcpy(ui_initload, argv[1]);
                     88:   }
                     89:   if (atexit(ui_exithandler) == -1) {
                     90:     LOG_CRITICAL(("Failed to set exit handler"));
                     91:     return 1;
                     92:   }
                     93:   if (uip_init(&ui_uipinfo)) {
                     94:     LOG_CRITICAL(("Failed to initialise platform dependent UI"));
                     95:     return 1;
                     96:   }
                     97:   return 0;
                     98: }
                     99: 
                    100: void ui_printlog(void)
                    101: {
                    102:   unsigned int i;
                    103:   char *p;
                    104: 
                    105:   printf("**** Last lines logged:\n");
                    106:   for (i = ui_logline; i < (UI_LOGLINES+ui_logline); i++) {
                    107:     p = ui_loglines[(i < UI_LOGLINES) ? i : (i-UI_LOGLINES)];
                    108:     if (*p)
                    109:       printf("%s\n", p);
                    110:   }
                    111:   printf("**** END\n");
                    112: }
                    113: 
                    114: void ui_exithandler(void)
                    115: {
                    116:   if (ui_vga)
                    117:     uip_textmode();
                    118:   ui_vga = 0;
                    119:   ui_printlog();
                    120: }
                    121: 
                    122: void ui_final(void)
                    123: {
                    124:   if (ui_vga)
                    125:     uip_textmode();
                    126:   ui_vga = 0;
                    127:   ui_printlog();
                    128: }
                    129: 
                    130: /*** ui_drawbox - plot a box ***/
                    131: 
                    132: void ui_drawbox(uint16 colour, uint16 x, uint16 y, uint16 width,
                    133:                uint16 height)
                    134: {
                    135:   uint16 *p, *q;
                    136:   unsigned int i;
                    137: 
                    138:   p = (uint16 *)(ui_uipinfo.screenmem_w+y*ui_uipinfo.linewidth+x*2);
                    139:   q = (uint16 *)((uint8 *)p+(height-1)*ui_uipinfo.linewidth);
                    140:   for (i = 0; i < width; i++)
                    141:     *p++ = *q++ = colour;
                    142:   p = (uint16 *)(ui_uipinfo.screenmem_w+y*ui_uipinfo.linewidth+x*2);
                    143:   for (i = 0; i < height; i++) {
                    144:     p[0] = colour;
                    145:     p[width-1] = colour;
                    146:     p = (uint16 *)((uint8 *)p+ui_uipinfo.linewidth);
                    147:   }
                    148: }
                    149: 
                    150: /*** ui_unpackfont - unpack the font file ***/
                    151: 
                    152: int ui_unpackfont(void)
                    153: {
                    154:   unsigned int c, y, x;
                    155:   unsigned char packed;
                    156:   uint16 *cdata;
                    157: 
                    158:   if ((ui_font = malloc(128*6*10*2)) == NULL) /* 128 chars, 6x, 10y, 16bit */
                    159:     return -1;
                    160:   for (c = 0; c < 128; c++) { /* 128 characters */
                    161:     cdata = ui_font+c*6*10;
                    162:     for (y = 0; y < 10; y++) { /* 10 pixels height */
                    163:       packed = generator_font[c*10+y];
                    164:       for (x = 0; x < 6; x++) { /* 6 pixels width */
                    165:        *cdata++ = (packed & 1<<(7-x)) ? 0xffff : 0;
                    166:       }
                    167:     }
                    168:   }
                    169:   return 0;
                    170: }
                    171:   
                    172: /*** ui_plotint2 - plot a 2-char wide integer ***/
                    173: 
                    174: uint16 ui_plotint2(uint8 num, uint16 xpos, uint16 ypos)
                    175: {
                    176:   char buf[3];
                    177: 
                    178:   buf[0] = '0' + (num / 10) % 10;
                    179:   buf[1] = '0' + (num % 10);
                    180:   buf[2] = '\0';
                    181:   return ui_plotstring(buf, xpos, ypos);
                    182: }
                    183: 
                    184: /*** ui_plotstring - plot a string ***/
                    185: 
                    186: uint16 ui_plotstring(const char *text, uint16 xpos, uint16 ypos)
                    187: {
                    188:   const unsigned char *p;
                    189:   const uint16 *cdata;
                    190:   unsigned int x,y;
                    191:   uint16 *scr;
                    192: 
                    193:   for (p = text; *p; p++) {
                    194:     if (*p > 128)
                    195:       cdata = ui_font+'.'*6*10;
                    196:     else
                    197:       cdata = ui_font+(*p)*6*10;
                    198:     for (y = 0; y < 10; y++) {
                    199:       scr = (uint16 *)(ui_uipinfo.screenmem_w+(ypos+y)*ui_uipinfo.linewidth
                    200:                       +xpos*2);
                    201:       for (x = 0; x < 6; x++)
                    202:         *scr++ = *cdata++;
                    203:     }
                    204:     xpos+= 6;
                    205:   }
                    206:   return xpos;
                    207: }
                    208: 
                    209: /*** ui_plotsprite - plot a sprite ***/
                    210: 
                    211: void ui_plotsprite_acorn(uint16 *logo, uint16 width, uint16 height,
                    212:                         uint16 x, uint16 y)
                    213: {
                    214:   uint16 a, b;
                    215:   uint16 *p, *q;
                    216:   uint16 word;
                    217:   uint8 red, green, blue;
                    218: 
                    219:   for (b = 0; b < height; b++) {
                    220:     p = (uint16 *)(ui_uipinfo.screenmem_w+(y+b)*ui_uipinfo.linewidth+x*2);
                    221:     for (a = 0; a < width; a++) {
                    222:       word = (((uint8 *)logo)[1]<<8) | ((uint8 *)logo)[0];
                    223:       green = (word>>5) & 0x1f;
                    224:       red = word & 0x1f;
                    225:       blue = (word>>10) & 0x1f;
                    226:       *p++ = red<<ui_uipinfo.redshift | green<<ui_uipinfo.greenshift | 
                    227:        blue<<ui_uipinfo.blueshift;
                    228:       logo++;
                    229:     }
                    230:   }
                    231: }
                    232: 
                    233: /*** ui_setupscreen - plot borders and stuff ***/
                    234: 
                    235: void ui_setupscreen(void)
                    236: {
                    237:   uint16 grey = 24<<ui_uipinfo.redshift | 24<<ui_uipinfo.greenshift |
                    238:     24<<ui_uipinfo.blueshift;
                    239:   uint16 red = 24<<ui_uipinfo.redshift;
                    240: 
                    241:   ui_drawbox(red, 140, 100, 360, 280);
                    242:   ui_drawbox(grey, 141, 101, 358, 278);
                    243:   if (!ui_info)
                    244:     return;
                    245:   ui_plotsprite_acorn((uint16 *)logo, 282, 40, 179, 80);
                    246:   ui_plotsprite_acorn((uint16 *)logo, 282, 40, 179, 360);
                    247:   ui_drawbox(red, 0, 415, 640, 1);
                    248:   ui_drawbox(grey, 0, 416, 640, 1);
                    249:   ui_drawbox(red, 0, 65, 640, 1);
                    250:   ui_drawbox(grey, 0, 66, 640, 1);
                    251:   ;
                    252:   /* draw marker for 320x224 box */
                    253:   // ui_drawbox(grey, 160, 128, 320, 224);
                    254:   /* draw marker for 320x240 box */
                    255:   // ui_drawbox(grey, 160, 120, 320, 240);
                    256:   /* draw marker for 256x224 box */
                    257:   // ui_drawbox(grey, 192, 128, 256, 224);
                    258:   /* draw marker for 256x240 box */
                    259:   // ui_drawbox(grey, 192, 120, 256, 240);
                    260:   ;
                    261:   ui_plotstring("Generator is (c) James Ponder 1997-2000, "
                    262:                "all rights reserved.", 0, 0);
                    263:   ui_plotstring(VERSTRING, 640-(strlen(VERSTRING)*6), 0);
                    264:   ;
                    265:   ui_plotstring("[A]       A button", 0, 420);
                    266:   ui_plotstring("[S]       B button", 0, 430);
                    267:   ui_plotstring("[D]       C button", 0, 440);
                    268:   ui_plotstring("[RETURN]  Start",    0, 450);
                    269:   ui_plotstring("[ARROWS]  D-pad",    0, 460);
                    270:   ui_plotstring("[ESCAPE]  QUIT",     0, 470);
                    271:   ;
                    272:   ui_plotstring("FPS:  00", 120, 420);
                    273:   ui_plotstring("Skip: 00", 120, 430);
                    274:   ui_plotstring(":", 622, 470);
                    275:   ;
                    276:   ui_plotstring("[F5] Toggle info:", 0, 20);
                    277:   ui_plotstring("[F6] Toggle video:", 0, 30);
                    278:   ui_plotstring("[F7] Toggle country:", 0, 40);
                    279:   ui_plotstring("[F8] Toggle plotter:", 0, 50);
                    280:   ui_plotstring("[F9] Toggle vsync:", 216, 20);
                    281:   ui_plotstring("[F12] Restart game", 216, 50);
                    282:   ;
                    283:   ui_plotstring("[1] B lo:", 64*6, 20);
                    284:   ui_plotstring("[2] B hi:", 64*6, 30);
                    285:   ui_plotstring("[3] A lo:", 64*6, 40);
                    286:   ui_plotstring("[4] A hi:", 64*6, 50);
                    287:   ui_plotstring("[5] W lo:", 78*6, 20);
                    288:   ui_plotstring("[6] W hi:", 78*6, 30);
                    289:   ui_plotstring("[7] H:   ", 78*6, 40);
                    290:   ui_plotstring("[8] S lo:", 92*6, 20);
                    291:   ui_plotstring("[9] S hi:", 92*6, 30);
                    292:   ;
                    293:   ui_plotsettings();
                    294:   ;
                    295:   sprintf(bigbuffer, "%s %X %s", gen_cartinfo.version,
                    296:          gen_cartinfo.checksum, gen_cartinfo.country);
                    297:   ui_plotstring(bigbuffer, 216, 420);
                    298:   ui_plotstring(gen_cartinfo.name_domestic, 216, 430);
                    299:   ui_plotstring(gen_cartinfo.name_overseas, 216, 440);
                    300: }
                    301: 
                    302: void ui_plotsettings(void)
                    303: {
                    304:   ui_plotstring(ui_info ? "On " : "Off", 126, 20);
                    305:   ui_plotstring(vdp_pal ? "Pal " : "NTSC", 126, 30);
                    306:   ui_plotstring(vdp_overseas ? "USA/Europe" : "Japan     ", 126, 40);
                    307:   ui_plotstring(ui_vdpsimple ? "Cell (fast)  " : "Raster (slow)", 126, 50);
                    308:   ui_plotstring(ui_vsync ? "On " : "Off", 342, 20);
                    309:   ;
                    310:   ui_plotstring(vdp_layerB  ? "On " : "Off", (64+10)*6, 20);
                    311:   ui_plotstring(vdp_layerBp ? "On " : "Off", (64+10)*6, 30);
                    312:   ui_plotstring(vdp_layerA  ? "On " : "Off", (64+10)*6, 40);
                    313:   ui_plotstring(vdp_layerAp ? "On " : "Off", (64+10)*6, 50);
                    314:   ui_plotstring(vdp_layerW  ? "On " : "Off", (78+10)*6, 20);
                    315:   ui_plotstring(vdp_layerWp ? "On " : "Off", (78+10)*6, 30);
                    316:   ui_plotstring(vdp_layerH  ? "On " : "Off", (78+10)*6, 40);
                    317:   ui_plotstring(vdp_layerS  ? "On " : "Off", (92+10)*6, 20);
                    318:   ui_plotstring(vdp_layerSp ? "On " : "Off", (92+10)*6, 30);
                    319: }
                    320: 
                    321: /*** ui_loop - main UI loop ***/
                    322: 
                    323: int ui_loop(void)
                    324: {
                    325:   char *p;
                    326: 
                    327:   if (ui_initload) {
                    328:     p = gen_loadimage(ui_initload);
                    329:     if (p) {
                    330:       LOG_CRITICAL(("Failed to load ROM image: %s", p));
                    331:       return 1;
                    332:     }
                    333:     ui_state = 2;
                    334:   } else {
                    335:     LOG_CRITICAL(("You must specify a ROM to load"));
                    336:     return 1;
                    337:   }
                    338:   if (uip_vgamode()) {
                    339:     LOG_CRITICAL(("Failed to start VGA mode"));
                    340:     return 1;
                    341:   }
                    342:   gen_quit = 0;
                    343:   while(!uip_checkkeyboard()) {
                    344:     switch(ui_state) {
                    345:     case 0: /* stopped */
                    346:       break;
                    347:     case 1: /* paused */
                    348:       break;
                    349:     case 2: /* playing */
                    350:       ui_newframe();
                    351:       reg68k_framestep();
                    352:       break;
                    353:     }
                    354:   }
                    355:   return 0;
                    356: }
                    357: 
                    358: void ui_newframe(void)
                    359: {
                    360:   static int hmode = 0;
                    361:   static int skipcount = 0;
                    362:   static char frameplots[60]; /* 60 for NTSC, 50 for PAL */
                    363:   static unsigned int frameplots_i = 0;
                    364:   char buf[8];
                    365:   unsigned int i;
                    366:   int fps;
                    367:   time_t t = time(NULL);
                    368:   struct tm *tm_p = localtime(&t);
                    369: 
                    370:   if (frameplots_i > vdp_framerate)
                    371:     frameplots_i = 0;
                    372:   ui_plotframe = 0;
                    373:   if (ui_frameskip == 0) {
                    374:     if (sound_feedback != -1)
                    375:       ui_plotframe = 1;
                    376:   } else {
                    377:     if (cpu68k_frames % ui_frameskip == 0)
                    378:       ui_plotframe = 1;
                    379:   }
                    380:   if (!ui_plotframe) {
                    381:     skipcount++;
                    382:     frameplots[frameplots_i++] = 0;
                    383:     return;
                    384:   }
                    385:   if (hmode != (vdp_reg[12]&1))
                    386:     ui_clearnext = 2;
                    387:   if (ui_clearnext) {
                    388:     /* horizontal size has changed, so clear whole screen and setup
                    389:        borders etc again */
                    390:     ui_clearnext--;
                    391:     hmode = vdp_reg[12]&1;
                    392:     uip_clearscreen();
                    393:     ui_setupscreen();
                    394:   }
                    395:   /* count the frames we've plotted in the last vdp_framerate real frames */
                    396:   fps = 0;
                    397:   for (i = 0; i < vdp_framerate; i++) {
                    398:     if (frameplots[i])
                    399:       fps++;
                    400:   }
                    401:   frameplots[frameplots_i++] = 1;
                    402:   if (!ui_info)
                    403:     return;
                    404:   ui_plotint2(fps, 156, 420);
                    405:   ui_plotint2(skipcount+1, 156, 430);
                    406:   skipcount = 0;
                    407:   ui_plotint2(tm_p->tm_hour, 610, 470);
                    408:   ui_plotint2(tm_p->tm_min, 628, 470);
                    409: }
                    410: 
                    411: void ui_checkpalcache(int flag)
                    412: {
                    413:   uint32 pal;
                    414:   unsigned int col;
                    415:   uint8 *p;
                    416: 
                    417:   /* this code requires that there be at least 4 bits per colour, that
                    418:      is, three bits that come from the console's palette, and one more bit
                    419:      when we do a dim or bright colour, i.e. this code works with 12bpp
                    420:      upwards */
                    421: 
                    422:   /* this code assumes 5 bits per colour in it's calculations */
                    423: 
                    424:   /* the flag forces it to do the check despite the vdp_cramf buffer */
                    425: 
                    426:   for (col = 0; col < 64; col++) {
                    427:     if (!flag && !vdp_cramf[col])
                    428:       continue;
                    429:     vdp_cramf[col] = 0;
                    430:     p = (uint8 *)vdp_cram+2*col;
                    431:     ui_palcache[col] = /* normal */
                    432:       (p[0]&0xE)<<(ui_uipinfo.blueshift+1) |
                    433:       (p[1]&0xE)<<(ui_uipinfo.redshift+1) |
                    434:       ((p[1]&0xE0)>>4)<<(ui_uipinfo.greenshift+1);
                    435:     ui_palcache[col+64] = /* hilight */
                    436:       (p[0]&0xE)<<ui_uipinfo.blueshift |
                    437:       (p[1]&0xE)<<ui_uipinfo.redshift |
                    438:       ((p[1]&0xE0)>>4)<<ui_uipinfo.greenshift |
                    439:       (16 << ui_uipinfo.blueshift) | (16 << ui_uipinfo.redshift) |
                    440:       (16 << ui_uipinfo.greenshift);
                    441:     ui_palcache[col+128] = /* shadow */
                    442:       (p[0]&0xE)<<ui_uipinfo.blueshift |
                    443:       (p[1]&0xE)<<ui_uipinfo.redshift |
                    444:       ((p[1]&0xE0)>>4)<<ui_uipinfo.greenshift;
                    445:   }
                    446: }
                    447: 
                    448: /*** ui_convertdata - convert genesis data to 16 bit colour */
                    449: 
                    450: void ui_convertdata(uint8 *indata, uint8 *outdata, unsigned int pixels)
                    451: {
                    452:   unsigned int ui;
                    453:   uint32 data;
                    454: 
                    455:   ui_checkpalcache(0);
                    456:   /* not scaled, 16bpp */
                    457:   for (ui = 0; ui < pixels; ui++) {
                    458:     data = ui_palcache[indata[ui]];
                    459:     ((uint16 *)outdata)[ui] = data; /* already in local endian */
                    460:   }
                    461: }
                    462: 
                    463: /*** ui_line - it is time to render a line ***/
                    464: 
                    465: void ui_line(unsigned int line)
                    466: {  
                    467:   static uint8 gfx[320];
                    468:   uint16 *scr;
                    469: 
                    470:   if (ui_plotframe && !ui_vdpsimple) {
                    471:     if (((vdp_reg[12]>>1) & 3) == 3)
                    472:       vdp_renderline_interlace2(line*2+vdp_oddframe, (uint8 *)gfx);
                    473:     else
                    474:       vdp_renderline(line, (uint8 *)gfx);
                    475:     ui_convertdata(gfx, (ui_uipinfo.screenmem_w+320+((vdp_reg[12]&1)?0:64)+
                    476:                          ui_uipinfo.linewidth*(120+line+
                    477:                                               ((vdp_reg[1]&1<<3)?0:8))),
                    478:                    (vdp_reg[12]&1)?320:256);
                    479:   }
                    480: }
                    481: 
                    482: /*** ui_endfield - end of field reached ***/
                    483: 
                    484: void ui_endfield(void)
                    485: {
                    486:   ui_endframe();
                    487: }
                    488: 
                    489: /*** ui_endframe - end of frame reached ***/
                    490: 
                    491: void ui_endframe(void)
                    492: {
                    493:   static uint8 gfx[(320+16)*(240+16)];
                    494:   static int counter = 0;
                    495:   unsigned int line;
                    496:   uint16 *scr;
                    497: 
                    498:   if (ui_plotframe) {
                    499:     if (ui_vdpsimple) {
                    500:       /* cell mode - entire frame done here */
                    501:       vdp_renderframe(gfx+(8*(320+16))+8, 320+16); /* plot frame */
                    502:       for (line = 0; line < vdp_vislines; line++) {
                    503:         ui_convertdata(gfx+8+(line+8)*(320+16),
                    504:                        (ui_uipinfo.screenmem_w+320+((vdp_reg[12]&1)?0:64)+
                    505:                          ui_uipinfo.linewidth*(120+line+
                    506:                                               ((vdp_reg[1]&1<<3)?0:8))),
                    507:                        (vdp_reg[12]&1)?320:256);
                    508:       }
                    509:     }
                    510:     uip_displaybank(-1);
                    511:     if (ui_vsync)
                    512:       uip_vsync();
                    513:   }
                    514:   if (ui_frameskip == 0) {
                    515:     counter++;
                    516:     if (sound_feedback >= 0) {
                    517:       ui_actualskip = counter;
                    518:       counter = 0;
                    519:     }
                    520:   } else {
                    521:     ui_actualskip = ui_frameskip;
                    522:   }
                    523: }
                    524: 
                    525: /*** logging functions ***/
                    526: 
                    527: /* logging is done this way because this was the best I could come up with
                    528:    whilst battling with macros that can only take fixed numbers of arguments */
                    529: 
                    530: #define LOG_FUNC(name,level,txt) void ui_log_ ## name ## (const char *text, ...) \
                    531: { \
                    532:   va_list ap; \
                    533:   char *ll = ui_loglines[ui_logline]; \
                    534:   char *p = bigbuffer; \
                    535:   if (gen_loglevel >= level) { \
                    536:     p+= sprintf(p, "%d ", ui_logcount++); \
                    537:     p+= sprintf(p, txt); \
                    538:     va_start(ap, text); \
                    539:     vsprintf(p, text, ap); \
                    540:     va_end(ap); \
                    541:     strncpy(ll, bigbuffer, UI_LOGLINESIZE); \
                    542:     if (++ui_logline >= UI_LOGLINES) \
                    543:       ui_logline = 0; \
                    544:   } \
                    545: }
                    546: 
                    547: LOG_FUNC(debug3,   7, "DEBG ");
                    548: LOG_FUNC(debug2,   6, "DEBG ");
                    549: LOG_FUNC(debug1,   5, "DEBG ");
                    550: LOG_FUNC(user,     4, "USER ");
                    551: LOG_FUNC(verbose,  3, "---- ");
                    552: LOG_FUNC(normal,   2, "---- ");
                    553: LOG_FUNC(critical, 1, "CRIT ");
                    554: LOG_FUNC(request,  0, "---- ");
                    555: 
                    556: /*** ui_err - log error message and quit ***/
                    557: 
                    558: void ui_err(const char *text, ...)
                    559: {
                    560:   va_list ap;
                    561:   char *ll = ui_loglines[ui_logline];
                    562:   char *p = bigbuffer;
                    563: 
                    564:   p+= sprintf(p, "ERROR: ");
                    565:   va_start(ap, text);
                    566:   vsprintf(p, text, ap);
                    567:   va_end(ap);
                    568:   strncpy(ll, bigbuffer, UI_LOGLINESIZE);
                    569:   if (++ui_logline >= UI_LOGLINES)
                    570:     ui_logline = 0;
                    571:   ui_printlog();
                    572:   exit(0); /* don't exit(1) because windows makes an error then! */
                    573: }
                    574: 
                    575: /*** ui_setinfo - there is new cart information ***/
                    576: 
                    577: char *ui_setinfo(t_cartinfo *cartinfo)
                    578: {
                    579:   return NULL;
                    580: }
                    581: 
                    582: /*** ui_topbit - given an integer return the top most bit set ***/
                    583: 
                    584: int ui_topbit(unsigned long int bits)
                    585: {
                    586:   long int bit = 31;
                    587:   unsigned long int mask = 1<<31;
                    588: 
                    589:   for (; bit >= 0; bit--, mask>>= 1) {
                    590:     if (bits & mask)
                    591:       return bit;
                    592:   }
                    593:   return -1;
                    594: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.