home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 364b.lha / PCQ_v1.1 / Runtime / PCQ / StringLib.asm < prev    next >
Encoding:
Assembly Source File  |  1990-04-08  |  5.0 KB  |  416 lines

  1. *
  2. *    Strings.asm of PCQ Pascal
  3. *    Copyright 1989 Patrick Quaid
  4. *
  5. *    Since PCQ strings are similar to C strings, these
  6. *    routines are similar in operation and name to the
  7. *    standard C stuff.
  8. *
  9.  
  10.     XREF    _p%new
  11.     XREF    _p%dispose
  12.  
  13.     SECTION    StringLib,CODE
  14.  
  15.     XDEF    _isupper
  16. _isupper
  17.     move.w    4(sp),d0
  18. isup_    cmp.b    #'A',d0
  19.     blt.s    1$
  20.     cmp.b    #'Z',d0
  21.     bgt.s    1$
  22.     move.b    #-1,d0
  23.     rts
  24. 1$
  25.     moveq    #0,d0
  26.     rts
  27.  
  28.     XDEF    _islower
  29. _islower
  30.     move.w    4(sp),d0
  31. islo_    cmp.b    #'a',d0
  32.     blt.s    1$
  33.     cmp.b    #'z',d0
  34.     bgt.s    1$
  35.     move.b    #-1,d0
  36.     rts
  37. 1$
  38.     moveq    #0,d0
  39.     rts
  40.  
  41.     XDEF    _isalpha
  42. _isalpha
  43.     move.w    4(sp),d0
  44.     bsr    isup_
  45.     tst.b    d0
  46.     bne.s    1$
  47.     move.w    4(sp),d0
  48.     bsr    islo_
  49. 1$    rts
  50.  
  51.     XDEF    _isdigit
  52. _isdigit
  53.     move.w    4(sp),d0
  54. isdig_    cmp.b    #'0',d0
  55.     blt.s    1$
  56.     cmp.b    #'9',d0
  57.     bgt.s    1$
  58.     move.b    #-1,d0
  59.     rts
  60. 1$
  61.     moveq    #0,d0
  62.     rts
  63.  
  64.     XDEF    _isalnum
  65. _isalnum
  66.     move.w    4(sp),d0
  67.     move.w    d0,-(sp)
  68.     bsr    _isalpha
  69.     addq.l    #2,sp
  70.     tst.b    d0
  71.     bne.s    1$
  72.     move.w    4(sp),d0
  73.     bsr    isdig_
  74. 1$    rts
  75.  
  76.     XDEF    _isspace
  77. _isspace
  78.     move.w    4(sp),d0
  79.     cmp.b    #' ',d0
  80.     beq.s    1$
  81.     cmp.b    #10,d0
  82.     beq.s    1$
  83.     cmp.b    #13,d0
  84.     beq.s    1$
  85.     cmp.b    #9,d0
  86.     beq.s    1$
  87.     cmp.b    #12,d0
  88.     beq.s    1$
  89.     moveq    #0,d0
  90.     rts
  91. 1$
  92.     move.b    #-1,d0
  93.     rts
  94.  
  95.     XDEF    _toupper
  96. _toupper
  97.     move.w    4(sp),d0
  98. toup_    cmp.b    #'a',d0
  99.     blt.s    1$
  100.     cmp.b    #'z',d0
  101.     bgt.s    1$
  102.     and.b    #%11011111,d0
  103. 1$    rts
  104.  
  105.     XDEF    _tolower
  106. _tolower
  107.     move.w    4(sp),d0
  108. tolo_    cmp.b    #'A',d0
  109.     blt.s    1$
  110.     cmp.b    #'Z',d0
  111.     bgt.s    1$
  112.     or.b    #%00100000,d0
  113. 1$    rts
  114.  
  115.     XDEF    _streq
  116. _streq:
  117.     move.l    4(sp),a1
  118.     move.l    8(sp),a0
  119. 1$:
  120.     move.b    (a1)+,d1
  121.     move.b    (a0)+,d0
  122.     cmp.b    d0,d1
  123.     bne.s    2$
  124.     tst.b    d1
  125.     bne    1$
  126.     moveq    #-1,d0
  127.     rts
  128. 2$:
  129.     moveq    #0,d0
  130.     rts
  131.  
  132.     XDEF    _strieq
  133. _strieq:
  134.     move.l    4(sp),a1
  135.     move.l    8(sp),a0
  136. 1$:
  137.     move.b    (a1)+,d0
  138.     bsr    toup_
  139.     move.b    d0,d1
  140.     move.b    (a0)+,d0
  141.     bsr    toup_
  142.     cmp.b    d0,d1
  143.     bne.s    2$
  144.     tst.b    d1
  145.     bne    1$
  146.     moveq    #-1,d0
  147.     rts
  148. 2$:
  149.     moveq    #0,d0
  150.     rts
  151.  
  152.     XDEF    _strneq
  153. _strneq:
  154.     move.l    6(sp),a1
  155.     move.l    10(sp),a0
  156. 1$:
  157.     move.b    (a1)+,d1
  158.     move.b    (a0)+,d0
  159.     cmp.b    d0,d1
  160.     bne.s    2$
  161.     subq.w    #1,4(sp)
  162.     beq.s    3$
  163.     tst.b    d1
  164.     bne    1$
  165. 3$    moveq    #-1,d0
  166.     rts
  167. 2$:
  168.     moveq    #0,d0
  169.     rts
  170.  
  171.     XDEF    _strnieq
  172. _strnieq
  173.     move.l    6(sp),a1
  174.     move.l    10(sp),a0
  175. 1$:
  176.     move.b    (a1)+,d0
  177.     bsr    toup_
  178.     move.b    d0,d1
  179.     move.b    (a0)+,d0
  180.     bsr    toup_
  181.     cmp.b    d0,d1
  182.     bne.s    2$
  183.     tst.b    d1
  184.     beq.s    3$
  185.     subq.w    #1,4(sp)
  186.     bgt.s    1$
  187. 3$    moveq    #-1,d0
  188.     rts
  189. 2$:
  190.     moveq    #0,d0
  191.     rts
  192.  
  193.     XDEF    _strcmp
  194. _strcmp:
  195.     move.l    4(sp),a1
  196.     move.l    8(sp),a0
  197. 1$:
  198.     move.b    (a0)+,d0
  199.     move.b    (a1)+,d1
  200.     cmp.b    d1,d0
  201.     bne.s    2$
  202.     tst.b    d0
  203.     bne.s    1$
  204. 2$    sub.b    d1,d0
  205.     ext.w    d0
  206.     ext.l    d0
  207.     rts
  208.  
  209.     XDEF    _stricmp
  210. _stricmp:
  211.     move.l    4(sp),a1
  212.     move.l    8(sp),a0
  213. 1$:
  214.     move.b    (a0)+,d0
  215.     bsr    toup_
  216.     move.b    d0,d1
  217.     move.b    (a1)+,d0
  218.     bsr    toup_
  219.     cmp.b    d0,d1
  220.     bne.s    2$
  221.     tst.b    d0
  222.     bne.s    1$
  223. 2$    sub.b    d1,d0
  224.     neg.b    d0
  225.     ext.w    d0
  226.     ext.l    d0
  227.     rts
  228.  
  229.     XDEF    _strncmp
  230. _strncmp:
  231.     move.l    6(sp),a1
  232.     move.l    10(sp),a0
  233. 1$:
  234.     move.b    (a0)+,d0
  235.     move.b    (a1)+,d1
  236.     cmp.b    d1,d0
  237.     bne.s    2$
  238.     subq.w    #1,4(sp)
  239.     beq.s    2$
  240.     tst.b    d0
  241.     bne.s    1$
  242. 2$    sub.b    d1,d0
  243.     ext.w    d0
  244.     ext.l    d0
  245.     rts
  246.  
  247.     XDEF    _strnicmp
  248. _strnicmp:
  249.     move.l    6(sp),a1
  250.     move.l    10(sp),a0
  251. 1$:
  252.     move.b    (a0)+,d0
  253.     bsr    toup_
  254.     move.b    d0,d1
  255.     move.b    (a1)+,d0
  256.     bsr    toup_
  257.     cmp.b    d0,d1
  258.     bne.s    2$
  259.     subq.w    #1,4(sp)
  260.     beq.s    2$
  261.     tst.b    d0
  262.     bne.s    1$
  263. 2$    sub.b    d1,d0
  264.     neg.b    d0
  265.     ext.w    d0
  266.     ext.l    d0
  267.     rts
  268.  
  269.     XDEF    _strlen
  270. _strlen:
  271.     move.l    4(sp),d1
  272.     move.l    d1,a0
  273. _in_strlen
  274.     tst.b    (a0)+
  275.     bne.s    _in_strlen
  276.     move.l    a0,d0
  277.     sub.l    d1,d0
  278.     subq    #1,d0
  279.     rts
  280.  
  281.     XDEF    _strcpy
  282. _strcpy
  283.     move.l    8(sp),a1
  284.     move.l    4(sp),a0
  285. 1$
  286.     move.b    (a0)+,d0
  287.     move.b    d0,(a1)+
  288.     bne    1$
  289.     rts
  290.  
  291.     XDEF    _strncpy
  292. _strncpy
  293.     move.l    10(sp),a0
  294.     move.l    6(sp),a1
  295. 1$
  296.     move.b    (a1)+,d0
  297.     move.b    d0,(a0)+
  298.     beq.s    2$
  299.     subq.w    #1,4(sp)
  300.     bne.s    1$
  301.     move.b    #0,(a0)
  302. 2$    rts
  303.  
  304.     XDEF    _strcat
  305. _strcat
  306.     move.l    8(sp),a0
  307.     move.l    4(sp),a1
  308. 1$    move.b    (a0)+,d0
  309.     bne    1$
  310.     subq.l    #1,a0
  311. 2$    move.b    (a1)+,d0
  312.     move.b    d0,(a0)+
  313.     bne    2$
  314.     rts
  315.  
  316.     XDEF    _strncat
  317. _strncat
  318.     move.l    10(sp),a0
  319.     move.l    6(sp),a1
  320. 1$    tst.b    (a0)+
  321.     bne    1$
  322.     subq.l    #1,a0
  323. 2$    move.b    (a1)+,d0
  324.     move.b    d0,(a0)+
  325.     beq.s    3$
  326.     subq.w    #1,4(sp)
  327.     bne.s    2$
  328.     move.b    #0,(a0)
  329. 3$    rts
  330.  
  331.     XDEF    _strpos
  332. _strpos
  333.     move.l    6(sp),a0
  334.     move.w    4(sp),d0
  335. 1$    move.b    (a0)+,d1
  336.     beq.s    2$
  337.     cmp.b    d1,d0
  338.     bne.s    1$
  339.     subq.l    #1,a0
  340.     sub.l    6(sp),a0
  341.     move.l    a0,d0
  342.     rts
  343. 2$    move.l    #-1,d0
  344.     rts
  345.  
  346.     XDEF    _strrpos
  347. _strrpos
  348.     move.l    6(sp),a0
  349.     move.w    4(sp),d0
  350. 1$    tst.b    (a0)+
  351.     bne.s    1$
  352.     subq.l    #1,a0
  353. 2$    cmp.b    -(a0),d0
  354.     beq.s    3$
  355.     cmp.l    6(sp),a0
  356.     bne.s    2$
  357.     move.l    #-1,d0
  358.     rts
  359. 3$    sub.l    6(sp),a0
  360.     move.l    a0,d0
  361.     rts
  362.  
  363.     XDEF    _Hash
  364. _Hash
  365.     move.l    4(sp),-(sp)
  366.     jsr    _strlen
  367.     addq.l    #4,sp
  368.     move.l    4(sp),a0
  369.     moveq.l    #0,d1
  370. 1$
  371.     move.b    (a0)+,d1
  372.     beq.s    3$
  373.     cmp.b    #'a',d1
  374.     blt.s    2$
  375.     cmp.b    #'z',d1
  376.     bgt.s    2$
  377.     and.b    #%11011111,d1
  378. 2$    move.w    d0,d2        ; d2 := d0
  379.     lsl.w    #2,d2        ; d2 := d0 * 4
  380.     add.w    d2,d0        ; d0 := d0 + d0 * 4
  381.     lsl.w    #1,d2        ; d2 := d0 * 8
  382.     add.w    d2,d0        ; d0 := d0 * 13
  383.     add.w    d1,d0
  384.     and.w    #$07ff,d0
  385.     bra    1$
  386. 3$    rts
  387.     
  388.     XDEF    _AllocString
  389. _AllocString:
  390.     jsr    _p%new
  391.     rts
  392.  
  393.     XDEF    _FreeString
  394. _FreeString:
  395.     move.l    4(sp),d0
  396.     jsr    _p%dispose
  397.     rts
  398.  
  399.     XDEF    _strdup
  400. _strdup
  401.     move.l    4(sp),-(sp)    ; set up param
  402.     jsr    _strlen        ; get string's length
  403.     adda.l    #4,sp        ; fix stack
  404.     addq.l    #1,d0        ; add one for null byte
  405.     jsr    _p%new        ; try to allocate
  406.     beq.s    2$        ; if it failed, continue
  407.     move.l    d0,a1        ; get new mem address
  408.     move.l    4(sp),a0    ; and old string address
  409. 1$
  410.     move.b    (a0)+,d1    ; copy one byte
  411.     move.b    d1,(a1)+
  412.     bne    1$        ; if not finished, loop
  413. 2$    rts            ; return
  414.  
  415.     END
  416.