Because LC can't do two things at once.

Peter M. Brigham pmbrig at
Sat Feb 21 17:03:24 CET 2015

On Feb 21, 2015, at 2:59 AM, Richard Gaskin wrote:

> Peter M. Brigham wrote:
>> Just out of curiosity, how *would* you do this via shell call or
>> the equivalent on a Windows laptop?
> Good question.
> Thanks to the beautiful simplicity of the Linux /proc directory I was able to find:
> cat /proc/acpi/battery/BAT1/state
> The "charging state" field there will contain "charging" or "discharging".
> Now if we can turn up a Win command line solution I'll write a handler for this that'll make it convenient to get this info on all three platforms.

That was my thought too. I was waiting for more info, but I started with the handler(s) below. I don't speak Regex so I converted that line to use a native LC function instead, getNestedItem() -- from your function posted here several months ago, Richard, called nDepth(). I use this so often that its now an essential part of my library. It's much more comprehensible to me than Regex, though it can't do everything Regex can. So the quantity of code below is really mostly utility handlers and the basic getMacPowerSource() is very compact, as was the original.

I'll leave the other platforms to you, Richard. (If you use Regex, I'll translate it!   :-)  )

> Martin, thanks for handling the Mac side - nice work.

Yes, thanks!

-- Peter

Peter M. Brigham
pmbrig at


function getMacPowerSource
  -- returns the current power source for a Mac
  --    "AC" or "Battery"
  -- requires getNestedItem() getItem(), getDelimiters()
  put shell ("pmset -g batt") into tSource
  -- returns something like:
  --    Currently drawing from 'AC Power'
  --    -InternalBattery-0	99%; finishing charge; 0:00 remaining
  return getNestedItem(tSource,2,"'",1,space)
end getMacPowerSource

function getNestedItem
  -- allows specifying different delimiters to extract nested chunks
  --    getNestedItem(tData,index1,delim1,index2,delim2,...)
  -- eg, put "aaa,bbb,ccc*ddd*eee*fff,ggg,hhh" into tData
  --     put getNestedItem(tData,3,comma,2,"*") -> "ddd"
  --        *-delim item 2 of comma-delim item 3
  -- specified delimiters can be strings, not just single characters,
  -- so the following extracts the top-level domain name from a URL:
  --    put "" into tURL
  --    put getNestedItem(tURL,2,"://",1,"/") ->
  -- based on a function by Richard Gaskin, use-LC list, originally named nDepth()
  --    debugged by members of the use-LC list,
  --    expanded by Peter M. Brigham, pmbrig at
  -- the result is a very versatile tool for extracting strings from any text
  --    with a known structure
  -- requires getItem(), getDelimiters()

  put paramcount() into prmCount
  if prmCount mod 2 <> 1 or prmCount = 1 then
     return "getNestedItem(): error in parameters."
  end if
  put param(1) into workingString
  repeat with i = 2 to prmCount-1 step 2
     if workingString = empty then return empty
     put param(i) into pItemNbr
     put param(i+1) into tDelim
     put getItem(workingString,pItemNbr,tDelim) into workingString
  end repeat
  return workingString
end getNestedItem

function getItem pList, pIndex, pDelim
  -- returns item # pIndex of pList, given itemdelimiter = pDelim
  -- could just "get item pIndex of pList" in the calling handler but
  --    then have to set and restore the itemDelimiter, so this is less hassle
  -- defaults to pDelim = tab
  -- allows pDelim to be a string of characters
  --    so you could do this:
  --    getItem("a//b//c//d//e//f",4,"//") -> d
  -- also allows pIndex to be a range, eg "3-5"
  --    in that case enclose the range in quotes
  -- by Peter M. Brigham, pmbrig at — freeware
  -- requires getDelimiters()

  if pDelim = empty then put tab into pDelim
  if len(pDelim) > 1 then
     put getDelimiters(pList) into tempDel
     if tempDel begins with "Error" then
        return "Error in getDelimiters()"
     end if
     put pDelim into tempDel
  end if
  replace pDelim with tempDel in pList
  set the itemdelimiter to tempDel
  put offset("-",pIndex) into dashPos
  if dashPos > 1 then
     -- don't catch if pIndex is something like -1, -2, etc
     put char 1 to dashPos-1 of pIndex into tStart
     put char dashPos+1 to -1 of pIndex into tEnd
     put item tStart to tEnd of pList into theItem
     replace tempDel with pDelim in theItem
     put item pIndex of pList into theItem
  end if
  return theItem
end getItem

function getDelimiters pText, nbr
  -- returns a cr-delimited list of <nbr> characters
  --    not found in the variable pText
  -- use for delimiters for, eg, parsing text files, loading arrays, etc.
  -- usage: put getDelimiters(pText,2) into tDelims
  --        if tDelims begins with "Error" then exit to top -- or whatever
  --        put line 1 of tDelims into lineDivider
  --        put line 2 of tDelims into itemDivider
  --             etc.
  -- by Peter M. Brigham, pmbrig at — freeware

  if pText = empty then return "Error: no text specified."
  if nbr = empty then put 1 into nbr -- default 1 delimiter
  put "2,3,4,5,6,7,8,16,17,18,19,20,21,22,23,24,25,26" into baseList
  -- low ASCII values, excluding CR, LF, tab, etc.
  put the number of items of baseList into maxNbr
  if nbr > maxNbr then return "Error: max" && maxNbr && "delimiters."
  repeat with tCount = 1 to nbr
     put true into failed
     repeat with i = 1 to the number of items of baseList
        put item i of baseList into testNbr
        put numtochar(testNbr) into testChar
        if testChar is not in pText then
           -- found one, store and get next delim
           put false into failed
           put testChar into line tCount of delimList
           exit repeat
        end if
     end repeat
     if failed then
        if tCount = 0 then
           return "Error: cannot get any delimiters."
        else if tCount = 1 then
           return "Error: can only get one delimiter."
           return "Error: can only get" && tCount && "delimiters."
        end if
     end if
     delete item i of baseList
  end repeat
  return delimList
end getDelimiters


More information about the use-livecode mailing list